Сохранение аудио входа в систему распознавания речи Android Stock

Я пытаюсь сохранить в файле аудиоданные, прослушиваемые службой распознавания речи для android.

Фактически я реализую RecognitionListener как описано здесь: Речь в текст на Android

Сохраните данные в буфер, как показано здесь: Захват звука, отправленного на сервер распознавания речи Google

И напишите буфер в файл Wav, как здесь. Android Запись необработанных байтов в WAVE-файл для потоковой передачи Http

Моя проблема заключается в том, как получить соответствующие настройки звука для сохранения в заголовках wav-файла. На самом деле, когда я играю в wav-файл, слышу только странный шум, с такими параметрами,

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

Или ничего с этим:

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

Что сбивает с толку, так это то, что глядя на параметры задачи распознавания речи из logcat, я нахожу сначала Установите частоту дискретизации PLAYBACK в 44100 Гц :

  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 

А затем aInfo.SampleRate = 8000, когда он воспроизводит файл для отправки на сервер 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 

Итак, как я могу узнать правильные параметры для сохранения звукового буфера в хорошем звуковом файле wav?

Solutions Collecting From Web of "Сохранение аудио входа в систему распознавания речи Android Stock"

Вы не включили свой код для фактического вывода данных PCM, поэтому его трудно диагностировать, но если вы слышите странные звуки, то, скорее всего, у вас неправильный конец, когда вы пишете данные, или неправильное количество каналы. Получение неправильной выборки приведет только к медленному или более быстрому звучанию звука, но если это звучит полностью искаженным, это, вероятно, является ошибкой при определении количества каналов или энтериантности вашего байтового потока.

Чтобы точно знать, просто передайте свои байты непосредственно в файл без заголовка (необработанные данные PCM). Таким образом, вы можете исключить любые ошибки при записи заголовка файла. Затем используйте Audacity для импорта необработанных данных, экспериментируя с различными параметрами (бит-глубина, конец, каналы), пока не получите правильный звуковой файл (только один будет прав). Вы делаете это из File-> Import-> Raw Data …

Как только вы определили свой формат байта таким образом, вам нужно только беспокоиться о правильности настройки заголовков. Вы можете обратиться к этой ссылке http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html для формата файла. Или см. Следующие ссылки на существующие Java-решения при записи аудиофайлов, Java-чтение, управление и запись WAV-файлов или FMJ . Хотя я думаю, что они могут не использоваться на Android.

Если вам приходится откатывать свой собственный WAV / RIFF-writer, помните, что типы данных Java являются большими, поэтому любые многобайтовые примитивы, которые вы пишете в свой файл, должны быть записаны в порядке обратного байта, чтобы соответствовать малопринятому RIFF.

8000 , маленький конец, 16 бит PCM , моно канал сделал трюк

В последней версии onBufferReceived не работает, вы можете использовать запись / сохранение звука из намерения распознавания голоса .