Синтез речи — компьютерная симуляция человеческой речи. Он используется для преобразования письменной информации в слуховую информацию, где это более удобно, особенно для мобильных приложений, таких как электронная почта с поддержкой голосовой связи и унифицированные сообщения. Как разработчик, использующий Javascript для создания гибридных приложений, мы предполагаем, что вы знаете API синтеза речи, доступный в большинстве веб-браузеров. Использовать этот API-интерфейс действительно просто, однако он недоступен в приложении Cordova, поэтому вам нужно прибегнуть к нативному API устройства через плагин Cordova.
В этой статье вы узнаете, как легко преобразовать текст в речь в вашем проекте Cordova.
Требования
Чтобы использовать собственный API-интерфейс Speech Synthesis для устройства, мы собираемся использовать для него плагин. Кордова плагин TTS это плагин, написанный @vilic это позволяет вам использовать собственный API синтеза речи устройства через Javascript. Этот плагин обеспечивает поддержку следующих платформ:
- iOS 7+
- Windows Phone 8
- Android 4.0.3+ (уровень API 15+)
Установите плагин в своем проекте, выполнив следующую команду в терминале:
cordova plugin add cordova-plugin-tts
После установки вы сможете использовать объект TTS в окне. Для дополнительной информации посетите официальный репозиторий Github здесь. Этот плагин использует класс AVSpeechSynthesizer в iOS, класс TextToSpeech в Android и класс синтеза речи Windows Phone в Windows Phone.
Текст в речь
Чтобы преобразовать текст в голос с помощью Javascript, используйте метод speak объекта TTS. Этот метод ожидает в качестве первого параметра объект с максимум 3 свойствами:
Имя свойства | Тип | Описание |
text |
строка | Определяет текст, который будет произноситься. |
locale |
строка | 4-символьный код, который определяет язык, который должен использоваться для синтеза текста. |
rate |
терка | скорость речи объекта SpeechSynthesizer, от 0,1 до 1 |
И может использоваться как в следующем примере:
TTS.speak({
text: 'Good morning, how are you?',
locale: 'en-US',
rate: 1
}, function () {
console.log('Text succesfully spoken');
}, function (reason) {
console.log(reason);
});
Стоит сказать, что если вы хотите синтезировать текст при запуске приложения, вам нужно обернуть свой код внутри deviceready
событие:
document.addEventListener('deviceready', function () {
TTS.speak('Welcome to my awesome app', function () {
console.log('Ready !');
}, function (reason) {
console.log(reason);
});
});
Почему нет метода остановки?
В техническом плане с нативным API вы можете остановить любой объект речевого высказывания. Тем не менее, с этим плагином нет способа остановить синтез речи (по крайней мере, не традиционным способом), если он уже запущен и причина очень проста (нет, плагин не плохой или неполный).
Поскольку мы используем Cordova, мы ограничены в отправке и получении некоторых данных, мы можем взаимодействовать с нативным кодом и Javascript через обратные вызовы, но мы не можем взаимодействовать динамически с одним родным экземпляром класса плагина потому что выполнение каждого метода Javascript создает новый экземпляр нативного класса плагина.
Каждый раз, когда вы выполняете какое-то действие в этом случае start
Cordova создает, например, класс TTS в Java, который расширяет CordovaPlugin один раз и сохраняет объект TTS в локальной переменной в классе. Из сохраненного объекта TTS вы можете выполнить метод stop, и синтез речи должен остановиться как запланировано. Но, если вы выполните другой метод из Javascript в этом случае stop
затем будет создан новый экземпляр класса TTS в Java, который расширяет CordovaPlugin (это означает, что мы больше не имеем доступа к одному и тому же объекту TTS из метода start). То же самое происходит с iOS и Windows.
Хотя в плагине нет метода остановки, вы можете использовать небольшую хитрость для его достижения. Произнесите пустую строку, и синтез речи прекратится! Вы можете расширить плагин и создать свой собственный метод остановки:
// Extend the TTS object with the new stop method.
TTS["stop"] = function(){
TTS.speak({text: ''});
};
// Speak some text
TTS.speak({
text: 'Hola buenos días. Hoy para el desayuno hay pan con mantequilla.',
locale: 'es-ES',
rate: 0.75
}, function () {
console.log('success');
}, function (reason) {
console.log(reason);
});
// Stop after 3 seconds
setTimeout(function() {
TTS.stop();
console.log("Speech synthesis stopped");
}, 3000);