Android отменить вывод динамиков. Устранить обратную связь по телефону
Я занимаюсь разработкой приложения для распознавания речи. Мне нужно распознавать слова, когда телефон звонит, но для этого я должен отменить вклад динамиков в микрофон. Поэтому я хочу, чтобы микрофон игнорировал весь звук, исходящий из динамиков.
Я обнаружил, что AcousticEchoCanceler используется для приложений VoIP для отмены эха, но я пытался его использовать, и нет разницы, когда на моем телефоне звучит сигнал.
Я читаю аудио из объекта AudioRecord, называемого "рекордер", а затем применяю AcousticAudioCanceler
boolean isAvailable = AcousticEchoCanceler.isAvailable();
if (isAvailable) {
AcousticEchoCanceler aec = AcousticEchoCanceler.create(recorder.getAudioSessionId());
if(!aec.getEnabled())
aec.setEnabled(true);
Log.d("AEC", " AEC enabled : " + aec.getEnabled() + " . Has control: " + aec.hasControl());
}
else
Log.d("AEC", " AEC is not available");
Я получаю один и тот же вход при применении AcousticCanceler и когда он не применяется. Зачем? Может быть, он не контролирует звук при поступлении из другого приложения? Мне нужно, чтобы он работал, отменяя любой вывод из динамиков, независимо от того, из какого приложения они пришли.
Кроме того, AcousticAudioCanceler - единственный способ сделать это? Я имею в виду, он работает только на Android Jelly Bean, и мне нужно, чтобы он работал на всех устройствах... Заранее спасибо
1 ответ
Ваш подход хорош. Но, как вы уже заметили, AcousticEchoCanceler
был добавлен в API уровня 16. Кроме того, производители не обязаны внедрять его. Итак, на разных устройствах с уровнем API>=16 AcousticEchoCanceler.isAvailable()
доходность false
,
К счастью, это не обязательно означает, что эхоподавление вообще отсутствует. Так как вы используете AudioRecord
ты можешь выбрать MediaRecorder.AudioSource.VOICE_COMMUNICATION
в качестве входа, который был добавлен в API 11 и обычно имеет активное подавление шума, а также эхоподавление.
К сожалению, это также не гарантированно работает, поэтому, если вам это абсолютно необходимо или ваше приложение должно работать с API <=10, вы должны самостоятельно реализовать эхоподавление.