2016-03-18 8 views
1

Ich benutze das SpeechSynthesis-Modul von WebSpeech, um eine Webanwendung sprechen zu lassen. Es scheint jedoch, dass Sie nur Äußerungen zu einer Warteschlange hinzufügen und dann die gesamte Warteschlange anhalten(), fortsetzen() und abbrechen() können.WebSpeech Sprachsynthese: Pause von Äußerung1, Wiedergabe einer anderen Äußerung2 und Wiederaufnahme von Äußerung1 - möglich?

Ich habe eine Situation, wo ich zwei Äußerungen haben wollen:

utterance1 = new SpeechSynthesisUtterance(text1); 
utterance2 = new SpeechSynthesisUtterance(text2); 

Ich möchte utterance1 Spiel haben, pausieren es dann in der Mitte, haben utterance2 spielen, und dann wieder utterance1. Im Code würde es so aussehen:

speechSynthesis.speak(utterance1); 
// ... after a while 
speechSyntehsis.pause(utterance1); 
speechSynthesis.speak(utterance2); 
// ... after a long while 
speechSynthesis.resume(utterance1); 

Leider Sprachsynthese Methoden Pause(), resume() und Abbrechen() übernehmen keinerlei Argument und wirken auf die gesamte Sprachäußerung Warteschlange. Gibt es eine Möglichkeit, dieses Verhalten zu erreichen?

Wenn ich mehrere SpeechSynthesis-Objekte haben könnte, dann könnte ich für jede Äußerung eine erstellen, aber ich glaube, dass ich nur eine haben kann.

Wenn ich verfolgen könnte, wo in der Zeichenfolge die Äußerung "ausgesprochen wurde", dann könnte ich es abbrechen und dann eine neue Äußerung mit dem Rest des Textes erstellen, aber ich weiß nicht, ob das möglich ist .

Irgendwelche Vorschläge?

Antwort

2

Ich habe arbeiten bereits in der Sprachsynthese für ein paar Monate mit meiner Bibliothek Artyom.js und entsprechend der Dokumentation (und alle Tests, die ich gemacht habe) eine einzelne Synthese Instanz anhalten und andere reanudate ist nicht möglich, weil Alle Instanzen sind mit der window.speechSynthesis verbunden (wenn sich eines Tages die API ändert, ist das ein weiterer großer Schritt in der Sprachsynthese). Wenn Sie die pause -Methode der spracheSynthese "instanz" aufrufen, gilt sie für die gesamte Warteschlange und es gibt keine andere Möglichkeit.

Nach dem documentation:

// the only solution would be if the speechSynthesis official API had a constructor like 
// and a real NEW instance be created 
// var synthRealInstance = new speechSynthesis(); 
// but till the date ... nope :(

var synthA = window.speechSynthesis; 
var synthB = window.speechSynthesis; 

var utterance1 = new SpeechSynthesisUtterance('How about we say this now? This is quite a long sentence to say.'); 
var utterance2 = new SpeechSynthesisUtterance('We should say another sentence too, just to be on the safe side.'); 

synthA.speak(utterance1); 
synthB.speak(utterance2); 

synthA.pause(); 
// or synthB will anyway stop the synthesis of the queue 

Es ist eine Eigenschaft, auf die Äußerung (onmark) dokumentiert ist jedoch nicht gut und wird wahrscheinlich experimentell wie diese api immer noch nicht.

Das Markierungsereignis wird ausgelöst, wenn in einer Sprachsynthesemarkierungssprache (SSML) ein Markierungstag erreicht wird. Wissen Sie einfach, dass es möglich ist, Ihre Sprachdaten mithilfe eines XML-basierten SSML-Dokuments an eine Äußerung zu übergeben. Der Hauptvorteil besteht darin, dass das Verwalten von Sprachinhalten beim Erstellen von Anwendungen mit viel Text, die synthetisiert werden müssen, vereinfacht wird.

Read more about here.

+0

Vielen Dank für die extrem schnelle Antwort. Das Markenereignis ist genau das, was ich gesucht habe. Vielen Dank! – tborenst

+0

@tborenst Wenn es kein Problem ist, wenn du erreichst was du brauchst, teile es hier wenn du es hast :) –

Verwandte Themen