API-интерфейс SpeechSynthesis API не работает
Я использую API синтеза речи в Google Chrome v34.0.1847.131. API реализован в Chrome начиная с версии v33.
Текстовое сообщение работает по большей части, за исключением случаев, когда назначается обратный вызов onend
. Например, следующий код:
var message = window.SpeechSynthesisUtterance("Hello world!");
message.onend = function(event) {
console.log('Finished in ' + event.elapsedTime + ' seconds.');
};
window.speechSynthesis.speak(message);
иногда вызывает onend
и иногда не вызывает его. Время, похоже, полностью отключено. Когда он вызван, напечатанный elapsedTime
всегда имеет некоторое время, например 1399237888
.
Ответы
Ответ 1
Пока я обнаружил, что это заставило его работать, я не уверен, что это правильное поведение....
Сначала не вызывайте функцию разговора сразу, используйте обратный вызов.
2nd, чтобы использовать время timeStamp
вместо elapsedTime
. Вы могли бы просто использовать performance.now()
.
var btn = document.getElementById('btn');
speechSynthesis.cancel()
var u = new SpeechSynthesisUtterance();
u.text = "This text was changed from the original demo.";
var t;
u.onstart = function (event) {
t = event.timeStamp;
console.log(t);
};
u.onend = function (event) {
t = event.timeStamp - t;
console.log(event.timeStamp);
console.log((t / 1000) + " seconds");
};
btn.onclick = function () {speechSynthesis.speak(u);};
Демо: http://jsfiddle.net/QYw6b/2/
вы получаете время, и оба события уволены точно.
Ответ 2
В соответствии с этот комментарий об ошибке, упомянутой в ответе от Кевина Хакансона, это может быть проблемой с сборкой мусора. Сохранение высказывания в переменной перед вызовом speak
похоже на трюк:
window.utterances = [];
var utterance = new SpeechSynthesisUtterance( 'hello' );
utterances.push( utterance );
speechSynthesis.speak( utterance );
Ответ 3
Вы можете использовать EventListener для начала и конца, как я сделал для Speakerbot (http://www.speakerbot.de/).
Здесь мое лицо меняется, когда произносятся слова.
newUtt = new SpeechSynthesisUtterance();
newUtt.addEventListener('start', function () {
console.log('started');
})
newUtt.addEventListener('end', function () {
console.log('stopped');
})
Ответ 4
Это похоже на ошибку Chromium, указанную 12 июля 2015 года.
Проблема 509488: API веб-речи: событие "конец" объекта SpeechSynthesisUtterance иногда не отправляется
Ответ 5
Я нашел оба решения, предложенные здесь, не работающие в приложение, которое я только что написал. Единственное решение, которое я мог придумать, - ожидание (вроде) занятого:
function speak( text, onend ) {
window.speechSynthesis.cancel();
var ssu = new SpeechSynthesisUtterance( text );
window.speechSynthesis.speak( ssu );
function _wait() {
if ( ! window.speechSynthesis.speaking ) {
onend();
return;
}
window.setTimeout( _wait, 200 );
}
_wait();
}
вы можете найти полный пример в this codepen
Ответ 6
напечатайте высказывание, прежде чем говорить, кажется, работает...
Если я удалю консоль, эта проблема произойдет, не знаю, почему
console.log("utterance", utterThis);
synth.speak(utterThis);
Ответ 7
Я также нашел единственный способ сделать эту работу надежно - использовать .cance. Я использую 17-секундный тайм-аут. Все мои записи составляют менее 20 секунд, поэтому это работает для меня.
utterance.onstart = function (event) {
setTimeout(function(){window.speechSynthesis.cancel();},17000);
};
Прежде чем я столкнулся с этой проблемой каждый раз каждые 8-10 сообщений, которые он пытался. Как только я добавил .cancel, он, кажется, всегда работает. Я также вызываю set timeout при вызове.
setTimeout(function(){window.speechSynthesis.speak(utterance);},100);