Guardar la entrada de audio del motor de reconocimiento de voz de Android Stock

Estoy tratando de guardar en un archivo los datos de audio escuchados por el servicio de reconocimiento de voz de android.

En realidad implemento RecognitionListener como se explica aquí: Discurso a texto en Android

Guarde los datos en un búfer como se ilustra aquí: Captura de audio enviado al servidor de reconocimiento de voz de Google

Y escribir el búfer en un archivo Wav, como aquí. Android Registra octetos sin formato en el archivo WAVE para Http Streaming

Mi problema es cómo obtener la configuración de audio adecuada para guardar en los encabezados del archivo wav. De hecho cuando juego el archivo del wav solamente oigo el ruido extraño, con estos parámetros,

 short nChannels=2;// audio channels int sRate=44100; // Sample rate short bSamples = 16;// byteSample 

O nada con esto:

 short nChannels=1;// audio channels int sRate=8000; // Sample rate short bSamples = 16;// byteSample 

Lo que es confuso es que mirando los parámetros de la tarea de reconocimiento de voz de logcat encuentro primero Ajuste la tasa de muestreo de reproducción a 44100 HZ :

  12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Set PLAYBACK PCM format to S16_LE (Signed 16 bit Little Endian) 12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Using 2 channels for PLAYBACK. 12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Set PLAYBACK sample rate to 44100 HZ 12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Buffer size: 2048 12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Latency: 46439 

Y luego aInfo.SampleRate = 8000 cuando reproduce el archivo para enviarlo al servidor de google:

  12-20 14:41:36.152: DEBUG/(2364): PV_Wav_Parser::InitWavParser 12-20 14:41:36.152: DEBUG/(2364): File open Succes 12-20 14:41:36.152: DEBUG/(2364): File SEEK End Succes ... 12-20 14:41:36.152: DEBUG/(2364): PV_Wav_Parser::ReadData 12-20 14:41:36.152: DEBUG/(2364): Data Read buff = RIFF? 12-20 14:41:36.152: DEBUG/(2364): Data Read = RIFF? 12-20 14:41:36.152: DEBUG/(2364): PV_Wav_Parser::ReadData 12-20 14:41:36.152: DEBUG/(2364): Data Read buff = fmt ... 12-20 14:41:36.152: DEBUG/(2364): PVWAVPARSER_OK 12-20 14:41:36.156: DEBUG/(2364): aInfo.AudioFormat = 1 12-20 14:41:36.156: DEBUG/(2364): aInfo.NumChannels = 1 12-20 14:41:36.156: DEBUG/(2364): aInfo.SampleRate = 8000 12-20 14:41:36.156: DEBUG/(2364): aInfo.ByteRate = 16000 12-20 14:41:36.156: DEBUG/(2364): aInfo.BlockAlign = 2 12-20 14:41:36.156: DEBUG/(2364): aInfo.BitsPerSample = 16 12-20 14:41:36.156: DEBUG/(2364): aInfo.BytesPerSample = 2 12-20 14:41:36.156: DEBUG/(2364): aInfo.NumSamples = 2258 

Entonces, ¿cómo puedo averiguar los parámetros adecuados para guardar el búfer de audio en un buen archivo de audio wav?

Usted no ha incluido su código para escribir los datos PCM, por lo que es difícil de diagnosticar, pero si está escuchando ruidos extraños, entonces parece más probable que tenga el endian equivocado cuando está escribiendo los datos, o el número equivocado de Canales. Obtener la frecuencia de muestreo equivocada sólo resultará en el sonido de audio más lento o más rápido, pero si suena completamente ilegible es probablemente un error al especificar el número de canales o endianess de su flujo de bytes.

Para saber con seguridad, solo transmita sus bytes directamente a un archivo sin ningún encabezado (datos PCM sin procesar). De esta manera puede descartar cualquier error al escribir el encabezado del archivo. A continuación, utilice Audacity para importar los datos sin procesar, experimentando con las diferentes opciones (profundidad de bits, endian, canales) hasta que obtenga un archivo de audio que suene correcto (sólo uno será correcto). Esto se hace desde Archivo-> Importación-> Datos brutos …

Una vez que haya identificado su formato de bytes de esta manera sólo tiene que preocuparse por si está configurando los encabezados correctamente. Es posible que desee referirse a esta referencia http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html para el formato de archivo. O vea los siguientes enlaces sobre las soluciones Java existentes en la escritura de archivos de audio, lectura en Java, manipulación y escritura de archivos WAV , o FMJ . Aunque supongo que estos no pueden ser utilizables en Android.

Si tiene que rodar su propio grabador WAV / RIFF, recuerde que los tipos de datos de Java son big-endian, por lo que cualquier primitivo de varios bytes que escriba en su archivo debe escribirse en orden de byte inverso para que coincida con el pequeño endianess de RIFF.

8000 , little endian, 16 bit PCM , canal mono hizo el truco

En la última versión onBufferReceived no funciona, puede utilizar grabación / guardar audio de la intención de reconocimiento de voz en su lugar.

  • Cordova-plugin-media: Analiza ".amr" Archivo de audio en el servidor nodejs
  • Usar AudioTrack de Android para combinar bytes de muestras de sonido produce ruido
  • Creación de un archivo WAV a partir de datos PCM sin procesar utilizando el SDK de Android
  • Cómo reproducir un archivo de onda comprimido en Flash Mobile
  • No se puede reproducir un archivo .wav invertido con MediaPlayer
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.