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
- Cómo simular la entrada de audio a micrófono utilizando el archivo .wav
- Cómo agregar efecto de eco a archivo wav en android?
- Usar AudioTrack de Android para combinar bytes de muestras de sonido produce ruido
- No se puede reproducir un archivo .wav invertido con MediaPlayer
- Cordova-plugin-media: Analiza ".amr" Archivo de audio en el servidor nodejs
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?
- Escritura de datos grabados PCM en un archivo .wav (java android)
- MediaPlayer onCompletion no se llama con precisión
- Android Streaming Wav Error de audio: Preparación de MediaPlayer: status = 0x1
- Cómo convertir el archivo WAV / OGG a archivo FLAC en Android?
- Cómo codificar un WAV a un mp3 en un dispositivo Android
- Archivo de audio inverso en Android
- Cómo reproducir un archivo de onda comprimido en Flash Mobile
- Codificar wav a AAC en Android
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.
- ¿Cuáles son la semántica de withValueBackReference?
- ¡Desajuste del tarro! Corregir sus dependencias para el FacebookSDK