针对单个单词触发语音合成事件

时间:2018-10-30 10:46:42

标签: javascript speech-synthesis

我一直在修改JavaScript中的SpeechSynthesisUtterance API,并且一直在尝试将解释器将每个口语单词分割成一个触发方式不同的匿名函数。

说我通过API说了以下一句话:

var message = new SpeechSynthesisUtterance('one two three');
window.speechSynthesis.speak(message);

它会输出一二三,尽管速度不错,但我有能力附加一个功能,该功能将为每个单词的开头触发,所以:

* function is called with parameter "one" // starts speaking "one"
* function is called with parameter "two" // starts speaking "two"
* function is called with parameter "three" // starts speaking "three"

我试图将它们分为三个不同的词,例如同时说:

var message1 = new SpeechSynthesisUtterance('one');
var message2 = new SpeechSynthesisUtterance('two');
var message3 = new SpeechSynthesisUtterance('three');

window.speechSynthesis.speak(message1);
window.speechSynthesis.speak(message2);
window.speechSynthesis.speak(message3);

但这会缓慢输出“一个……两个……三个” -尽管此设置非常理想,因为我可以附加onstart或{ {1}}触发了文档中发现的事件。

1 个答案:

答案 0 :(得分:1)

想要使用SpeechSynthesisUtterance.onboundary事件的声音:

var message = new SpeechSynthesisUtterance('one two three');
message.onboundary = (e => console.log(e));
window.speechSynthesis.speak(message);

该事件具有charIndex属性,该属性告诉您边界在说话范围内的位置。由您决定从该点开始向前阅读直到下一个单词边界来确定单词:

console.log(e.target.text.substr(e.charIndex).match(/^.+?\b/)[0]);