我正在尝试用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 个语音一个接一个。因此,似乎所有生成的语音都被累积起来,然后当没有其他命令来完成语音生成器时,语音生成器会一次吐出所有语音。有没有办法改变这种行为并能够以正确的顺序发音语音?
我已经用谷歌浏览器75试过了。
您的分析是正确的,只有在所有 console.logs 完成后才会运行 speak 命令。这是因为,作为一个API,speechSynthesis 方法(例如speak(((被放入浏览器的任务队列中,等待调用堆栈清除,即所有console.logs都已完成。这是一个很好的视频。
如果您希望某些事情与进入任务队列的事件同时发生,则可以使用事件。在这种情况下,语句具有开始和结束,具体取决于您希望它在演讲之前还是之后发生。
因此,假设您希望控制台.log在演讲之前发生,您可以使用此代码。但是,如果您希望它在更改开始到开始之后发生。
const showAndSayIt = (m) => {
const msg = new SpeechSynthesisUtterance(m);
msg.onstart = () => console.log(m);
speechSynthesis.speak(msg);
}