为单个单词触发语音合成事件

Fire speech synthesis events for individual words

我一直在修改 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);

但这会慢慢输出 "one...... two...... three" - 尽管此设置是理想的,因为我可以附加找到的 onstartonend 触发事件在文档中。

听起来您想使用 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]);