Для демонстрации небольшого объема кода (html, js, css), удобно пользовать онлайн редактором Jsfiddle.
У меня возникла мысль. Как вывести объяснения кода в виде информационных баннеров и озвучить их при помощи SpeechSynthesisUtterance
Мое решение подключить в консоли браузера хром: css, js и создать див с id=”info_mysmx” для отображения текста.
var link = document.createElement("link");
link.href = 'https://maxshevtsov.com/w/style.css';
link.rel = 'stylesheet';
document.head.appendChild(link);
g = document.createElement('div');
g.setAttribute("id", "info_mysmx");
document.body.appendChild(g);
var script = document.createElement("script");
script.src = 'https://maxshevtsov.com/w/script.js';
document.head.appendChild(script); 
Файл https://maxshevtsov.com/w/style.css содержит стили отображения окна
body{
font-family: Arial;
}
#info_mysmx{
display: none;
min-width: 200px;
border: 1px solid #00008B;
padding: 20px;
position: absolute;
left:calc(50% - 100px);
top:10px;
background-color: #00BFFF;
color: white;
font-size: 20px!important;
}
.show{
display: block!important;
}
.hide{
display: none;
}Файл https://maxshevtsov.com/w/script.js содержит управление листанием слайдеров посредством кнопок PageUp / PageDown и возврата на первый слайдер с помощью кнопки Home. А так же озвучивание при помощи SpeechSynthesisUtterance.
let text_mysmx = [
'Разберем простую html форму состоящую из html, css и javascript.',
'Html предназначен для создания сайтов в интернете и состоит из тегов, это как правило блоки имеющий открывающий тег например html и закрывающий /html.',
'Внутри тегов может быть расположен как текст так и другие теги.',
'Простая структура документа состоит из обязательных тегов html, head, body.',
'Html – общий тег всего документа.',
'Head – заголовок, в нем расположены теги об странице например title выводящий названия.',
'Charset – устанавливает кодировку, по умолчанию это utf-8 используется на 90% сайтов.',
'Тег body содержит основную часть страницы.',
'h1 – h6 – служит для вывода заголовков разных размеров где h1 самый высокий.',
'Блок form – объединяет набор тегов в форму с именем login-form.',
'Span – логическое выделение текста в форме, а input – это блоки ввода текста.',
'У каждого input есть имя, которое необходимо для проверки введенных значений.',
'У тега div есть атрибута class которая создает уп��авляемы класс, мы будем им управлять из css или javascript. В нашем случае в блоке css clear both делает вывод со следующей строки.',
'Button – необходим для рисования кнопки отправки формы.',
'Также я показал места куда необходимо вставить код в случае запуска не в jsfiddle',
'Перейдем к javascript части',
'Submit onclick – добавляем события клика по кнопке с id = submit.',
'Определяем переменную login которая берет значения с поля с советующим именем на форме, посредством функции getElementsByName, так же определяем переменную password.',
'Пустую переменную result для вывода результата и объект resultEl для изменения отображения результата.',
'Проверяем если логин = max и пароль = 123 выводим надпись: Access is allowe',
'И добавляем css класс success который подкрашивает надпись в зеленый цвет, CSS предназначен для управления внешним видом html.',
'Проверяем результат работы.',
'На этом первый урок закончен.'
],
i_mysmx = -1,
show_mysmx = false,
u_mysmx = new SpeechSynthesisUtterance(),
t_mysmx;
document.addEventListener('keydown', function(event) {
show_mysmx = false;
if(event.code == 'Home'){
i_mysmx = 0;
show_mysmx = true;
}
if(event.code == 'PageDown'){
if(i_mysmx<text_mysmx.length-1) {
i_mysmx++;
} else {
i_mysmx = 0;
}
show_mysmx = true;
}
if(event.code == 'PageUp'){
if(i_mysmx>0) {
i_mysmx--;
} else {
i_mysmx = text_mysmx.length-1;
}
show_mysmx = true;
}
if(show_mysmx){
document.getElementById("info_mysmx").innerHTML = text_mysmx[i_mysmx];
document.getElementById("info_mysmx").classList.add("show");
u_mysmx.text = text_mysmx[i_mysmx];
speechSynthesis.speak(u_mysmx);
} else {
document.getElementById("info_mysmx").classList.remove("show");
}
});
speechSynthesis.cancel()
u_mysmx.onstart = function (event) {
t_mysmx = event.timeStamp;
};
u_mysmx.onend = function (event) {
t_mysmx = event.timeStamp-t_mysmx;
};
Так же в массиве text_mysmx я прописал все текстовые фразы для показа.
Эти 2 файла стоит разместить на своем сайте, так же возможен вариант написать плагин для хром браузера.

