2014-06-03

Распознавание и синтез речи в браузере

Современные браузеры обретают все больше каналов взаимодействия с человеком. Вкратце, рассмотрим возможность общения - распознавания и синтеза речи на примере Google Chrome. К сожалению, другие браузеры в этом вопросе пока отстают.

Распознавание речи

На сегодняшний день в Chrome (v. 35) для преобразовании речи в текст используется класс webkitSpeechRecognition.
Инициализация и настройки:

var recognition = new webkitSpeechRecognition();
// распознаваемый язык
recognition.lang = 'ru';
// продолжать распознавать, если пользователь прекратил говорить?
recognition.continuous = true;
// промежуточные результаты
recognition.interimResults = true;
// запуск распознавания
recognition.start();
// а так можно остановить в любой момент
// recognition.stop();
Далее необходимо подписаться на события.
Рассмотрим самое основное - получение результата распознавания:

recognition.onresult = function(event) {
// результаты (объект SpeechRecognitionEvent):
//event
// массив результатов SpeechRecognitionResultList (объектов SpeechRecognitionResult):
//event.results
// финальный результат?
//event.results[i].isFinal
// event.results[i] является массивом вариантов (объектов SpeechRecognitionAlternative)
// уровень доверия отдельному варианту результата:
//event.results[i][0].confidence
// распознанный текст отдельного варианта результата
//event.results[i][0].transcript
};

Синтез речи

Для синтеза в Chrome (v. 35) используются SpeechSynthesisUtterance и speechSynthesis. Странно, что в Firefox есть только второй объект и одного его недостаточно для воспроизведения речи.

var speech = new window.SpeechSynthesisUtterance();
speech.lang = 'ru-RU'; //'en-US';
// голос из массива speechSynthesis.getVoices():
speech.voice = ...
// разные настройки произношения:
speech.rate = 1.5;
speech.pitch = 2;
speech.volume = 1;
// функция для воспроизведения
var speak = function(str){
 if (speechSynthesis.speaking) return;
 speech.text = str;
 // воспроизведение фразы:
 speechSynthesis.speak(speech);
};
// пример вызова:
speak("Привет, мир!");