我正在使用WebSpeech的speechSynthesis模块让Web应用程序讲话。但是,似乎您只能将语音添加到队列中,然后整个整个队列都需要pause(),resume()和cancel()。

我有两种情况要表达:

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


我想玩utterance1,然后将其暂停在中间,玩utterance2,然后再恢复anceance1。在代码中,它看起来像这样:

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


不幸的是,speechSynthesis的方法pause(),resume()和cancel()不会接受任何参数,而是作用于整个语音发声队列。有什么办法可以实现这种行为?

如果我可以有多个SpeechSynthesis对象,则可以为每个语音创建一个,但是我相信我只能有一个。

如果我可以跟踪发声在字符串中的“位置”,那么我可以取消它,然后使用其余文本创建新的发声,但是我不知道这是否可行。

有什么建议么?

最佳答案

我已经使用我的库Artyom.js在SpeechSynthesis中工作了几个月,并且根据文档(以及我进行的所有测试),暂停单个合成实例并重新审核另一个实例是不可能的,因为所有实例与window.speechSynthesis有关(如果有一天API发生变化,这将是SpeechSynthesis的又一个重要步骤)。当您将SpeechSynthesis的“实例”的暂停方法称为“实例”时,它将适用于所有队列,没有其他方法。

根据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


话语上有一个属性(onmark),但是没有得到很好的记录,并且可能无法正常工作,因为此api仍处于实验阶段。


  当语音合成标记语言(SSML)文件中到达“标记”标记时,就会触发标记事件。只知道可以使用基于XML的SSML文档将语音数据传递给说话。其主要优点是,在构建具有大量需要合成的文本的应用程序时,可以更轻松地管理语音内容。


Read more about here

关于javascript - Web语音合成:暂停发声1,播放另一发声2,然后恢复发声1-可能吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36091383/

10-10 14:13