Wie kann ich die Spracherkennung ohne den nervigen Dialog in Android-Handys verwenden?


124

Ist dies möglich, ohne die Android-APIs zu ändern? Ich habe einen Artikel darüber gefunden. Es gibt einen Kommentar, den ich an den Android-APIs ändern sollte. Es wurde jedoch nicht angegeben, wie die Änderung vorgenommen werden soll. Kann mir jemand einige Vorschläge dazu geben? Vielen Dank!


Ich habe diesen Artikel gefunden. SpeechRecognizer Seine Bedürfnisse sind fast die gleichen wie meine. Es ist eine gute Referenz für mich!


Ich habe dieses Problem total gelöst.
Ich habe einen verwendbaren Beispielcode von dieser China-Website gegoogelt. Hier ist mein Quellcode

package voice.recognition.test;

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

Stellen Sie sicher, dass Sie die lästigen Protokolle nach dem Debuggen löschen!


1
Es ist definitiv möglich, wie ich es bei anderen Apps gesehen habe (Voice Infinity), aber wie, ich habe keine Ahnung. Ich könnte mir vorstellen, dass Sie zunächst die Android-Quelle herunterladen und in der API nachsehen können, wo sich die Stimme befindet, und dann experimentieren können, um zu erweitern ...
Eric

1
wie Femi erwähnt, stellen Sie sicher , haben <uses-permission android:name="android.permission.RECORD_AUDIO" />in Ihrem AndroidManifest.xml Datei sonst SpeechRecognizer keine Audio abholen
nommer

Antworten:


72

Verwenden Sie die SpeechRecognizer- Oberfläche. Ihre App muss über die Berechtigung RECORD_AUDIO verfügen. Anschließend können Sie einen SpeechRecognizer erstellen, ihm einen RecognitionListener geben und seine startListeningMethode aufrufen . Sie erhalten Rückrufe an den Hörer, wenn der Spracherkenner bereit ist, auf Sprache zu hören, und wenn er Sprache empfängt und in Text konvertiert.


Danke für deinen Rat. Ich werde es jetzt versuchen
Jim31837

10
Vergessen Sie auch nicht, SpeechRecognier in der OnDestroy () -Methode zu zerstören, wie hier angegeben: stackoverflow.com/a/19931355/2048266, um keinen has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414f0e40 that was originally bound hereFehler zu erhalten
nommer

Können Sie mir bitte ein Beispiel zeigen? Kann ich dies auch bei ausgeschaltetem Bildschirm verwenden?
Ruchir Baronia

7

GAST verfügt über eine praktische abstrakte Klasse, mit der Sie die SpeechRecognizerKlasse mit sehr wenig neuem Code verwenden können. Es gibt auch ein Beispiel für die Ausführung des SpeechRecognizerHintergrunddienstes mit diesem und jenem


Würde es Ihnen etwas ausmachen, mich bei der Implementierung in die MainActivity zu unterstützen? Was bedeutet dies "* Verwenden Sie {@link Intent} s, um es zu starten und zu stoppen?" Vielen Dank
Dante

Können Sie mir bitte ein Beispiel zeigen? Kann ich dies auch bei ausgeschaltetem Bildschirm verwenden?
Ruchir Baronia

6

Danke, dass du das gepostet hast! Ich fand es hilfreich, den onclick-Listener in oncreate zu definieren:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mText = (TextView) findViewById(R.id.textView1);     
    MyRecognitionListener listener = new MyRecognitionListener();
    sr = SpeechRecognizer.createSpeechRecognizer(this);       
    sr.setRecognitionListener(listener);

    findViewById(R.id.button1).setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View v) 
        {
                Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);    
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US");
                intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1); 
                intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"voice.recognition.test");
                sr.startListening(intent);
        }
    });     
}

4

Am Ende mache ich ein Github-Projekt, um Text in Sprache und Sprache in Text ohne störenden Dialog umzuwandeln.

https://github.com/hiteshsahu/Android-TTS-STT/tree/master/app/src/main/java/com/hiteshsahu/stt_tts/translation_engine

 //SPEECH TO TEXT DEMO
    speechToText.setOnClickListener({ view ->

        Snackbar.make(view, "Speak now, App is listening", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show()

        TranslatorFactory
                .instance
                .with(TranslatorFactory.TRANSLATORS.SPEECH_TO_TEXT,
                        object : ConversionCallback {
                            override fun onSuccess(result: String) {
                                sttOutput.text = result
                            }

                            override fun onCompletion() {
                            }

                            override fun onErrorOccurred(errorMessage: String) {
                                erroConsole.text = "Speech2Text Error: $errorMessage"
                            }

                        }).initialize("Speak Now !!", this@HomeActivity)

    })


    //TEXT TO SPEECH DEMO
    textToSpeech.setOnClickListener({ view ->

        val stringToSpeak :String = ttsInput.text.toString()

        if (null!=stringToSpeak &&  stringToSpeak.isNotEmpty()) {

            TranslatorFactory
                    .instance
                    .with(TranslatorFactory.TRANSLATORS.TEXT_TO_SPEECH,
                            object : ConversionCallback {
                                override fun onSuccess(result: String) {
                                }

                                override fun onCompletion() {
                                }

                                override fun onErrorOccurred(errorMessage: String) {
                                    erroConsole.text = "Text2Speech Error: $errorMessage"
                                }

                            })
                    .initialize(stringToSpeak, this)

        } else {
            ttsInput.setText("Invalid input")
            Snackbar.make(view, "Please enter some text to speak", Snackbar.LENGTH_LONG).show()
        }

    })

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.