¿Cómo puedo usar el reconocimiento de voz sin el molesto diálogo en teléfonos Android?

124

¿Es esto posible sin modificar las API de Android? Encontré un artículo sobre esto. Hay un comentario que debería hacer modificaciones a las API de Android. Pero no decía cómo hacer la modificación. ¿Alguien puede darme algunas sugerencias sobre cómo hacer eso? ¡Gracias!


He encontrado este artículo; SpeechRecognizer Sus necesidades son casi las mismas que las mías. ¡Es una buena referencia para mí!


Tengo totalmente resuelto este problema.
Busqué en Google un código de muestra utilizable de este sitio web de China Aquí está mi código fuente

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

¡Asegúrese de eliminar los molestos registros después de la depuración!

Jim31837
fuente
1
Definitivamente es posible hacerlo, como he visto que otras aplicaciones lo hacen (Voz infinita) pero en cuanto a cómo, no tengo ni idea. Me imagino que usted podría comenzar mediante la descarga de la fuente de Android y en el registro de la API, donde la voz es, y luego experimento se extiende ...
Eric
1
según lo observado por Femi, asegúrese de tener <uses-permission android:name="android.permission.RECORD_AUDIO" />en su archivo AndroidManifest.xml lo contrario SpeechRecognizer no va a recoger a cualquier archivo de audio
nommer

Respuestas:

72

Use la interfaz SpeechRecognizer . Su aplicación debe tener el permiso RECORD_AUDIO, y luego puede crear un SpeechRecognizer, darle un RecognitionListener y luego llamar a su startListeningmétodo. Recibirá devoluciones de llamada al oyente cuando el reconocedor de voz esté listo para comenzar a escuchar la voz y cuando reciba la voz y la convierta en texto.

Femi
fuente
Gracias por su consejo. Lo intentaré ahora
Jim31837
10
tampoco olvides destruir SpeechRecognier en el método OnDestroy () como se indica aquí: stackoverflow.com/a/19931355/2048266 para que no se has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414f0e40 that was originally bound here
produzca
¿Me puede mostrar un ejemplo? Además, ¿puedo usar esto mientras la pantalla está apagada?
Ruchir Baronia
7

GAST tiene una práctica clase abstracta que puede usar para usar la SpeechRecognizerclase con muy poco código nuevo. También hay un ejemplo de SpeechRecognizercómo ejecutar un servicio en segundo plano con esto y esto

Gregm
fuente
¿Te importaría guiarme sobre cómo implementarlos en MainActivity? ¿Qué significa esto "* Use {@link Intent} s para iniciarlo y detenerlo?" Muchas gracias
Dante
¿Me puede mostrar un ejemplo? Además, ¿puedo usar esto mientras la pantalla está apagada?
Ruchir Baronia
6

¡Gracias por publicar esto! Me pareció útil definir el oyente onclick en 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);
        }
    });     
}
mnutsch
fuente
4

Termino haciendo el proyecto Github para convertir texto en voz y voz en texto sin molestos diálogos,

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

    })

ingrese la descripción de la imagen aquí

Hitesh Sahu
fuente