¿Reconocimiento de voz en Android con un clip de sonido grabado?

Utilicé la función de reconocimiento de voz en Android y me encanta. Es una de las características más alabadas de mis clientes. Sin embargo, el formato es algo restrictivo. Debe invocar la intención del reconocedor, hacer que envíe la grabación para su transcripción a google y esperar a que el texto vuelva.

Algunas de mis ideas requerirían grabar el audio dentro de mi aplicación y luego enviar el clip a Google para su transcripción.

¿Hay alguna manera de que pueda enviar un clip de audio para procesarlo con voz a texto?

Obtuve una solución que funciona bien para tener reconocimiento de voz y grabación de audio. Aquí está el enlace a un simple proyecto de Android que creé para mostrar que la solución funciona. Además, puse algunas pantallas de impresión dentro del proyecto para ilustrar la aplicación.

Voy a tratar de explicar brevemente el enfoque que utilicé. Combiné dos características en ese proyecto: Google Speech API y grabación Flac.

Google Speech API se llama a través de conexiones HTTP. Mike Pultz da más detalles sobre la API:

“(…) la nueva API [Google] es una API de transmisión en dúplex completo. Lo que esto significa es que realmente usa dos conexiones HTTP: una solicitud POST para cargar el contenido como una transmisión en serie” en vivo “y una la segunda solicitud GET para acceder a los resultados, que tiene mucho más sentido para muestras de audio más largas, o para la transmisión de audio “.

Sin embargo, esta API necesita recibir un archivo de sonido FLAC para funcionar correctamente. Eso nos lleva a la segunda parte: Grabación de Flac

Implementé la grabación de Flac en ese proyecto mediante la extracción y adaptación de algunos códigos y bibliotecas de una aplicación de código abierto llamada AudioBoo. AudioBoo usa código nativo para grabar y reproducir formato flac.

Por lo tanto, es posible grabar un sonido de flac, enviarlo a Google Speech API, obtener el texto y reproducir el sonido que acaba de grabarse.

El proyecto que creé tiene los principios básicos para que funcione y se pueda mejorar para situaciones específicas. Para que funcione en un escenario diferente, es necesario obtener una clave API de Google Speech, que se obtiene al formar parte del grupo Google Chromium-dev. Dejé una clave en ese proyecto solo para mostrar que está funcionando, pero eventualmente la eliminaré. Si alguien necesita más información al respecto, házmelo saber porque no puedo poner más de 2 enlaces en esta publicación.

Lamentablemente, no en este momento. La única interfaz admitida actualmente por el servicio de reconocimiento de voz de Android es RecognizerIntent , que no le permite proporcionar sus propios datos de sonido.

Si esto es algo que le gustaría ver, presente una solicitud de función en http://b.android.com . Esto también está relacionado tangencialmente con el problema 4541 existente.

Por lo que sé, todavía no hay forma de enviar directamente un clip de audio a Google para su transcripción. Sin embargo, Froyo (API nivel 8) introdujo la clase SpeechRecognizer , que proporciona acceso directo al servicio de reconocimiento de voz. Entonces, por ejemplo, puede iniciar la reproducción de un clip de audio y hacer que su actividad inicie el reconocimiento de voz escuchando en segundo plano, lo que devolverá los resultados después de la finalización a un método de callback del oyente definido por el usuario.

El siguiente código de ejemplo debe definirse dentro de una Actividad, ya que los métodos de SpeechRecognizer se deben ejecutar en la cadena principal de la aplicación. También necesitará agregar el permiso RECORD_AUDIO a su AndroidManifest.xml.

boolean available = SpeechRecognizer.isRecognitionAvailable(this); if (available) { SpeechRecognizer sr = SpeechRecognizer.createSpeechRecognizer(this); sr.setRecognitionListener(new RecognitionListener() { @Override public void onResults(Bundle results) { // process results here } // define your other overloaded listener methods here }); Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); // the following appears to be a requirement, but can be a "dummy" value intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.dummy"); // define any other intent extras you want // start playback of audio clip here // this will start the speech recognizer service in the background // without starting a separate activity sr.startListening(intent); }
boolean available = SpeechRecognizer.isRecognitionAvailable(this); if (available) { SpeechRecognizer sr = SpeechRecognizer.createSpeechRecognizer(this); sr.setRecognitionListener(new RecognitionListener() { @Override public void onResults(Bundle results) { // process results here } // define your other overloaded listener methods here }); Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); // the following appears to be a requirement, but can be a "dummy" value intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.dummy"); // define any other intent extras you want // start playback of audio clip here // this will start the speech recognizer service in the background // without starting a separate activity sr.startListening(intent); } 

También puede definir su propio servicio de reconocimiento de voz extendiendo RecognitionService , pero eso está más allá del scope de esta respuesta 🙂