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
.
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.
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 speak
scheint der Trick zu sein :
window.utterances = [];
var utterance = new SpeechSynthesisUtterance( 'hello' );
utterances.Push( utterance );
speechSynthesis.speak( utterance );
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');
})
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
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
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);
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);