簡體   English   中英

如何遍歷Web Speech API中的問題

[英]How to loop over questions in Web Speech API

如何使用Web Speech API遍歷問題列表。 例如,我想問一系列“是”或“否”問題,然后如果答案為“是”,則以不同的方式處理結果,如果答案為“否”,則轉到下一個問題。

var questions = //array of five questions
function answerQuestions {
    for (i = 0; questions.length; i++) {
      if (askUser(questions[i]) {
          ///Do something if yes
      } else if ((i+1) === questions.length){
         //stop asking questions
      }
}
function askUser (question) {
    //instantiate Web Speech API
     //someinstance.speak(question)
 }
function say(m){   
    var msg = new SpeechSynthesisUtterance();   
    var voices = window.speechSynthesis.getVoices();    
    msg.voice = voices[10];     
    msg.voiceURI = "Google UK English Male";    
    msg.volume = 1;     
    msg.rate = 1;   
    msg.pitch = 1.4;    
    msg.text = m;   
    msg.lang = 'en-GB';     
    speechSynthesis.speak(msg); 
    msg.onend = function () {
        listenToAnswer()
    }
}

問題在於,它永遠不會調用listenToAnswer()並監聽下一個用戶輸入。 相反,它只是在問題的for循環中真正快速地循環。 任何想法將不勝感激。

首先, say需要返回一個演講結束Promise解決的Promise 這樣,您可以調用say()並在for循環中await它。 當前,您正在pickQuestion內部構造一個Promise ,但是隨后您要立即解決它因為在Promise構造后立即調用了它的resolve 因此,沒有時間進行任何異步操作了。

一旦say返回Promise ,您就可以避免在for循環內構造另一個Promise ,而只需等待say調用:

function say(m){
  return new Promise((resolve) => {
    const msg = new SpeechSynthesisUtterance();   
    var voices = window.speechSynthesis.getVoices();    
    msg.voice = voices[10];     
    msg.voiceURI = "Google UK English Male";    
    msg.volume = 1;     
    msg.rate = 1;   
    msg.pitch = 1.4;    
    msg.text = m;   
    msg.lang = 'en-GB';     
    speechSynthesis.speak(msg); 
    msg.onend = function () {
      resolve()
    }
  });
}

async function pickQuestion(subject) {
  const questionsOfSubject = questions[subject];
  for (let i = 0; i < questionsOfSubject.length; i++) {
    await say("Would you like to read, " + questionsOfSubject[i].title);
    const answer = await listenToResponse();
    if (answer.toLowerCase() === "yes") {
      readQuestion();
      break;
    }
  }
}

確保使用const (或let )聲明新變量,以免隱式分配給窗口屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM