2017-12-07 6 views
1

Ich versuche, SpeechRecognizer Bibliothek in meiner Android-Anwendung zu verwenden, und bis jetzt seine Arbeit lässt mich mit Fragen. Vor allem hört es nicht auf, wenn ich aufhöre zu sprechen. Wenn ich versuche, die Sprache zu stoppen, um mich wiederzuerkennen, gibt es mir das nächste Mal, 'Kein Match!' jetzt sofort.SpeechRecognizer gibt keine Übereinstimmung unmittelbar nach dem Start

Meine Frage ist: wenn ich google Spracherkennung (f. E. Wenn ich im Internet suche), es funktioniert wie ein Charme. In meiner App ist es bei weitem nicht perfekt, obwohl die Bibliothek die gleiche ist. Was ist falsch an meiner Implementierung?

Mein Code (vereinfacht):

Hinweis: Ich versuche, Teilergebnisse zu verwenden, Spracherkennung flexibler zu machen, aber ich kann keine Auswirkungen sehen außer Anerkennung wenig schneller geworden ist.

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

Antwort

1

Google hat die kontinuierliche Spracherkennung über SpeechRecognizer für Apps von Drittanbietern deaktiviert. Ich nehme an, das ist, weil sie API jetzt bezahlt haben (https://cloud.google.com/speech/), die sehr gut funktioniert, aber nicht frei.

Über NO_MATCH Fehler. Google hört sein eigenes Beep-Einladungssignal und geht davon aus, dass es sich um den Sprachstart handelt. Wenn dieser Piepton nicht erkannt wird, wird ein NO_MATCH-Fehler zurückgegeben.

Es gibt eine Option. Sie können die Google App für eine stabilere Arbeit des Erkennungsdienstes herabstufen. Die letzte ordnungsgemäß funktionierende Version der Google App ist 6.2.34

Verwandte Themen