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!

One Solution collect form web for “Es posible hacer SpeechRecognizer más rápido?”

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 sin conexión ERROR_NO_MATCH
  • ¿Cómo convertir el habla al texto durante la llamada con diferentes colores de texto para el llamante y el receptor de llamadas?
  • Discurso a texto en Android
  • Integre el reconocimiento de voz de Google en la aplicación para Android
  • ¿Cómo pasar el texto a Google Voice SMS mediante programación?
  • Biometría de voz para Android
  • Android TTS Masculino Masculino Voz Cambio
  • ¿Cómo puede hacer que el reconocimiento de voz del soporte para el emulador android
  • Reconocimiento de voz fuera de línea
  • Voice Matcher para combinar la contraseña de voz en Android (Comparar voz)
  • ¿Hay alguna manera de detectar si un teléfono Android es compatible con la integración de Voicemail en el registro de llamadas?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.