2013-05-02 3 views
5

私は、 RecognizerIntent.ACTION_RECOGNIZE_SPEECHを使用して、アンドロイドアプリケーションで作業しています。私の問題は、ユーザーが入力した音声をキャプチャするバッファを作成する方法がわかりません。私は スタックのオーバーフローで多くを読むが、私はちょうどどのように理解していない 私はバッファと認識サービスコールを私のコードに戻します。そして、バッファに保存されたコンテンツを再生する方法を教えてください。RecognizerIntentを使用して音声をキャプチャするBufferReceived()を構築する方法は?

が、これは私のコードです:

 public class Voice extends Activity implements OnClickListener { 
    byte[] sig = new byte[500000] ; 
    int sigPos = 0 ; 
     ListView lv; 
    static final int check =0; 
    protected static final String TAG = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 



    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 


    setContentView(R.layout.voice); 

    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
      "com.domain.app"); 

    SpeechRecognizer recognizer = SpeechRecognizer 
      .createSpeechRecognizer(this.getApplicationContext()); 

    RecognitionListener listener = new RecognitionListener() { 

     @Override 
     public void onResults(Bundle results) { 
      ArrayList<String> voiceResults = results 
        .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
      if (voiceResults == null) { 
       Log.e(TAG, "No voice results"); 
      } else { 
       Log.d(TAG, "Printing matches: "); 
       for (String match : voiceResults) { 
        Log.d(TAG, match); 
       } 
      } 
     } 

     @Override 
     public void onReadyForSpeech(Bundle params) { 
      Log.d(TAG, "Ready for speech"); 
     } 

     @Override 
     public void onError(int error) { 
      Log.d(TAG, 
        "Error listening for speech: " + error); 
     } 

     @Override 
     public void onBeginningOfSpeech() { 
      Log.d(TAG, "Speech starting"); 
     } 

     @Override 
     public void onBufferReceived(byte[] buffer) { 
      // TODO Auto-generated method stub 
      TextView display=(TextView)findViewById (R.id.Text1); 
        display.setText("True"); 


       System.arraycopy(buffer, 0, sig, sigPos, buffer.length) ; 
       sigPos += buffer.length ; 

     } 

     @Override 
     public void onEndOfSpeech() { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onEvent(int eventType, Bundle params) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onPartialResults(Bundle partialResults) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onRmsChanged(float rmsdB) { 
      // TODO Auto-generated method stub 

     } 
    }; 
    recognizer.setRecognitionListener(listener); 
    recognizer.startListening(intent); 




    startActivityForResult(intent,check); 

} 

@Override 
public void onClick(View arg0) { 
    // TODO Auto-generated method stub 

} 



} 
+0

'SpeechRecognizer'を使用しているときは' startActivityForResult' + 'onActivityResult'は必要ありません... – Kaarel

+0

ICS以降、onBufferReceivedはもう呼び出されません。スピーチレコグナイザーを使用したり、同時に音声を入力することはできません。 –

答えて

3

Androidの音声認識API(APIレベル17のような)オーディオをキャプチャする信頼性の高い方法を提供していません。

より音が受信されました:

あなたはコールバックが、

RecognitionListeneronBufferReceived言うことに注意して、 "受信バッファ" を使用することができます。この機能の目的は、 がキャプチャされたオーディオに関してユーザーにフィードバックを与えることです。このメソッドが呼び出される保証はありません。

バッファ:シングルチャネルオーディオストリームを表すビッグエンディアンの16ビット のシーケンスを含むバッファ。サンプルレート は実装に依存します。

RecognitionService.CallbackbufferReceivedについてこう述べています。

音を受信したとき、サービスは、このメソッドを呼び出す必要があります。この機能の目的は、キャプチャされたオーディオに関してユーザ にフィードバックを与えることです。

バッファ:シングルチャネルオーディオストリームを表すビッグエンディアンの16ビット のシーケンスを含むバッファ。サンプルレート は実装に依存します。

したがって、このコールバックは、多分すなわちキャプチャ音声必ずしも取り込まれた音声自体に関するフィードバック、視覚化目的での縮小版のためのものです。また、「このメソッドが呼び出されるという保証はありません」。つまり、Google Voice Searchによってv1で提供されても、v2で削除されることになります。

このメソッドは、認識中に複数回呼び出すこともできます。しかし、バッファが完全な録音されたオーディオを表す場合、または最後の呼び出し以降のスニペットのみを表す場合は、記載されていません。 (私は後者を仮定しますが、音声認識装置でテストする必要があります)。

したがって、実装では、バッファをグローバル変数にコピーして保存する必要があります。認識が完了したらwavファイルに変換します。

+0

ok ,,,しかし、どこで私のコードにvoidReceived(byte [] buffer)を入れますか?私の答えで2番目のリンクで@Kaarel –

+0

@HaneenBassamルック、これはリスナーを実装する方法の例が含まれています。 'bufferReceived'の本体では、好きな方法でバイトバッファを処理することができます。 – Kaarel

+0

あなたは私の編集したコードを見ることができれば、あなたが、私は答えを更新しました –

関連する問題