我正在尝试用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上进行过尝试。
答案 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);
}