2014-07-25 93 views
2

我开发了一个Android应用程序,它使用tts(文本到语音)给出命令,然后使用语音识别意图来聆听用户的语音回答。语音识别意图在TTS结束讲话之前开始

显然,只有当tts说完时,才会引发语音识别的意图。 有时候,大部分时候我从一个活动转到另一个活动,或者当我通过一个按钮激活这个过程时,语音识别器在TTS结束之前就意识到了! 问题是,然后获取并分析命令的相同文本而不是用户的文字。告诉语音识别器等待的部分代码是:

while(tts.isSpeaking()){ 
    //DOING NOTHING 
} 
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US"); 

try { 
     startActivityForResult(intent, RESULT_SPEECH); 
} catch (ActivityNotFoundException a) { 
    Toast t = Toast.makeText(getApplicationContext(),"Opps! Your device doesn't support Speech to Text", Toast.LENGTH_SHORT); 
    t.show(); 
}  

有没有人有解决方案?这似乎很随机。有时会等待,有时候不会。 谢谢大家!

回答

2

使用tts.isSpeaking()是无用的几个原因,你可以详细阅读:

Problem with isSpeaking() when using Text-to-Speech on Android

这一翻译,你需要设置OnUtteranceProgressListener

tts.setOnUtteranceProgressListener(new UtteranceProgressListener() { 
     @Override 
     public void onStart(String utteranceId) { 
      // Nothing 
     } 

     @Override 
     public void onError(String utteranceId) { 
      // Nothing 
     } 

     @Override 
     public void onDone(String utteranceId) { 
      // Restart recognizer here 

请注意,为了使这个监听工作你需要在tts.speak调用中设置参数TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID

0

下面是一个示例。出于某些原因,您可能需要在主线程中启动speechRecognizer。

tts.setOnUtteranceProgressListener(新UtteranceProgressListener(){

   @Override 
       public void onStart(String utteranceId) { 

       } 

       @Override 
       public void onDone(String utteranceId) { 
        if (utteranceId.contains(<utterance_id_you_set>)){ 
         Handler mainHandler = new Handler(getApplicationContext().getMainLooper()); 

         Runnable myRunnable = new Runnable() { 
          @Override 
          public void run() { 
           //start your recognizer here 
          } 
         }; 
         mainHandler.post(myRunnable); 

        } 
       } 

       @Override 
       public void onError(String utteranceId) { 

       } 
      }); 
     } 
    });