it-swarm.com.de

SpeechSynthesis API onend Callback funktioniert nicht

Ich verwende die Speech Synthesis API in Google Chrome v34.0.1847.131. Die API ist in Chrome ab Version 33 implementiert.

Die Sprachausgabe funktioniert größtenteils, außer wenn Sie einen Rückruf an onend zuweisen. Zum Beispiel den folgenden Code:

var message = window.SpeechSynthesisUtterance("Hello world!");
message.onend = function(event) {
    console.log('Finished in ' + event.elapsedTime + ' seconds.');
};
window.speechSynthesis.speak(message);

ruft manchmal onend auf und ruft es manchmal nicht auf. Das Timing scheint völlig ausgeschaltet zu sein. Wenn es aufgerufen wird, ist die gedruckte elapsedTime immer eine bestimmte Epoche wie 1399237888.

25
huu

Ich habe es zwar so gefunden, dass es funktioniert, aber ich bin mir nicht sicher, ob dies das richtige Verhalten ist.

Rufen Sie die Sprachfunktion zunächst nicht sofort auf, sondern verwenden Sie den Rückruf.

2. Um Zeit zu erhalten, verwenden Sie timeStamp anstelle von elapsedTime. Sie hätten auch einfach performance.now() verwenden können. 

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);};

Demo: http://jsfiddle.net/QYw6b/2/

sie erhalten Zeit, und beide Ereignisse werden mit Sicherheit gefeuert. 

9
Muhammad Umer

Laut diesem Kommentar zu dem in der Antwort genannten Fehler von Kevin Hakanson könnte es ein Problem mit der Müllsammlung sein. Speichern der Äußerung in einer Variablen vor dem Aufruf von speakscheint der Trick zu sein :

window.utterances = [];
var utterance = new SpeechSynthesisUtterance( 'hello' );
utterances.Push( utterance );
speechSynthesis.speak( utterance );
20
techpeace

Sie können den EventListener wie für Speakerbot für Start und Ende verwenden (http://www.speakerbot.de/). 

Hier verändert sich mein Gesicht, während Worte gesprochen werden.

newUtt = new SpeechSynthesisUtterance();

newUtt.addEventListener('start', function () {
     console.log('started');
})

newUtt.addEventListener('end', function () {
     console.log('stopped');
})
4
fimbim

Ich habe festgestellt, dass beide hier vorgeschlagenen Lösungen in einer App, die ich gerade geschrieben habe funktioniert. Die einzige Lösung, die ich finden könnte, ist ein (Art) Warten: 

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();
}

ein vollständiges Beispiel finden Sie in this codepen

3
Mapio

Dies ähnelt einem Chromium-Fehler, der am 12. Juli 2015 gemeldet wurde.

Problem 509488 : Web-Sprach-API: Das Ende-Ereignis des SpeechSynthesisUtterance-Objekts wird manchmal nicht ausgelöst

3
Kevin Hakanson

ausdruck der Äußerung, bevor sprechen scheint zu funktionieren ... Wenn ich die Konsole entferne, wird dieses Problem auftreten, weiß nicht warum

console.log("utterance", utterThis);
synth.speak(utterThis);
1
yun

Ich habe auch festgestellt, dass die einzige Möglichkeit, diese Arbeit verlässlich zu machen, die Verwendung von .cance ist. Ich benutze ein Timeout von 17 Sekunden. Alle meine Aufnahmen sind unter 20 Sekunden, das funktioniert also für mich.

utterance.onstart = function (event) {
setTimeout(function(){window.speechSynthesis.cancel();},17000);
};

Bevor ich dieses Problem einmal alle 8-10 Meldungen versuchte, versuchte es. Sobald ich .cancel hinzugefügt habe, scheint es immer zu funktionieren. Ich rufe beim Aufruf auch Set Timeout auf.

setTimeout(function(){window.speechSynthesis.speak(utterance);},100);
0
Bruce Allen