it-swarm.com.de

Gibt es eine Möglichkeit, die SpeechRecognizer-API direkt für die Spracheingabe zu verwenden?

Die Android Dev-Website bietet ein Beispiel für die Spracheingabe mit der integrierten Google-Spracheingabeaktivität. Die Aktivität zeigt ein vorkonfiguriertes Popup mit dem Mikrofon an und gibt die Ergebnisse mit onActivityResult() weiter.

Meine Frage: Gibt es eine Möglichkeit, die Klasse SpeechRecognizer direkt für die Spracheingabe zu verwenden, ohne die gespeicherte Aktivität anzuzeigen? Auf diese Weise kann ich meine eigene Aktivität für die Spracheingabe erstellen.

18
vladimir.vivien

Hier ist der Code, der die SpeechRecognizer-Klasse verwendet (bezogen auf hier und hier ):

import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.speech.RecognitionListener;
import Android.speech.RecognizerIntent;
import Android.speech.SpeechRecognizer;
import Android.widget.Button;
import Android.widget.TextView;
import Java.util.ArrayList;
import Android.util.Log;



public class VoiceRecognitionTest extends Activity implements OnClickListener 
{

   private TextView mText;
   private SpeechRecognizer sr;
   private static final String TAG = "MyStt3Activity";
   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button speakButton = (Button) findViewById(R.id.btn_speak);     
            mText = (TextView) findViewById(R.id.textView1);     
            speakButton.setOnClickListener(this);
            sr = SpeechRecognizer.createSpeechRecognizer(this);       
            sr.setRecognitionListener(new listener());        
   }

   class listener implements RecognitionListener          
   {
            public void onReadyForSpeech(Bundle params)
            {
                     Log.d(TAG, "onReadyForSpeech");
            }
            public void onBeginningOfSpeech()
            {
                     Log.d(TAG, "onBeginningOfSpeech");
            }
            public void onRmsChanged(float rmsdB)
            {
                     Log.d(TAG, "onRmsChanged");
            }
            public void onBufferReceived(byte[] buffer)
            {
                     Log.d(TAG, "onBufferReceived");
            }
            public void onEndOfSpeech()
            {
                     Log.d(TAG, "onEndofSpeech");
            }
            public void onError(int error)
            {
                     Log.d(TAG,  "error " +  error);
                     mText.setText("error " + error);
            }
            public void onResults(Bundle results)                   
            {
                     String str = new String();
                     Log.d(TAG, "onResults " + results);
                     ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
                     for (int i = 0; i < data.size(); i++)
                     {
                               Log.d(TAG, "result " + data.get(i));
                               str += data.get(i);
                     }
                     mText.setText("results: "+String.valueOf(data.size()));        
            }
            public void onPartialResults(Bundle partialResults)
            {
                     Log.d(TAG, "onPartialResults");
            }
            public void onEvent(int eventType, Bundle params)
            {
                     Log.d(TAG, "onEvent " + eventType);
            }
   }
   public void onClick(View v) {
            if (v.getId() == R.id.btn_speak) 
            {
                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,"voice.recognition.test");

                intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,5); 
                     sr.startListening(intent);
                     Log.i("111111","11111111");
            }
   }
}

Definieren Sie main.xml mit einer Schaltfläche und geben Sie RECORD_AUDIO die Berechtigung im Manifest

50
png

Sie können SpeechRecognizer verwenden, obwohl mir kein Beispielcode für diesen Code nach dieser vorherigen SO -Frage bekannt ist. Dies ist jedoch neu in API-Level 8 (Android 2.2) und daher zum Zeitpunkt des Schreibens dieses Dokuments nicht allgemein verwendbar.

1
CommonsWare

Stellen Sie außerdem sicher, dass Sie die richtigen Berechtigungen vom Benutzer anfordern. Ich habe mich mit dem Rückgabewert von Fehler 9 festgefahren: INSUFFICIENT_PERMISSIONS, obwohl ich die richtigen RECORD_AUDIO-Berechtigungen hatte, die im Manifest aufgeführt sind.

Beim Befolgen des Beispielcodes hier konnte ich die Berechtigungen vom Benutzer erhalten, und dann gab der Spracherkenner gute Antworten zurück.

Z.B. Diesen Block habe ich in mein onCreate () für die Aktivität eingefügt, obwohl er sich vor dem Aufrufen der SpeechRecognizer-Methoden an einer anderen Stelle in der Benutzeroberfläche befinden könnte:

    protected void onCreate(Bundle savedInstanceState) {
        ...
        if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.RECORD_AUDIO)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.RECORD_AUDIO)) {

            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.

        } else {

            // No explanation needed, we can request the permission.

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.RECORD_AUDIO},
                    527);

            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request. (In this example I just punched in
            // the value 527)
        }
        ...
    }

Geben Sie dann in der Aktivität für die Berechtigungsanforderung eine Rückrufmethode an:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 527: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

Eine andere Sache, die ich im obigen Beispielcode von preetha ändern muss, in dem der resultierende Text in der onResults () -Methode abgerufen wird. Um den tatsächlichen Text der übersetzten Rede zu erhalten (anstatt die Größe, wie der Originalcode ausgibt), drucken Sie entweder den Wert der erstellten Zeichenfolge str oder rufen Sie einen der Rückgabewerte in der ArrayList (data) ab. Zum Beispiel:

.setText(data.get(0));
1
FlannelTuba