Подтвердить что ты не робот

Сохранение аудио входа в систему распознавания речи 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?

4b9b3361

Ответ 1

Вы не указали свой код для фактического написания данных 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-writer, помните, что типы данных Java big-endian, поэтому любые многобайтовые примитивы, которые вы пишете в файл, должны быть записанный в порядок обратного байта, чтобы соответствовать малому концу RIFF.

Ответ 2

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