2012-03-08 26 views
2

私は、ユーザーからコマンドを受け取り、リアルタイムで書き込むアプリケーションを作っています。私が取る最良の選択肢は何でしょうか?スフィンクスのようなサードパーティのソフトウェアや、組み込みの(アンドロイドの音声認識)を使うべきですか?音声認識Androidアプリ

第二に、私はそれがリアルタイムで書きたいと思います、私が話すときのように書くのですか?

答えて

6

内蔵のAndroid音声認識機能を使用する必要があります。具体的には、SpeechRecognier APIを操作して、ポップアップダイアログボックスが表示されないようにする必要があります。

また、SpeechRecognizerがonPartialResults()の中に何かを返すとは思わないでください。それはまれです。

あなたはSphinxを使用しようと思うかもしれませんが、他の開発者はAndroidで動作させるのが難しいようです。それは、あなたのアプリがインターネットに接続されていなくても動くようにしたいなら、スフィンクスだけがあなたの唯一の選択肢になるだろう。ここで

は、あなたがSpeechRecognizerを使用する必要がありますコードのスニップです:

public void recognizeDirectly(Intent recognizerIntent) 
    { 
     // SpeechRecognizer requires EXTRA_CALLING_PACKAGE, so add if it's not 
     // here 
     if (!recognizerIntent.hasExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE)) 
     { 
      recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
        "com.dummy"); 
     } 
     SpeechRecognizer recognizer = getSpeechRecognizer(); 
     recognizer.startListening(recognizerIntent); 
    } 

    @Override 
    public void onResults(Bundle results) 
    { 
     Log.d(TAG, "full results"); 
     receiveResults(results); 
    } 

    @Override 
    public void onPartialResults(Bundle partialResults) 
    { 
     Log.d(TAG, "partial results"); 
     receiveResults(partialResults); 
    } 

    /** 
    * common method to process any results bundle from {@link SpeechRecognizer} 
    */ 
    private void receiveResults(Bundle results) 
    { 
     if ((results != null) 
       && results.containsKey(SpeechRecognizer.RESULTS_RECOGNITION)) 
     { 
      List<String> heard = 
        results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
      float[] scores = 
        results.getFloatArray(SpeechRecognizer.CONFIDENCE_SCORES); 
      receiveWhatWasHeard(heard, scores); 
     } 
    } 

    @Override 
    public void onError(int errorCode) 
    { 
     recognitionFailure(errorCode); 
    } 

    /** 
    * stop the speech recognizer 
    */ 
    @Override 
    protected void onPause() 
    { 
     if (getSpeechRecognizer() != null) 
     { 
      getSpeechRecognizer().stopListening(); 
      getSpeechRecognizer().cancel(); 
      getSpeechRecognizer().destroy(); 
     } 
     super.onPause(); 
    } 

    /** 
    * lazy initialize the speech recognizer 
    */ 
    private SpeechRecognizer getSpeechRecognizer() 
    { 
     if (recognizer == null) 
     { 
      recognizer = SpeechRecognizer.createSpeechRecognizer(this); 
      recognizer.setRecognitionListener(this); 
     } 
     return recognizer; 
    } 

    // other unused methods from RecognitionListener... 

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

    @Override 
    public void onEndOfSpeech() 
    { 
    } 
+0

ありがとうございます。しかし、私はアンドロイドプログラミングではあまりよくありません。どうすればこのコードを実装するのですか?私は対話が現れる音声認識のための通常のコードを実装しました。どのようにこのコードに置き換えるのですか? ありがとうございます:) – Shah

+0

ダイアログのバージョンに対して行ったのと同じインテントを使用しますが、代わりに私のrecognDirectlyメソッドを呼び出します。音声認識の結果を処理するには、receiveWhatWasHeard()とrecognitionFailure()も実装する必要があります。 – gregm

+0

ありがとうございました。私はそれを聞いてうれしく思っています。私は書き込み方向に取り組んでいました。私のアプリケーションの最初のタスクは今完了しています..あなたに感謝:) – Shah

4

gregmは正しいですが、質問の主な「リアルタイムに書き込み」の部分は答えませんでした。私

intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); 

警告のために働く

意図に余分を追加:あなたはあなたが戻って結果の取得部分に興味があることを示すために余分を追加する必要がある唯一の新しいものを返さない部分が、前のものも。だからあなたは自分で違いをチェックする必要があります...