Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 语音合成API阻塞主线程_Javascript_Multithreading_Text To Speech - Fatal编程技术网

Javascript 语音合成API阻塞主线程

Javascript 语音合成API阻塞主线程,javascript,multithreading,text-to-speech,Javascript,Multithreading,Text To Speech,我正在使用语音合成API来发音一系列不同的单词。我的应用程序会在单词通过画布说话时对其进行动画处理。我意识到当我做一个新的演讲时: var msg = new SpeechSynthesisUtterance(word); window.speechSynthesis.speak(msg); 说出来的单词似乎会阻塞主线程,从而暂时暂停动画。每次调用window.speechSynthesis.speak()时都会发生这种情况 有没有办法让语音合成在Javascript中的一个单独线程上运行,这

我正在使用语音合成API来发音一系列不同的单词。我的应用程序会在单词通过画布说话时对其进行动画处理。我意识到当我做一个新的演讲时:

var msg = new SpeechSynthesisUtterance(word);
window.speechSynthesis.speak(msg);
说出来的单词似乎会阻塞主线程,从而暂时暂停动画。每次调用
window.speechSynthesis.speak()时都会发生这种情况

有没有办法让语音合成在Javascript中的一个单独线程上运行,这样就不会干扰我在主线程上的动画


(我主要是在Chrome中进行测试)

我会使用setTimeout来伪造异步调用:

var msg = new SpeechSynthesisUtterance(word);
setTimeout(function() { window.speechSynthesis.speak(msg); }, 1);

我必须承认我对此并不确定。

这里要遵循的一种方法是使用一个工作线程来播放与文本消息对应的音频

但是,web工作者无权访问窗口对象。因此,我们不能直接在worker内部调用
window.speechSythesis.speak
方法

这是一个很好的工作,工具是围绕着它的

  • 将要讲话的文本发送到工作线程
  • 然后,工作线程将该文本转换为音频(WAV)文件,并将WAV文件返回主线程
  • 主线程从工作线程接收消息时,将使用音频元素运行WAV文件
  • 在我看来,为了获得更好的性能,可以创建一个工作人员池


    请看一下演示

    我真的建议您看看Philip Roberts关于事件循环是什么以及
    setTimeout
    0为什么有意义的可爱摘要:

    简而言之,Booster2ooo所说的可能是一个快速解决方案,即将调用包装在setTimeout调用中:

    setTimeout(function() { window.speechSynthesis.speak(msg); }, 0);
    

    下面是一个动画和语音合成。你能修改它来重现你的问题吗?这是一个有趣的解决方案!我也曾短暂地考虑过web workers,但因为它无法访问语音合成API而将其驳回。不知道这与本机实现相比有多好?这对我来说不起作用,我认为这是有道理的。仅因为在当前事件循环结束时移动了要处理的函数,该函数仍在主线程中处理,这意味着如果该函数是长时间运行的函数(即使是超时),它仍将在主线程中运行,因此仍然会滞后。是的,我认为你已经一针见血了@AlexMorley Finch。这真的不管用,不知道为什么这是公认的答案。