2017-12-07 22 views
1

私はAndroidアプリケーションでSpeechRecognizerライブラリを使用しようとしています。まず第一に、私が話すのを止めてもそれは止まらない。 私が自分自身を認識しているのを止めようとすると、次に「マッチしません!」というメッセージが表示されます。直ちに。SpeechRecognizerは起動直後に一致しません

私の質問は:私はGoogleの音声認識を使用すると(たとえば、私がウェブ上で検索すると)、それは魅力的に機能します。私のアプリでは完全ではありませんが、ライブラリは同じです。実装で何が問題になっていますか?

私のコード(簡体字):

注:私は、音声認識をより柔軟にするために部分的な結果を使用しようと、私は認識を除く任意の効果が少し速くなった見ることができません。

public void setupVoiceRecognition(Activity activity) { 
     mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(activity.getApplicationContext()); 
     mSpeechRecognizer.setRecognitionListener(this); 

     mRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     mRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
       activity.getPackageName()); 
     mRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, 
       true); 
     mRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
       RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
     mRecognizerIntent.putExtra(EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 5000); 
     mRecognizerIntent.putExtra(EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 3000); 
     mRecognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3); 
     mContext = activity.getApplicationContext(); 
     if (mMainBtn != null) { 
      mMainBtn.setOnClickListener(new View.OnClickListener() { 
       @Override public void onClick(View view) { 
        VoiceRecognition.this.onClick(); 
       } 
      }); 
     } 
    }  

    public void forceStop() { 
     if (mListening) { 
      toggleListening(false); 
     } 
    }  

    public void onClick() {    
     toggleListening(!mListening);    
    } 


    private void toggleListening(boolean start) { 
     mPartialLength = 0; 
     if (start) { 
      mSpeechRecognizer.startListening(mRecognizerIntent); 
     } else { 
      mSpeechRecognizer.stopListening(); 
     } 
     if (mMainBtn != null) { 
      mMainBtn.setImageResource((start) ? R.drawable.icon_record_active : R.drawable.icon_record_white); 
     } 
     if (mSupportBtn != null) { 
      mSupportBtn.setImageResource((start) ? R.drawable.icon_record_active : R.drawable.icon_record_white); 
     } 
     mListening = start; 
    } 

    ... 

    @Override public void onError(int i) { 
     if (mListening) { 
      String errorText; 
      switch (i) { 
       case SpeechRecognizer.ERROR_AUDIO: 
        errorText = MyApp.getContext().getString(R.string.speech_recognition_err3); 
        break; 

       ... 

      } 
      MyApp.showToast(errorText); 
      toggleListening(false); 
      if (i == NO_MATCH) { 
       toggleListening(true); 
      } 
     } 
    } 

    @Override public void onResults(Bundle bundle) { 
     ArrayList<String> matches = bundle 
       .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
     if (matches != null) { 
      String fullText = mViewForText.getText().toString(); 
      mViewForText.setText(fullText.substring(0, fullText.length() - mPartialLength) + matches.get(0) + " "); 
      mViewForText.requestFocus(View.FOCUS_RIGHT); 
      mViewForText.setSelection(mViewForText.getText().length()); 
      mPartialLength = 0; 
      forceStop(); 
     } 
    } 

    @Override public void onPartialResults(Bundle bundle) { 
     ArrayList<String> matches = bundle 
       .getStringArrayList(EXTRA_PARTIAL_RESULTS); 
     if (matches != null) { 
      mViewForText.setText(mViewForText.getText().toString() + matches.get(0) + " "); 
      mPartialLength += matches.get(0).length() + 1; 
      mViewForText.requestFocus(View.FOCUS_RIGHT); 
      mViewForText.setSelection(mViewForText.getText().length()); 
     } 
    } 
} 

答えて

1

Googleは、サードパーティのアプリケーション用のSpeechRecognizerによる連続音声認識を無効にしています。私は彼らが今すぐAPI(https://cloud.google.com/speech/)を支払ったので、非常にうまくいくが、無料ではないと思う。

NO_MATCHについてエラー。 Googleは自身のビープ音の招待状を聞き、それが発言開始であると仮定します。そのようなビープ音がNO_MATCHエラーを返すと認識できないなど。

オプションがあります。 Google Appをダウングレードして、認識サービスの作業をより安定させることができます。最後に正しく機能しているGoogleアプリのバージョンは6.2.34

です
関連する問題