android取消扬声器输出.消除手机反馈

我正在开发一些语音识别应用程序.当手机响铃时我需要识别单词,但为了做到这一点,我必须取消扬声器对麦克风的贡献.所以我希望麦克风忽略来自扬声器的所有音频.

我发现AcousticEchoCanceler用于VoIP应用程序取消回声,但我已经尝试使用它,并且当我的手机铃声响起时没有区别.

我正在从名为’recorder’的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,我需要它才能在所有设备上运行…在此先感谢

最佳答案 你的方法很好.但正如您已经注意到AcousticEchoCanceler在API级别16中添加了.此外,制造商不会被迫实施它.因此,在API级别> = 16的各种设备上,AcousticEchoCanceler.isAvailable()会产生错误.

幸运的是,这并不一定意味着根本没有回声消除.由于您使用AudioRecord,您可以选择MediaRecorder.AudioSource.VOICE_COMMUNICATION作为API 11中添加的输入,并且通常具有有效降噪和回声消除功能.

不幸的是,这也不能保证工作,所以如果你绝对需要它或者需要你的应用程序使用API​​< = 10那么你必须自己实现回声消除.

点赞