2011-05-06 31 views
9

Estoy buscando crear una aplicación que tenga voz a texto.Voz a texto en Android

Soy consciente de este tipo de habilidad utilizando la RecognizerIntent: http://android-developers.blogspot.com/search/label/Speech%20Input

Sin embargo - No quiero un nuevo intento de estar aparecido, quiero hacer el análisis a ciertos puntos en mi aplicación actual, y No quiero que aparezca algo que indique que actualmente está intentando grabar su voz.

Alguien tiene alguna idea sobre la mejor manera de hacerlo. Tal vez estaba pensando en probar Sphinx 4, pero no sé si esto podría funcionar en Android. ¿Alguien tiene algún consejo o experiencia?

Me preguntaba si podría alterar el código aquí para quizá sin molestarse para mostrar la interfaz de usuario o el botón y simplemente hacer el procesamiento: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.html

Cheers,

+0

¿Estás tratando de preguntar si necesita grabadora de voz sin necesidad de invocar la interfaz de usuario. –

+0

Quiero hablar a texto sin invocar la interfaz de usuario de speak speak típica. Quiero que se realice en segundo plano de la aplicación que estoy ejecutando actualmente. – RenegadeAndy

Respuesta

13

Si no desea utilizar el RecognizerIntent hacer el reconocimiento de voz, que aún se podía utilizar la clase SpeechRecognizer para hacerlo. Sin embargo, usar esa clase es un poco más complicado que usar la intención. Como nota final, sugiero que el usuario sepa cuándo está grabado, de lo contrario podría estar muy configurado cuando finalmente lo descubra.

Editar: Un pequeño ejemplo inspirado (pero cambiado) de this stack overflow entry

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, 
      "com.domain.app"); 

    SpeechRecognizer recognizer = SpeechRecognizer 
      .createSpeechRecognizer(this.getApplicationContext()); 
    RecognitionListener listener = new RecognitionListener() { 
     @Override 
     public void onResults(Bundle results) { 
      ArrayList<String> voiceResults = results 
        .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
      if (voiceResults == null) { 
       Log.e(TAG, "No voice results"); 
      } else { 
       Log.d(TAG, "Printing matches: "); 
       for (String match : voiceResults) { 
        Log.d(TAG, match); 
       } 
      } 
     } 

     @Override 
     public void onReadyForSpeech(Bundle params) { 
      Log.d(TAG, "Ready for speech"); 
     } 

     @Override 
     public void onError(int error) { 
      Log.d(TAG, 
        "Error listening for speech: " + error); 
     } 

     @Override 
     public void onBeginningOfSpeech() { 
      Log.d(TAG, "Speech starting"); 
     } 

     @Override 
     public void onBufferReceived(byte[] buffer) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onEndOfSpeech() { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onEvent(int eventType, Bundle params) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onPartialResults(Bundle partialResults) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onRmsChanged(float rmsdB) { 
      // TODO Auto-generated method stub 

     } 
    }; 
    recognizer.setRecognitionListener(listener); 
    recognizer.startListening(intent); 

Importante: Ejecutar el código de la interfaz de usuario de rosca.

+0

Oye - Sí, ellos lo sabrán - va a ser parte de un juego que ves - por lo que será muy claro que querrán hablar en esos puntos específicos. La clase de reconocedor de voz podría ser lo que quiero usar, sin embargo, me encantaría un ejemplo de su uso. ¿¡Tengo uno!? – RenegadeAndy

+1

Agregué un pequeño ejemplo.Esto funciona bien desde el método 'onCreate()' en mi pequeño proyecto de prueba. No olvides obtener el permiso apropiado (RECORD_AUDIO). – Stephan

+0

Fantástico: ejecutar esto en mi emulador devuelve: 05-06 20: 19: 38.527: ERROR/SpeechRecognizer (1745): no hay servicio de reconocimiento de voz seleccionado – RenegadeAndy

4

lo que se construye en Android (que inicie a través del intento) es una actividad del cliente que captura su voz y envía el audio a un servidor de Google para su reconocimiento. Podrías construir algo similar. Puede alojar sphinx usted mismo (o utilizar servicios de reconocimiento en la nube como Yapme.com), capturar la voz usted mismo, enviar el audio a un reconocedor y obtener resultados de texto para su aplicación. No conozco una manera de aprovechar los servicios de reconocimiento de Google sin usar Intent en Android (o a través de Chrome).

El consenso general que he visto hasta ahora es que los teléfonos inteligentes de hoy en día realmente no tienen la potencia necesaria para hacer un reconocimiento de voz similar a Sphinx. Es posible que desee explorar la ejecución de un reconocedor de cliente para usted, pero Google utiliza el reconocimiento de servidor.

Por alguna información relacionada ver:

0

En su actividad haga lo siguiente:

Image button buttonSpeak = findView....;// initialize it. 
buttonSpeak.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      promptSpeechInput(); 
     } 
    }); 



private void promptSpeechInput() { 
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()); 
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, 
      getString(R.string.speech_prompt)); 
    try { 
     startActivityForResult(intent, REQ_CODE_SPEECH_INPUT); 
    } catch (ActivityNotFoundException a) { 
     Toast.makeText(getApplicationContext(), 
       getString(R.string.speech_not_supported), 
       Toast.LENGTH_SHORT).show(); 
    } 
} 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent 
    data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    switch (requestCode) { 
     case REQ_CODE_SPEECH_INPUT: { 
      if (resultCode == RESULT_OK && null != data) { 

       result = data 
         .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 

     EditText input ((EditText)findViewById(R.id.editTextTaskDescription)); 
     input.setText(result.get(0)); // set the input data to the editText alongside if want to. 

      } 
      break; 
     } 

    } 
}