1

我正在尝试用 javascript 编写测试代码,我尝试同时记录和发音一个随机数。SpeechSynthesisUtterance对于我使用的文本到语音window.speechSynthesis

function generate(){
 for (let i = 0;i<100;i++){
   let randomNumber = numberGenerator.generateNumber();
   showAndSayIt(randomNumber);
 }
}


const showAndSayIt = (m) => {
    var msg = new SpeechSynthesisUtterance(m);
    console.log(m);
    window.speechSynthesis.speak(msg);
}

当我运行这段代码时,我会立即得到所有的日志,只有在一切都完成后,我才开始一个一个地听到 100 个演讲。因此,似乎生成的所有语音都被累积起来,然后当没有其他命令可以完成语音生成器时,它们会立即吐出所有语音。有没有办法改变这种行为并能够以正确的顺序发音?

我已经用 Google Chrome 75 试过了。

4

1 回答 1

1

您的分析是正确的,只有在所有 console.logs 完成后才会运行 speak 命令。这是因为,作为一个API,speechSynthesis 方法(例如speak())被放入浏览器的任务队列中等待直到调用堆栈被清除,即所有的console.logs 已经完成。这是一个很好的视频

如果您希望某事与进入任务队列的某事同时发生,那么您可以使用事件。在这种情况下,话语有 onstart 和 onend,这取决于您希望它发生在演讲之前还是之后。

因此,假设您希望 console.log 在演讲之前出现,您可以使用此代码。但是,如果您希望它在将 onstart 更改为 onend 后发生。

const showAndSayIt = (m) => {
    const msg = new SpeechSynthesisUtterance(m);
    msg.onstart = () => console.log(m);
    speechSynthesis.speak(msg);
}
于 2019-09-03T09:36:32.620 回答