голосовые заметки можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. SpeechRecognition получает фразы с микрофона и отдаёт промежуточный и финальный текст, который можно превратить в обычную заметку. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.
Запись звука и распознавание речи часто смешивают, хотя API микрофона, распознаватель, разрешения и хранение текста имеют разные состояния. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте страницу с кнопками старта и остановки, живым черновиком, финальным текстом и локальным сохранением заметок. Проверка: после разрешения микрофона речь появляется в черновике, финальная фраза добавляется в список, отказ в доступе показывает понятное сообщение.
найти SpeechRecognition или webkitSpeechRecognition. Не расширяйте проект до первого успешного запуска.
браузер показывает системный запрос микрофона. Проверяйте значение, а не отсутствие ошибки.
После успеха добавьте выбор языка ru-RU/en-US и ручное редактирование перед сохранением. Так копирование станет практикой.
Как устроен учебный проект голосовые заметки
Кнопка запускает SpeechRecognition, события result обновляют interim и final transcript, а localStorage хранит только подтверждённые строки. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.
| Этап | Действие | Проверяемый результат |
|---|---|---|
| Поддержка | найти SpeechRecognition или webkitSpeechRecognition | неподдерживаемый браузер получает текстовый fallback |
| Разрешение | запустить распознавание только после клика | браузер показывает системный запрос микрофона |
| Результат | разделить interim и isFinal | черновик меняется, а финальная фраза фиксируется один раз |
| Хранение | добавить финальный текст в localStorage | перезагрузка возвращает заметки без повторного микрофона |
Контрольные точки: поддержка, разрешение, результат и хранение. Следующий шаг начинается после совпадения с ожидаемым результатом.

От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.
Собираем рабочий пример шаг за шагом
Пример сверялся с актуальной документацией MDN Web Speech API на 19 октября 2026 года. Создайте HTML, CSS и app.js, запустите их через localhost или HTTPS. Для доступа к микрофону нужен безопасный контекст и разрешение пользователя. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition
const status = document.querySelector('#status')
const draft = document.querySelector('#draft')
const notes = document.querySelector('#notes')
if (!SpeechRecognition) {
status.textContent = 'Распознавание речи не поддерживается. Используйте текстовое поле.'
} else {
const recognition = new SpeechRecognition()
recognition.lang = 'ru-RU'
recognition.interimResults = true
recognition.continuous = false
recognition.addEventListener('result', (event) => {
let interim = ''
for (let i = event.resultIndex; i < event.results.length; i++) {
const text = event.results[i][0].transcript.trim()
if (event.results[i].isFinal) addNote(text)
else interim += text + ' '
}
draft.textContent = interim
})
recognition.addEventListener('error', (event) => {
status.textContent = 'Не удалось распознать речь: ' + event.error
})
document.querySelector('#start').addEventListener('click', () => recognition.start())
document.querySelector('#stop').addEventListener('click', () => recognition.stop())
}
function addNote(text) {
if (!text) return
const item = document.createElement('li')
item.textContent = text
notes.append(item)
}- Промежуточная фраза обновляет черновик, но ещё не создаёт постоянную заметку.
- Финальный результат добавляется один раз, а ошибка permission-denied отображается рядом с кнопкой.
- Повторный запуск даёт тот же предсказуемый результат.
- Пустой ввод получает понятное сообщение вместо падения.
Флаг isFinal отделяет меняющийся черновик от фразы, которую уже можно сохранить. Найдите в примере вход, проверку и место формирования результата.

Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.
Что происходит внутри и почему это работает
Web Speech API описывает интерфейс распознавания, но реализация зависит от браузера. В некоторых браузерах аудио может отправляться в удалённый сервис, поэтому офлайн-работу и приватность нельзя обещать без проверки конкретной реализации. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Свойство lang влияет на модель распознавания. Язык интерфейса страницы не заменяет явную настройку ru-RU.
| Часть | За что отвечает | Что проверить |
|---|---|---|
| Поддержка | выбирает доступный конструктор или fallback | страница не падает без API |
| События | result, error и end описывают жизненный цикл | кнопки и статус отражают реальное состояние |
| Хранение | сохраняет только финальный текст | черновик не дублируется после нескольких result |
Не вызывайте start повторно, пока предыдущая сессия не завершилась: браузер может выбросить InvalidStateError. Отключайте кнопку старта на период прослушивания и возвращайте её в событии end. Для длинной диктовки продумайте сегменты и явный индикатор, что микрофон активен. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.
Проверяем проект и добавляем свою функцию
Добавьте редактируемое поле перед сохранением финальной фразы. Пользователь должен исправить распознавание и подтвердить заметку. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.
- Сохраните ожидаемый результат: после разрешения микрофона речь появляется в черновике, финальная фраза добавляется в список, отказ в доступе показывает понятное сообщение.
- Измените правило: добавьте выбор языка ru-RU/en-US и ручное редактирование перед сохранением. Сначала предскажите итог.
- Передайте граничное значение и убедитесь, что приложение не падает.
- Верните корректные данные и объясните роли трёх основных частей.
- неподдерживаемый браузер получает текстовый fallback
- браузер показывает системный запрос микрофона
- черновик меняется, а финальная фраза фиксируется один раз
- перезагрузка возвращает заметки без повторного микрофона
Голосовой ввод полезен как альтернативный путь, но обычное текстовое поле остаётся обязательным fallback. Полезная правка проходит от нового ввода до видимого результата.

Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.
Что запомнить и куда двигаться дальше
Перед реальным использованием объясните, когда включён микрофон, где обрабатывается аудио и что именно сохраняется. Не храните исходную запись, если продукту нужен только текст. Для закрепления откройте в Telegram-боте голос в текст, в todo list на JavaScript и в PWA с локальным хранением.
Как изучить тему в Кодике
Повторите события, DOM и массивы, затем разберите разрешения и асинхронный жизненный цикл распознавания. Сначала восстановите главную функцию и проверьте её на трёх значениях.
| Шаг | Что разобрать | Мини-проверка |
|---|---|---|
| 1. Основа | Кнопки, события, DOM-список и localStorage | Объясните вход и выход функции. |
| 2. Инструмент | SpeechRecognition, result, error, isFinal и lang | Повторите команду по памяти. |
| 3. Проект | Черновик, подтверждение и текстовый fallback | Проверьте два сценария. |
| 4. Рефакторинг | Управление состояниями и приватностью | Разделите ввод, логику и вывод. |
Протестируйте обычную речь, паузу, отказ в доступе и неподдерживаемый браузер как четыре разные ветки. Базовый синтаксис закрепите через курс JavaScript.
Код пропускает стандартный конструктор. Проверяйте оба варианта.
Одна фраза появляется много раз. Сохраняйте только isFinal.
Пользователь не понимает, идёт ли запись. Показывайте явное состояние.
Реализация может использовать сетевой сервис. Документируйте ограничение конкретного браузера.
Что получится в итоге

Так выглядит законченный учебный проект: есть понятный вход, видимый результат, защита от неверных данных и место для следующего улучшения.
Зачем различать interim и final?
Interim меняется по мере распознавания, а final считается завершённым сегментом для сохранения.
Работает ли Web Speech одинаково во всех браузерах?
Нет. Поддержка, префиксы, сеть и доступные режимы зависят от реализации.
Что проверять первым, если голосовые заметки не запускается?
Версию среды, текущую папку, команду запуска и первую строку ошибки.
Как понять, что проект голосовые заметки работает?
Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.
Можно ли начать с готового кода?
Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.
Выберите одно улучшение и проведите его от ввода до результата.
Если не хватает основы, перейдите курс JavaScript, затем восстановите ключевую функцию без подсказки.