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

时间:2012-12-11 15:54:57

标签: android audio echo speaker

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

我发现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,我需要它才能在所有设备上运行......提前致谢

1 个答案:

答案 0 :(得分:2)

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

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

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