SpeechSynthesis API onend callback funktioniert nicht
Ich bin mit dem Speech Synthesis API auf Google Chrome v34.0.1847.131. Die API-Implementierung in Chrome ab v33.
Text-to-speech funktioniert zum größten Teil, außer wenn die Zuordnung einer Rückruf onend
. 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);
wird manchmal rufen onend
und manchmal nicht nennen. Das timing scheint zu sein, völlig aus. Wenn es nicht genannt, die gedruckt elapsedTime
ist immer eine gewisse Epoche Zeit wie 1399237888
.
- nur weil die specs sind geschrieben, w3,..., bedeutet nicht, Sie funktionieren oder funktionieren genau wie, dass in allen Browsern vor allem, wenn Sie neu sind und experimentellen wie speechsynthesis..nicht, dass diese Fähigkeit ist eine Art technologische Durchbruch, aber es ist erste mal gebracht werden, um Browsern.
- Ich überprüfte, was Sie Taten, und ja das problem ist...für mich auf end-Ereignis noch nicht ausgelöst, auch einmal...und onstart findet manchmal auch.
- Vielen Dank für die überprüfung. Es ist ermutigend zu sehen, jemand anderes mit diesem Problem. Ich denke, dies wäre nur eine halbgare Umsetzung, so dass diese Frage möglicherweise nicht beantworten.
- check this out...aus irgendeinem seltsamen Grund, wenn Sie sich aus der äußerung Objekt
message
dann funktioniert es einwandfrei. 😀 jsfiddle.net/QYw6b - Wow, das ist interessant. Die
event.elapsedTime
ist immer noch Quatsch, aberonend
scheint zu brennen, die sich jeden einzelnen Zeit. - in der Tat, ich denke, dass problem ist, das aufrufen der sprechen-Funktion sofort nach dem deklarieren message-Objekt ist das problem..wenn man nur ` setTimeout(function(){speechSynthesis.sprechen(u);},100); " es funktioniert...oder Angriff sprechen-Funktion click-Ereignis funktioniert es auch.
setTimeout(function(){speechSynthesis.speak(u);},1);
funktioniert so gut und ist nicht zu unterscheidend von nur nannte es gerade. Scheint, dass die API nur mag Leben in einem callback. Würde gerne etwas mehr Einblick, warum das so ist, Verhalten wir beobachten, aber wohl nur die Googler wissen. Wenn Sie möchten, können Sie schreiben, eine Antwort auf diese Frage mit den Informationen, die Sie bereitgestellt haben, und ich gebe es Ihr Verdienst 🙂- ich bin auch in der Lage, die Zeit
- Ich sehe immer noch diese auf chrome v46 für Windows. Ich erinnere mich nicht, es passiert auf Chrome für android.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zwar ist dies, wie ich gefunden, damit es funktioniert, ich bin mir nicht sicher, ob dies das richtige Verhalten....
Zunächst nicht nennen, die sprechen-Funktion sofort, das callback benutzen.
2., um die Nutzung der Zeit
timeStamp
stattelapsedTime
. Sie konnte gerade benutzt habenperformance.now()
als gut.Demo: http://jsfiddle.net/QYw6b/2/
bekommen Sie Zeit verging und beide Ereignisse ausgelöst, die für Sie sicher.
Laut dieser Kommentar auf die genannten Fehler in die Antwort von Kevin Hakanson, es könnte ein problem mit der garbage collection. Die Speicherung der äußerung in einer variable vor dem Aufruf
speak
scheint den trick tun:SpeechSynthesisUtterance
variable breiteren, z.B. Globale, funktioniert der trick.utterances
wird ein array erstellt in der ersten Zeile.push
fügt ein Element am Ende eines Arrays: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...Könnten Sie die EventListener für den Anfang und das Ende, wie ich für Speakerbot (http://www.speakerbot.de/).
Hier mein Gesicht verändert sich, während die Worte gesprochen werden.
Fand ich beide Lösungen die hier vorgeschlagen wird, funktioniert nicht in eine app, die ich gerade schrieb. Die einzige Lösung, die ich gefunden habe ist eine (Art von) busy waiting:
finden Sie ein vollständiges Beispiel in in diesem codepen
Dieser sieht ähnlich wie eine Chrom-bug gemeldet am Jul 12, 2015.
drucken Sie die äußerung, bevor Sie zu sprechen scheint arbeiten...
Wenn ich entfernen Sie die Konsole, die dieses Problem passieren wird, weiß nicht, warum
Fand ich auch der einzige Weg, um diese Arbeit zuverlässig ist zu verwenden .Bedeutung. Ich benutze einen 17-Sekunden-timeout. Alle meine Aufnahmen sind unter 20 Sekunden, so dass dies für mich funktioniert.
Bevor ich würde dieses problem einmal alle 8-10 Nachrichten, die es versuchten. Einmal habe ich Hinzugefügt .Abbrechen, es scheint immer zu funktionieren. Ich nenne set timeout beim aufrufen.