Как отключить AGC на HTC EVO (Supersonic)? - PullRequest
4 голосов
/ 09 июня 2010

Я работаю над приложением, которое должно выполнять алгоритмы распознавания необработанного звука PCM, захваченного с микрофона. На всех устройствах Android, которые я тестировал, данные PCM можно использовать (т. Е. Необработанные аудиоданные.) Это не относится к новому Sprint EVO.

Sprint EVO имеет AGC (Auto Gain Control) на микрофоне, который уничтожает данные так, что наши алгоритмы распознавания больше не работают.

Я полагаю, что это функция, которую HTC добавила в ОС для этого устройства (и, возможно, для будущих устройств). Я протестировал наше приложение на нескольких других устройствах, используя ту же версию ОС (2.1), и эти другие устройства ведут себя нормально .

К сожалению, HTC еще не опубликовала код, используемый на этом устройстве. Я ожидаю, что мне, возможно, придется использовать JNI, чтобы обойти это для этого конкретного устройства, и я готов сделать это, но без доступа к источнику HTC, я не знаю, с чего начать.

Нет способа обратить эффекты AGC, поэтому я застрял, пытаясь обойти это.

Более конкретная информация:

Я использую AudioRecorder для получения доступа к необработанным данным PCM. Я пробовал несколько программ, которые используют MediaRecorder для записи данных AMR, и эти записи также показывают те же свойства AGC.

Одна вещь, которую мне еще предстоит попробовать, - написать свои собственные подпрограммы для использования MediaRecorder и использовать setAudioSource (AudioSource.VOICE_RECOGNITION). Единственная документация, которую я могу найти по этому флагу, содержится в справочнике по Android, в котором просто говорится: «Источник звука для микрофона, настроенный для распознавания голоса, если он доступен, в противном случае ведет себя как ПО УМОЛЧАНИЮ». Это может быть тем, что мне нужно, но потребует дополнительного этапа декодирования данных AMR, чтобы получить данные PCM (что я и сделаю, если придется).

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

  1. Эта новая функция предназначена для HTC?
  2. Когда HTC выпустит свою кодовую базу для EVO / Supersonic?
  3. Кто-нибудь еще сталкивался с этим и нашел способ обойти проблему?
  4. AudioSource.VOICE_RECOGNITION действительно предотвращает AGC?
  5. Указывает ли наличие AudioSource.VOICE_RECOGNITION, что это ожидается более распространенным в будущих устройствах, и этот флаг является условием для его обхода?

Любые другие подсказки, советы, подсказки будут с благодарностью.

Ответы [ 2 ]

6 голосов
/ 09 июня 2010

Как выяснилось, я нашел решение во время просмотра депо Android git:

AudioRecord ar = 
    new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, ...);

Для устройств, работающих под управлением ОС 2.1 и выше, это позволяет получать аудиопоток, на который не влияет AGC, и который по-прежнему является высококачественным 16-разрядным потоком данных PCM.

Я нацеливаюсь на мое приложение на уровне 1,5 и выше, и этот флаг VOICE_RECOGNITION не поддерживается до API уровня 7 (ОС 2.1). Тем не менее, поскольку EVO работает под управлением v2.1, и я относительно уверен, что это не будет проблемой для любого устройства до OS 2.1, простая проверка версии поможет решить проблему только теми устройствами, которые нуждаются в поддержать его.

0 голосов
/ 28 февраля 2013

К сожалению,

AudioRecord ar = 
    new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, ...);

не является общим решением.Некоторые производители применяют AGC, даже если выбран MediaRecorder.AudioSource.VOICE_RECOGNITION.Они просто игнорируют «Определение совместимости» от Google.См. Как избежать автоматической регулировки усиления с помощью AudioRecord?

...