Сохранение аудиовхода движка распознавания речи Android Stock - PullRequest
38 голосов
/ 21 декабря 2011

Я пытаюсь сохранить в файл аудиоданные, прослушиваемые службой распознавания речи 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?

Ответы [ 3 ]

6 голосов
/ 30 мая 2012

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

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

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

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

2 голосов
/ 11 июля 2012

8000 , младший порядок, 16 бит PCM , моноканал добился цели

0 голосов
/ 03 февраля 2016

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

...