除非没有其他命令不完整,否则window.speechSynthesis.speak不会讲话

时间:2019-09-03 06:14:57

标签: javascript text-to-speech speech-synthesis speechsynthesizer

我正在尝试用JavaScript编写测试代码,在该代码中我尝试同时记录并发音随机数。对于文本语音转换,我将SpeechSynthesisUtterancewindow.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上进行过尝试。

1 个答案:

答案 0 :(得分:1)

您的分析是正确的,只有在所有console.logs完成后才能运行语音命令。这是因为,作为API,speechSynthesis方法(例如:speak())被放入浏览器的任务队列中,以等待直到调用堆栈被清除(即所有console.logs已完成)。 Here's a good video

如果您希望某些事情与进入任务队列的事情同时发生,那么可以使用一个事件。在这种情况下,话语具有开始和结束的时间,这取决于您是否希望它在演讲之前或之后发生。

因此,假设您希望console.log出现在演讲之前,您可以使用此代码。但是,如果您希望它在从开始到结束更改之后发生。

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