android - ver - guardando audio en gmail
Cómo guardar la entrada de audio del motor de reconocimiento de voz de Android Stock (3)
Estoy tratando de guardar en un archivo los datos de audio escuchados por el servicio de reconocimiento de voz de Android.
En realidad, implementé RecognitionListener
como se explica aquí: Speech to Text 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 escribe el búfer en un archivo Wav, como aquí. Android Grabe los bytes sin procesar 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 reproduzco el archivo wav solo escucho 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 al mirar los parámetros de la tarea de reconocimiento de voz de Logcat, primero encuentro la frecuencia de muestreo de REPRODUCCIÓN en 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 a Google Server:
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 encontrar los parámetros correctos para guardar el buffer de audio en un buen archivo de audio wav?
En la última versión, onBufferReceived no funciona, puede usar grabar / guardar audio desde el intento de reconocimiento de voz en su lugar.
No ha incluido su código para realmente escribir los datos de PCM, por lo que es difícil de diagnosticar, pero si escucha ruidos extraños, es muy probable que tenga el endian equivocado cuando está escribiendo los datos, o el número equivocado de canales Obtener la frecuencia de muestreo incorrecta solo hará que el sonido suene más lento o más rápido, pero si suena completamente distorsionado, probablemente sea un error especificar el número de canales o la duración de la transmisión de bytes.
Para estar seguro, solo transmita sus bytes directamente a un archivo sin ningún encabezado (datos PCM sin procesar). De esta forma, puede descartar cualquier error al escribir su encabezado de archivo. Luego use Audacity para importar los datos brutos, experimentando con las diferentes opciones (profundidad de bit, endian, canales) hasta que obtenga un archivo de audio que suene correcto (solo uno será el correcto). Lo hace desde Archivo-> Importar-> Datos brutos ...
Una vez que haya identificado su formato de bytes de esta manera, solo tendrá que preocuparse de si está configurando los encabezados correctamente. Es posible que desee consultar esta referencia http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html para el formato de archivo. O vea los siguientes enlaces sobre soluciones Java existentes para escribir archivos de audio, Java: leer, manipular y escribir archivos WAV o FMJ . Aunque supongo que estos pueden no ser utilizables en Android.
Si tiene que pasar su propio escritor WAV / RIFF, recuerde que los tipos de datos de Java son big-endian por lo que las primitivas multibyte que escriba en su archivo deben escribirse en orden inverso de bytes para que coincidan con la poca endiabilidad de RIFF.
8000 , little endian, PCM de 16 bits , mono canal hizo el truco