Javascript 如何在开始语音识别之前等待语音合成结束,反之亦然?
我正在尝试使用SpeechSynthesis和SpeechRecognition创建聊天机器人的迷你版。基本上我想要的是从文本到语音的转换。一旦这样做了,我想听听用户说什么(语音对文本),然后说用户回文本。这是我的代码: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
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);这会导致地狱。我希望它们像同步一样执行。