Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.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 如何在开始语音识别之前等待语音合成结束,反之亦然?_Javascript_Speech Recognition_Text To Speech_Speech Synthesis - Fatal编程技术网

Javascript 如何在开始语音识别之前等待语音合成结束,反之亦然?

Javascript 如何在开始语音识别之前等待语音合成结束,反之亦然?,javascript,speech-recognition,text-to-speech,speech-synthesis,Javascript,Speech Recognition,Text To Speech,Speech Synthesis,我正在尝试使用SpeechSynthesis和SpeechRecognition创建聊天机器人的迷你版。基本上我想要的是从文本到语音的转换。一旦这样做了,我想听听用户说什么(语音对文本),然后说用户回文本。这是我的代码: speak("Say something"); var spokenWord=hear(); speak(spokenWord); function speak(message) { var synth = window.speechSynthesis; va

我正在尝试使用SpeechSynthesis和SpeechRecognition创建聊天机器人的迷你版。基本上我想要的是从文本到语音的转换。一旦这样做了,我想听听用户说什么(语音对文本),然后说用户回文本。这是我的代码:

speak("Say something");
var spokenWord=hear();
speak(spokenWord);

function speak(message) {
    var synth = window.speechSynthesis;
    var utterThis = new SpeechSynthesisUtterance(message);
    synth.speak(utterThis);
    utterThis.onend = function (event) {
        console.log('Utterance has finished being spoken after ' + event.elapsedTime + ' milliseconds.');
    }
}

function hear() {
    var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
    var recognition = new SpeechRecognition();
    recognition.start();

    recognition.onresult = function (event) {
        var current = event.resultIndex;
        var transcript = event.results[current][0].transcript;
        console.log(transcript);
        recognition.stop();
        return transcript;
    }
}
因为这些方法是异步的,所以它没有按照我期望的方式工作。第二次发言在听力完成之前进行。有什么建议可以解决这个问题吗?

异步函数waitUntil(检查:()=>boolean,intervalPeriodMs=300):承诺{
async function waitUntil(check: () => boolean, intervalPeriodMs = 300): Promise<void> {
    if (check()) {
        return
    }
    return new Promise((resolve, reject) => {
        const wait = setInterval(() => {
            try {
                if (check()) {
                    clearInterval(wait)
                    resolve()
                }
            } catch (err) {
                clearInterval(wait)
                reject(err)
            }
        }, intervalPeriodMs)
    })
}

await waitUntil(() => !window.speechSynthesis.speaking, 300)
if(check()){ 返回 } 返回新承诺((解决、拒绝)=>{ 常量等待=设置间隔(()=>{ 试一试{ if(check()){ 清除间隔(等待) 解决() } }捕捉(错误){ 清除间隔(等待) 拒绝(错误) } },间歇期) }) } 等待等待直到(()=>!window.speechSynthesis.speaking,300)
在我的例子中,
window.speechSynthesis.speaking
在演讲结束后很长一段时间都是正确的。我注意到这只是带有
localService:true
的声音的问题。因此,如果您可以避免这些,您的
oned
将被调用。

它将类似于:recognition.onresult=speak(transcript);这会导致地狱。我希望它们像同步一样执行。