Comment puis-je utiliser la reconnaissance vocale sans la boîte de dialogue ennuyeuse dans les téléphones Android


124

Est-ce possible sans modifier les API Android? J'ai trouvé un article à ce sujet. Il y a un commentaire selon lequel je devrais apporter des modifications aux API Android. Mais il n'a pas dit comment faire la modification. Quelqu'un peut-il me donner des suggestions sur la façon de procéder? Merci!


J'ai trouvé cet article; SpeechRecognizer Ses besoins sont presque les mêmes que les miens. C'est une bonne référence pour moi!


J'ai totalement résolu ce problème.
J'ai recherché sur Google un exemple de code utilisable sur ce site Web chinois Voici mon code source

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

Assurez-vous de supprimer les journaux ennuyeux après le débogage!


1
C'est certainement possible de le faire, comme j'ai vu d'autres applications le faire (Voice infinity), mais quant à la façon dont, je n'ai aucune idée. J'imagine que vous pourriez commencer par télécharger la source Android et vérifier dans l'API où se trouve la voix, puis expérimenter l'extension ...
Eric

1
comme noté par Femi, assurez-vous d'avoir <uses-permission android:name="android.permission.RECORD_AUDIO" />dans votre fichier AndroidManifest.xml sinon SpeechRecognizer ne capturera aucun audio
nommer

Réponses:


72

Utilisez l' interface SpeechRecognizer . Votre application doit disposer de l'autorisation RECORD_AUDIO, et vous pouvez ensuite créer un SpeechRecognizer, lui attribuer un RecognitionListener , puis appeler sa startListeningméthode. Vous obtiendrez des rappels à l'auditeur lorsque le module de reconnaissance vocale sera prêt à commencer à écouter la parole et lorsqu'il recevra la parole et la convertira en texte.


Merci pour vos conseils. Je vais essayer maintenant
Jim31837

10
n'oubliez pas non plus de détruire SpeechRecognier dans la méthode OnDestroy () comme indiqué ici: stackoverflow.com/a/19931355/2048266 pour ne pas obtenir d' has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414f0e40 that was originally bound hereerreur
nommer

Pouvez-vous me montrer un exemple? Puis-je également l'utiliser lorsque l'écran est éteint?
Ruchir Baronia

7

GAST a une classe abstraite pratique que vous pouvez utiliser pour utiliser la SpeechRecognizerclasse avec très peu de nouveau code. Il existe également un exemple d'exécution du SpeechRecognizerservice d'arrière-plan en utilisant ceci et cela


Pourriez-vous me guider sur la façon de les implémenter dans MainActivity? Qu'est-ce que cela signifie "* Utilisez les {@link Intent} s pour le démarrer et l'arrêter?" Merci beaucoup
Dante

Pouvez-vous me montrer un exemple? Puis-je également l'utiliser lorsque l'écran est éteint?
Ruchir Baronia

6

Merci d'avoir publié ceci! J'ai trouvé utile de définir l'écouteur onclick dans oncreate:

@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

Je finis par faire un projet Github pour convertir du texte en parole et de la parole en texte sans dialogue ennuyeux,

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

    })

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.