1

我正在使用 WebSpeech 的 SpeechSynthesis 模块让 Web 应用程序说话。但是,您似乎只能将话语添加到队列中,然后在整个队列中进行 pause()、resume() 和 cancel()。

我有一种情况,我想要两个话语:

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

我想让 utterance1 播放,然后在中间暂停,让 utterance2 播放,然后恢复 utterance1。在代码中,它看起来像这样:

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

不幸的是,speechSynthesis 的方法 pause()、resume() 和 cancel() 不接受任何参数并作用于整个语音话语队列。有没有办法实现这种行为?

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

如果我可以跟踪话语在字符串中“被说出”的位置,那么我可以取消它,然后用文本的其余部分创建一个新的话语,但我不知道这是否可能。

有什么建议么?

4

1 回答 1

2

我已经使用我的库Artyom.js在 SpeechSynthesis 中工作了几个月,并且根据文档(以及我所做的所有测试)暂停单个合成实例并重新计算另一个实例是不可能的,因为所有实例与 window.speechSynthesis 相关(如果有一天 API 发生变化,那将是 SpeechSynthesis 的又一大进步)。当你调用speechSynthesis“instance”的pause方法时,它会申请所有的队列,没有别的办法。

根据文档

// 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 文档将语音数据传递给话语。这样做的主要优点是,在构建需要合成大量文本的应用程序时,可以更轻松地管理语音内容。

阅读更多关于这里

于 2016-03-18T18:36:33.793 回答