Подтвердить что ты не робот

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.

4b9b3361

Ответ 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);