Веб-приложения с голосовым управлением: введение в API веб-речи

Новый JavaScript Web Speech API упрощает добавление распознавания речи на ваши веб-страницы. Этот API обеспечивает точный контроль и гибкость в работе функций распознавания речи в Chrome версии 25 и более поздних. Вот пример, где распознанный текст появляется практически мгновенно во время произнесения.

Демонстрация Web Speach API

ДЕМО / ИСТОЧНИК

Давайте заглянем под капот. Сначала мы проверяем, поддерживает ли браузер Web Speech API, проверяя, существует ли объект webkitSpeechRecognition . Если нет, мы предлагаем пользователю обновить браузер. (Поскольку API все еще экспериментальный, в настоящее время он имеет префикс поставщика.) Наконец, мы создаем объект webkitSpeechRecognition , который предоставляет интерфейс распознавания речи, и устанавливаем некоторые его атрибуты и обработчики событий.

if (!('webkitSpeechRecognition' in window)) {
    upgrade();
} else {
    var recognition = new webkitSpeechRecognition();
    recognition.continuous = true;
    recognition.interimResults = true;

    recognition.onstart = function() { ... }
    recognition.onresult = function(event) { ... }
    recognition.onerror = function(event) { ... }
    recognition.onend = function() { ... }
    ...

Значение по умолчанию для continuous — false, это означает, что когда пользователь перестаёт говорить, распознавание речи прекращается. Этот режим отлично подходит для простого текста, например, для коротких полей ввода. В этой демонстрации мы установили значение true, чтобы распознавание продолжалось, даже если пользователь делает паузу во время речи.

Значение по умолчанию для interimResults — false, что означает, что распознаватель возвращает только окончательные результаты, которые не изменятся. В демонстрационном примере установлено значение true, поэтому мы получаем предварительные, промежуточные результаты, которые могут измениться. Внимательно посмотрите демонстрацию: серый текст — это промежуточные результаты, которые иногда меняются, а черный текст — это ответы распознавателя, помеченные как окончательные и не изменяющиеся.

Для начала пользователь нажимает на кнопку микрофона, что запускает следующий код:

function startButton(event) {
    ...
    final_transcript = '';
    recognition.lang = select_dialect.value;
    recognition.start();

Мы устанавливаем язык для распознавания речи в поле «lang» на значение BCP-47, выбранное пользователем из выпадающего списка, например, «en-US» для английского языка США. Если это значение не задано, по умолчанию используется язык корневого элемента и иерархии HTML-документа. Система распознавания речи Chrome поддерживает множество языков (см. таблицу « langs » в исходном коде демонстрации), а также некоторые языки с письмом справа налево, которые не включены в эту демонстрацию, такие как he-IL и ar-EG.

После установки языка мы вызываем recognition.start() для активации распознавателя речи. Как только он начинает захватывать аудио, он вызывает обработчик события onstart , а затем для каждого нового набора результатов вызывает обработчик события onresult .

recognition.onresult = function(event) {
    var interim_transcript = '';

    for (var i = event.resultIndex; i < event.results.length; ++i) {
        if (event.results[i].isFinal) {
            final_transcript += event.results[i][0].transcript;
        } else {
            interim_transcript += event.results[i][0].transcript;
        }
    }
    final_transcript = capitalize(final_transcript);
    final_span.innerHTML = linebreak(final_transcript);
    interim_span.innerHTML = linebreak(interim_transcript);
    };
}

Этот обработчик объединяет все полученные результаты в две строки: final_transcript и interim_transcript . Полученные строки могут содержать символ "\n", например, когда пользователь произносит "новый абзац", поэтому мы используем функцию linebreak для преобразования их в HTML-теги <br> или <p> . Наконец, он устанавливает эти строки в качестве innerHTML для соответствующих элементов <span> : final_span , который оформлен черным текстом, и interim_span , который оформлен серым текстом.

Переменная interim_transcript является локальной и полностью перестраивается каждый раз при вызове этого события, поскольку возможно, что все промежуточные результаты изменились с момента последнего события onresult . Мы могли бы сделать то же самое для final_transcript , просто начав цикл for с 0. Однако, поскольку окончательный текст никогда не меняется, мы сделали код здесь немного более эффективным, сделав final_transcript глобальной переменной, чтобы это событие могло начать цикл for с event.resultIndex и добавлять только новый окончательный текст.

Вот и всё! Остальная часть кода нужна лишь для того, чтобы всё выглядело красиво. Она поддерживает состояние, показывает пользователю информативные сообщения и меняет GIF-изображение на кнопке микрофона между статическим изображением микрофона, изображением с косой чертой микрофона и анимацией микрофона с пульсирующей красной точкой.

Изображение косой черты микрофона отображается при вызове recognition.start() , а затем заменяется на mic-animate при срабатывании onstart . Обычно это происходит настолько быстро, что косая черта незаметна, но при первом использовании распознавания речи Chrome должен запросить у пользователя разрешение на использование микрофона, в этом случае onstart срабатывает только тогда, когда и если пользователь даст разрешение. Страницы, размещенные по протоколу HTTPS, не нуждаются в повторном запросе разрешения, в отличие от страниц, размещенных по протоколу HTTP.

Поэтому оживите свои веб-страницы, позволив им прислушиваться к вашим пользователям!

Мы будем рады услышать ваши отзывы...

Ознакомьтесь с нашей политикой конфиденциальности в разделе « Понимание конфиденциальности в Chrome» (обновлено: 16 июня 2026 г.).