9

Google 音声検索では、startActivityForResult() を介して呼び出した瞬間から、ダイアログ ボックスが表示されて音声を受け取る準備ができるまで、大幅な遅延が発生します。

これにより、ユーザーは話す前に常に画面を見て、ダイアログ ボックスが表示されるのを待つ必要があります。

そこで、次のスニペットのように、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が生成されます。

これを回避する方法はありますか?

4

3 に答える 3

5

これはランダムなアイデアであり、うまくいかない可能性があります。

AudioManager.setMicrophoneMuteトーンの再生中にマイクを無効にしてみてください (おそらく 経由で)。

于 2011-04-20T17:59:00.307 に答える
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();    
}
于 2011-10-06T21:01:57.370 に答える
0

それを行うための簡単でクリーンな方法はないのではないかと心配しています。srf が指定したように、AudioManager.setMicrophoneMute(boolean) に依存するべきではありません。

  1. SpeechRecognizer.startListening(intent) を呼び出す前にオーディオ ファイルを再生します。

    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();
    

ただし、このソリューションには問題があります... RecognitionListener.onReadyForSpeech が呼び出される前に RecognitionListener.onError(int error) を受け取る可能性があり、その場合でも、毎回ビープ音を鳴らしています (これは、たとえば、インターネットに接続されておらず、音声認識がオンラインで動作するように構成されている場合)! また、オーディオ (ダブルビープ) 再生中に音声認識プロセスをキャンセルする場合を管理する必要があります。

  1. onReadyForSpeech コールバック (元の質問を読む) でオーディオを再生しますが、適切な値で RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS を使用します。私の場合、ビープ音は非常に短く (最大 1 秒)、RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS を 4/5 秒に設定しました。

また、Google doc が言うように、次の点にも注意してください。

また、特定の値は、望ましくない結果や予期しない結果を引き起こす可能性があることに注意してください。慎重に使用してください。さらに、レコグナイザーの実装によっては、これらの値が無効になる場合があります。

于 2013-07-19T09:36:45.683 に答える