在数组中说出单词

mat*_*tt. 3 javascript text-to-speech speech-synthesis webspeech-api

我想用Web Speech API大声说出一系列单词.

这些词是一,二,三,四,五.

在Chrome上说出单词时,下面的脚本会显示第一个单词,然后重复最后一个单词,直到迭代完成,语音输出为:

一,五,五,五,五.

在Firefox上,脚本说第一个单词然后停止,语音输出是:

一个.

我已经把东西记录到控制台,试图弄清楚发生了什么,这是两个浏览器的结果.

word: one
message: one 
word: two 
message: two 
word: three 
message: three 
word: four 
message: four 
word: five 
message: five
Run Code Online (Sandbox Code Playgroud)

控制台的输出是所需的语音输出,所以我不确定到底发生了什么.

var msg = new SpeechSynthesisUtterance();
var words = ['one', 'two', 'three', 'four', 'five'];

for (var i = 0; i < words.length; i++) {
    msg.text = words[i];

    console.log('word: ' + words[i]);
    console.log('message: ' + msg.text);

    window.speechSynthesis.speak(msg);
}
Run Code Online (Sandbox Code Playgroud)

可能导致这种情况的原因是什么?我该怎么做才能纠正它?

小智 5

您SpeechSynthesisUtterance每次都需要使用一个新实例.

var words = ['one', 'two', 'three', 'four', 'five'];

for (var i = 0; i < words.length; i++) {
    var msg = new SpeechSynthesisUtterance();
    msg.text = words[i];

    console.log('word: ' + words[i]);
    console.log('message: ' + msg.text);

    window.speechSynthesis.speak(msg);
}
Run Code Online (Sandbox Code Playgroud)

语音不会在零时间播放,并且似乎后续SpeechSynthesisUtterance实例被放入队列中,直到前一个语音播放完毕.您重复使用同一个实例,在排队之后speak(...)但在它们从队列中弹出并读取之前修改这些值.第一个话语("一个")正确播放,因为队列中没有其他东西可以阻止它(它立即读取),但其余部分需要等待,并在读取之前最终修改.