4

Ich entwickle eine Anwendung, die den Android SpeechRecognizer verwendet. Ich benutze es für etwas Einfaches. Ich klicke auf einen Knopf, mein SpeechRecognizer hört zu und ich habe einige Ergebnisse von dem, was ich gesagt habe.Es ist möglich, SpeechRecognizer schneller zu machen?

Einfach richtig? Nun, mein Problem ist, dass ich SpeechRecognizer schnell machen muss. Ich meine, ich klicke auf meine Schaltfläche, ich sage "Hallo" und SpeechRecognizer dauert etwa 3-4 Sekunden im Gegenzug ein Array mit den möglichen Ergebnissen. Meine Frage ist:

Es ist möglich, SpeechRecognizer Rückkehrergebnisse schneller zu machen? Oder nehmen Sie sich weniger Zeit, um die Listening-Absicht zu schließen und zu verarbeiten, was Sie hören? Vielleicht eine andere Möglichkeit, es zu tun? was wird eine bessere Leistung als das haben?

ich die Bibliothek wurde überprüft, und ich sah diese 3 Parameter:

EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS:

Die Höhe der Zeit, dass es sollte dauern, nachdem wir Rede aufhören zu hören die Eingabe abgeschlossen zu betrachten.

EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS

Die Mindestlänge einer Äußerung.

EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS

Die Menge an Zeit, die es dauern sollte, nachdem wir hören Rede stoppen betrachten die Eingabe möglicherweise abgeschlossen.

http://developer.android.com/intl/es/reference/android/speech/RecognizerIntent.html

Ich habe alle von ihnen versucht, aber es funktioniert nicht, oder vielleicht rigth ich nicht mit ihnen. Hier ist mein Code:

public class MainActivity extends Activity { 
private static final String TIME_FORMAT = "%02d:%02d:%02d"; 
private final String TAG = "MainActivity"; 

private StartTimerButton mSpeakButton; 
private CircleProgressBar mCountdownProgressBar; 
private CountDownTimer mCountDownTimer; 
private TextView mTimer; 
private int mRunSeconds = 0; 
private SpeechRecognizer mSpeechRecognizer; 
private Intent mSpeechRecognizerIntent; 
private boolean mIsListening = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mRunSeconds = 0; 
    mTimer = (TextView) findViewById(R.id.timerText); 
    mCountdownProgressBar = (CircleProgressBar) findViewById(R.id.progressBar); 
    mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); 
    mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
      this.getPackageName()); 

//   mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 
//    1000); 
//  mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 
//    1000); 
//  mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS, 
//    1000); 

    SpeechRecognitionListener listener = new SpeechRecognitionListener(); 
    mSpeechRecognizer.setRecognitionListener(listener); 
    mSpeakButton = (StartTimerButton) findViewById(R.id.btnSpeak); 
    mSpeakButton.setReadyState(false); 
    mSpeakButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (mSpeakButton.isReady()) { 
       if (!mIsListening) 
        mSpeechRecognizer.startListening(mSpeechRecognizerIntent); 
      } else 
       mSpeakButton.setReadyState(true); 
     } 
    }); 

}  

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    return true; 
} 

public void onSpeechResults(ArrayList<String> matches) { 
    for (String match : matches) { 

     match = match.toLowerCase(); 
     Log.d(TAG, "Got speech: " + match); 

     if (match.contains("go")) { 
      //Do Something 
      mSpeechRecognizer.stopListening(); 
     } 
     if (match.contains("stop")) { 
      //Do Something 
      mSpeechRecognizer.stopListening(); 
     } 
    } 
} 

protected class SpeechRecognitionListener implements RecognitionListener 
{ 

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

    @Override 
    public void onBufferReceived(byte[] buffer) 
    { 

    } 

    @Override 
    public void onEndOfSpeech() 
    { 
     //Log.d(TAG, "onEndOfSpeech"); 
    } 

    @Override 
    public void onError(int error) 
    { 
     mSpeechRecognizer.startListening(mSpeechRecognizerIntent); 

     //Log.d(TAG, "error = " + error); 
    } 

    @Override 
    public void onEvent(int eventType, Bundle params) 
    { 

    } 

    @Override 
    public void onPartialResults(Bundle partialResults) 
    { 
     ArrayList<String> matches = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
     for (String match : matches) { 
      match = match.toLowerCase(); 
      Log.d(TAG, "onPartialResults : " + match); 
     } 
    } 

    @Override 
    public void onReadyForSpeech(Bundle params) 
    { 
     Log.d(TAG, "onReadyForSpeech"); //$NON-NLS-1$ 
    } 

    @Override 
    public void onResults(Bundle results) 
    { 
     //Log.d(TAG, "onResults"); //$NON-NLS-1$ 
     ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
     onSpeechResults(matches); 
     // matches are the return values of speech recognition engine 
     // Use these values for whatever you wish to do 
    } 

    @Override 
    public void onRmsChanged(float rmsdB) 
    { 
    } 
}} 

Vielen Dank für Ihre Zeit! Hoffe, dass mir jemand ein bisschen helfen kann: P!

+0

Nein, in Betracht ziehen, flexiblere Erkennungen zu verwenden –

+0

können Sie mir einen Ratschlag über andere recognizers geben, die ich verwenden kann? –

Antwort

2

Ja, es ist möglich, die Verzögerung vor dem Herunterfahren zu reduzieren ....

Sie können nicht die Höhe der Zeit verändern, die Google am Ende eines Benutzers zu sprechen sein Schweigen hält. Die EXTRA_SPEECH_* Parameter zu arbeiten, jetzt scheinen sie sporadisch arbeiten bestenfalls oder gar nicht funktionieren.

Sie können die Teilergebnisse verwenden, um die gewünschten Wörter oder Sätze zu erkennen und den Erkennungsdienst manuell herunterzufahren.

Hier ist ein Beispiel dafür, wie dies zu tun:

public boolean isHelloDetected(@NonNull final Context ctx, @NonNull final Locale loc, @NonNull final Bundle results) { 

     boolean helloDetected = false; 

     if (!results.isEmpty()) { 

      final String hello = ctx.getString(R.string.hello); 

      final ArrayList<String> partialData = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 

       /* handles empty string bug */ 
      if (partialData != null && !partialData.isEmpty()) { 
       partialData.removeAll(Collections.singleton("")); 

       if (!partialData.isEmpty()) { 
        final ListIterator<String> itr = partialData.listIterator(); 

        String vd; 
        while (itr.hasNext()) { 
         vd = itr.next().toLowerCase(loc).trim(); 

         if (vd.startsWith(hello)) { 
          helloDetected = true; 
          break; 
         } 
        } 
       } 
      } 

      if (!helloDetected) { 
       final ArrayList<String> unstableData = results.getStringArrayList("android.speech.extra.UNSTABLE_TEXT"); 

        /* handles empty string bug */ 
       if (unstableData != null && !unstableData.isEmpty()) { 
        unstableData.removeAll(Collections.singleton("")); 

        if (!unstableData.isEmpty()) { 
         final ListIterator<String> itr = unstableData.listIterator(); 

         String vd; 
         while (itr.hasNext()) { 
          vd = itr.next().toLowerCase(loc).trim(); 

          if (vd.startsWith(hello)) { 
           helloDetected = true; 
           break; 
          } 
         } 
        } 
       } 
      } 
     } 

     return helloDetected; 
    } 

Sie diese Methode jedes Mal, wenn Sie von onPartialResults()

empfangen laufen würde, wenn true zurückgegeben wird, werden Sie stopListening() auf der Haupt anrufen müssen Gewinde (wahrscheinlich durch new Handler(Looper.getMainLooper()).post(...

bewusst sein, obwohl, sobald Sie die Erkennungs geschlossen haben, werden die nachfolgenden und Endergebnisse Sie erhalten in onResults() kann nicht enthalten "Hallo". Da dieses Wort möglicherweise nur als instabil eingestuft wurde.

Sie müssen zusätzliche Logik schreiben, um die Verwendung von detectHello() zu verhindern, sobald hallo erkannt wurde (andernfalls werden Sie wiederholt stopListening() aufrufen) - einige einfache boolesche Markierungen würden dies beheben.

Schließlich ist die Verwendung von Collections.singleton("") zum Entfernen von leeren Strings Teil eines internen Fehlerberichts, details to replicate here, und die Verwendung eines ListIterator kann für Ihre Probe übertrieben sein; eine einfache for-Schleife würde ausreichen.

Viel Glück.

+0

Hallo @brandall! Ich habe dies bereits gestern getan, indem ich die "EXTRA_PARTIAL_RESULTS" meiner Absicht hinzugefügt habe. Ich möchte nur ein bestimmtes Wort fangen, also funktioniert es gut. Wie auch immer, was meinst du mit "EXTRA_SPEECH_ *"? Kannst du mir ein bisschen mehr darüber erzählen? Nur um zu versuchen, meine Lösung zu verbessern Ich markiere deine Antwort als richtig, weil du die gleiche Lösung gefunden hast wie ich! Danke. Übrigens, wissen Sie, ob es möglich ist, den schrecklichen Piepton zu unterdrücken, ohne AudioStream stumm zu schalten? –

+1

Froh, dass Sie es gelöst haben - im obigen Beispiel kann die Verwendung der instabilen Teilergebnisse die Dinge ebenfalls beschleunigen. Die 'EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS' und andere funktionieren nicht (die ganze Zeit), daher kann man sich nicht darauf verlassen. Es gibt derzeit keine Möglichkeit, den Signalton außer über AudioStream stumm zu schalten - Google wird dies sehr wahrscheinlich nicht ändern, um den Missbrauch eines "kontinuierlichen Erkennungsdienstes" zu verhindern. Schauen Sie sich stattdessen PocketSphinx an. – brandall

+0

Momentan verwende ich den Google SpeechRecognizer-Dienst. Ich habe nicht so viel PocketSphinx studiert, aber ich habe gelesen, dass es nicht so präzise ist, und in diesem Fall muss ich so schnell wie möglich eine Ein-Wort-Erkennung bekommen. Wie auch immer, ich werde es versuchen, wenn meine App fertig sein wird. Um zu überprüfen, ob ich einen besseren Service geben kann. Vielen Dank @brandall! –

Verwandte Themen