RecognitionListener.onReadyForSpeech()中的DTMF音调被误认为是语音

时间:2011-04-20 17:56:42

标签: android speech-recognition voice-recognition

从您通过startActivityForResult()调用它之前,Google语音搜索会有很长的延迟,直到显示对话框,准备好发表演讲。

这要求用户在说话之前始终查看屏幕,等待显示对话框。

所以我想通过实现RecognitionListener并在onReadyForSpeech()中发出DTMF音来生成声音信号而不是对话框,如下面的代码片段所示:

  @Override
  public void onReadyForSpeech(Bundle params) {
    Log.d(LCTAG, "Called when the endpointer is ready for the user to start speaking.");
    mToneGenerator.startTone(ToneGenerator.TONE_DTMF_1);
    try {
      Thread.sleep(50);
    } catch (InterruptedException e) {
      Log.e(LCTAG, "InterruptedException while in Thread.sleep(50).");        
      e.printStackTrace();
    } // SystemClock.sleep(50);
    mToneGenerator.stopTone();
  }

音调听起来很漂亮但是......它也被麦克风“听到”,到达语音识别服务并且总是产生识别错误 ERROR_NO_MATCH 。 / p>

有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:5)

这是一个随机的想法,它可能不起作用。

您可以尝试在播放音调时禁用麦克风(可能通过AudioManager.setMicrophoneMute)吗?

答案 1 :(得分:1)

这是我的代码,它适用于RecognitionListener的onReadyForSpeech()回调。

private void playSpeechReadyTone(){
    audioManager.setMicrophoneMute(true);
    MediaPlayer mediaPlayer = MediaPlayer.create(JarvisService.this, R.raw.doublebeep);
    mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer arg0) {
            audioManager.setMicrophoneMute(false);
        }
    });
    mediaPlayer.start();    
}

答案 2 :(得分:0)

我担心没有一种简单而干净的方法可以做到这一点。正如srf指定的那样,你不应该依赖AudioManager.setMicrophoneMute(boolean),所以,AFAIK,可能的是:

  1. 在调用SpeechRecognizer.startListening(意图)之前播放音频文件:

    final MediaPlayer mediaPlayer = MediaPlayer.create(JarvisService.this, R.raw.doublebeep);
    mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
    
         @Override
        public void onCompletion(MediaPlayer player) {
            player.release();
            // Safety start Speech Recognizer
            mSpeechRecognizer.startListening(getSpeechRecognizerIntent());
        }
    });
    mediaPlayer.start();
    
  2. 然而,这个解决方案有一个问题......如果在调用RecognitionListener.onReadyForSpeech之前可能会收到RecognitionListener.onError(int error),那么在这种情况下,你每次都会发出一声嘟嘟声(这会发生,例如,如果您未连接到Internet并且语音识别配置为在线工作)! 此外,您应该管理在音频(双重)播放期间取消语音识别过程的情况。

    1. 播放onReadyForSpeech回调中的音频(阅读原始问题),但使用具有适当值的RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS。在我的情况下,我的哔声声音非常短(最多1秒),我将RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS设置为4/5秒。
    2. 另请注意,正如Google doc所说:

        

      另请注意,某些值可能会导致意外或意外结果 - 谨慎使用!此外,根据识别器实现,这些值可能无效。