【问题标题】:Speech recognition intent starts before TTS ends speaking语音识别意图在 TTS 结束讲话之前开始
【发布时间】:2014-09-17 08:53:26
【问题描述】:

我开发了一个 Android 应用程序,它使用 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();
}    

有人有解决办法吗?似乎很随意。有时它会等待,有时则不会。 谢谢大家!!

【问题讨论】:

    标签: android text-to-speech voice-recognition speech


    【解决方案1】:

    使用tts.isSpeaking() 无用有几个原因,您可以阅读以下内容了解详细信息:

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

    Intead,你需要设置 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。

    【讨论】:

      【解决方案2】:

      这是一个示例。由于某些原因,您可能需要在主线程中启动 SpeechRecognizer。

      tts.setOnUtteranceProgressListener(new 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) {
      
                      }
                  });
              }
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多