Es posible hacer SpeechRecognizer más rápido?

Estoy desarrollando una aplicación que está usando el android SpeechRecognizer. Lo estoy usando para algo sencillo. Hago clic en un botón, mi SpeechRecognizer comienza a escuchar y obtuve algunos resultados de lo que dije.

Fácil, ¿cierto? Bueno, mi problema es que tengo que hacer SpeechRecognizer rápido. Quiero decir, hago clic en mi botón, digo "Hola" y SpeechRecognizer toma como 3-4 segundos en retorno una matriz con los posibles resultados. Mi pregunta es:

¿Es posible hacer que los resultados de devolución de SpeechRecognizer sean más rápidos? ¿O toma menos tiempo para cerrar la intención de escuchar y empezar a procesar lo que escucha? Tal vez otra manera de hacerlo? Que tendrá un mejor rendimiento que esto?

Estaba revisando la biblioteca y vi estos 3 parámetros:

EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS:

La cantidad de tiempo que debe tomar después de que dejemos de escuchar el habla para considerar la entrada completa.

EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS

La longitud mínima de un enunciado.

EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS

La cantidad de tiempo que debe tomar después de que dejemos de escuchar el habla para considerar la entrada posiblemente completa.

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

He intentado todos ellos, pero no está funcionando, o tal vez no estoy usando rigth. Aquí está mi código:

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

¡Gracias por su tiempo a todos! Espero que alguien me pueda ayudar un poco: P!

Sí, es posible reducir el retraso antes del apagado ….

No se puede alterar la cantidad de tiempo que Google considera ser el silencio al final de un usuario hablando. Los parámetros EXTRA_SPEECH_* utilizados para trabajar, ahora parecen trabajar esporádicamente en el mejor de los casos, o no funcionan en absoluto.

Lo que puede hacer, es usar los resultados parciales para detectar las palabras o frase que desee y luego apagar manualmente el servicio de reconocimiento.

He aquí un ejemplo de cómo hacer esto:

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

Ejecutaría este método cada vez que recibas de onPartialResults()

Si se devuelve true, tendrá que llamar a stopListening() en el hilo principal (probablemente por new Handler(Looper.getMainLooper()).post(...

Tenga en cuenta, sin embargo, una vez que haya apagado el reconocedor, los resultados posteriores y finales que recibe en onResults() no pueden contener "hola". Dado que esa palabra sólo puede ser clasificada como inestable.

Tendrás que escribir una lógica adicional para evitar usar detectHello() una vez que hola se ha detectado (de lo contrario, repetidamente llamarás stopListening() ) – algunos simples marcadores booleanos resolverían esto.

Por último, el uso de Collections.singleton("") para eliminar cadenas vacías es parte de un informe de error interno, los detalles para replicar aquí y el uso de un ListIterator puede ser excesivo para sólo su muestra; Un bucle simple sería suficiente.

Buena suerte.

  • SpeechRecognizer lanza onError en la primera escucha
  • ¿Cómo convertir el habla al texto durante la llamada con diferentes colores de texto para el llamante y el receptor de llamadas?
  • Comparar dos voces en android
  • Silenciar el sonido de reconocimiento de voz de Google
  • Reconocimiento de voz continua Android - Sin lagunas
  • Comparar voz wav en android o etiqueta de voz (comandos de voz) API
  • Android SpeechRecognizer: stopListening () contra cancelar ()
  • Continúa el sonido del pitido de reconocimiento de voz después de actualizar la búsqueda de Google
  • Aplicación para Android con direcciones de voz GPS
  • PhoneStateListener onMessageWaitingIndicatorChanged () no se llama de forma fiable
  • Discurso a texto en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.