android - servicio - grabar/guardar audio desde la intención de reconocimiento de voz
ok google no graba mi voz (3)
La última vez que lo comprobé, Google Keep configuró estos extras:
- android.speech.extra.GET_AUDIO_FORMAT: audio / AMR
- android.speech.extra.GET_AUDIO: true
Estos no están documentados como parte de la documentación de Android, por lo que no constituyen una API de Android. Además, Google Keep no se basa en la intención del reconocedor de considerar estos extras. Sin duda, sería bueno si tales extras fueran popularizados y documentados por Google.
Para saber qué extras establece Google Keep cuando llama a RecognizerIntent
, implemente una aplicación que responda a RecognizerIntent
e imprima todos los extras que reciba. También puede instalar Kõnele ( http://kaljurand.github.io/K6nele/ ), que es una implementación de RecognizerIntent
. Cuando Kõnele es lanzado por Google Keep, presione prolongadamente el ícono de configuración con forma de llave inglesa. Esto muestra algunos detalles técnicos sobre la persona que llama, e incluye también los extras entrantes.
La respuesta de @Iftah explica cómo Google Keep devuelve la grabación de audio a la persona que llama de RecognizerIntent
.
Antes de hacer esta pregunta, verifiqué todos los subprocesos relacionados con este problema sin ningún éxito, así que, por favor, no responda con enlaces a otros subprocesos, :)
Quiero guardar / grabar el audio que el servicio de reconocimiento de Google usó para la operación de voz a texto (usando RecognizerIntent o SpeechRecognizer).
Experimenté muchas ideas:
- onBufferReceived de RecognitionListener: Sé que esto no funciona, solo pruébelo para ver qué sucede y onBufferReceived nunca se llama (probado en galaxy nexus con JB 4.3)
- utiliza un grabador de medios: no funciona. está rompiendo el reconocimiento de voz. Sólo se permite una operación para el micrófono.
- Intenté encontrar dónde el servicio de reconocimiento está guardando el archivo de audio temporal antes de la ejecución de la API de voz a texto para copiarlo, pero sin éxito.
Estaba casi desesperado, pero me di cuenta de que la aplicación Google Keep está haciendo lo que tengo que hacer. Depuré un poco la aplicación keep usando logcat y la aplicación también está llamando al "RecognizerIntent.ACTION_RECOGNIZE_SPEECH" (como nosotros, los desarrolladores, hacemos) para activar el habla al texto. Pero, ¿cómo guardar es guardar el audio? ¿Puede ser un escondite api? es google "hacer trampa" :)?
Gracias por tu ayuda
Atentamente
Recibí esta respuesta desde aquí, verifiqué las fechas y vi que se publicó pocos días después de tu publicación, así que pensé que te la perdiste. Reconocimiento de voz en Android y grabación de audio al mismo tiempo.
un tipo dice:
Tengo una solución que funciona bien para tener reconocimiento de voz y grabación de audio. Aquí ( https://github.com/katchsvartanian/voiceRecognition ) está el enlace a un proyecto de Android simple que creé para mostrar el funcionamiento de la solución. Además, coloco 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 la grabación de Flac.
La API de Google Speech 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 dúplex completa. Lo que esto significa es que en realidad utiliza dos conexiones HTTP: una solicitud POST para cargar el contenido como una secuencia fragmentada" en vivo "y una "La segunda solicitud GET para acceder a los resultados, lo que tiene mucho más sentido para muestras de audio más largas o para transmitir audio".
Sin embargo, esta API necesita recibir un archivo de sonido FLAC para que funcione correctamente. Eso nos hace pasar a la segunda parte: la grabación de Flac.
Implementé la grabación de Flac en ese proyecto extrayendo y adaptando algunos fragmentos de código y bibliotecas de una aplicación de código abierto llamada AudioBoo. AudioBoo usa código nativo para grabar y reproducir en formato flac.
Por lo tanto, es posible grabar un sonido flac, enviarlo a Google Speech API, obtener el texto y reproducir el sonido que se acaba de grabar.
El proyecto que creé tiene los principios básicos para que funcione y se puede mejorar para situaciones específicas. Para que funcione en un escenario diferente, es necesario obtener una clave de 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 la eliminaré eventualmente. Si alguien necesita más información al respecto, avíseme porque no puedo poner más de 2 enlaces en esta publicación.
La respuesta de @Kaarel está casi completa: el audio resultante está en intent.getData()
y se puede leer utilizando ContentResolver
Desafortunadamente, el archivo AMR que se devuelve es de baja calidad, no pude encontrar una manera de obtener una grabación de alta calidad. Cualquier valor que probé que no sea "audio / AMR" devolvió un valor nulo en intent.getData()
.
Si encuentra una manera de obtener una grabación de alta calidad, ¡por favor comente o agregue una respuesta!
public void startSpeechRecognition() {
// Fire an intent to start the speech recognition activity.
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
// secret parameters that when added provide audio url in the result
intent.putExtra("android.speech.extra.GET_AUDIO_FORMAT", "audio/AMR");
intent.putExtra("android.speech.extra.GET_AUDIO", true);
startActivityForResult(intent, "<some code you choose>");
}
// handle result of speech recognition
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// the resulting text is in the getExtras:
Bundle bundle = data.getExtras();
ArrayList<String> matches = bundle.getStringArrayList(RecognizerIntent.EXTRA_RESULTS)
// the recording url is in getData:
Uri audioUri = data.getData();
ContentResolver contentResolver = getContentResolver();
InputStream filestream = contentResolver.openInputStream(audioUri);
// TODO: read audio file from inputstream
}