我正在开发一些语音识别应用程序.当手机响铃时我需要识别单词,但为了做到这一点,我必须取消扬声器对麦克风的贡献.所以我希望麦克风忽略来自扬声器的所有音频.
我发现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那么你必须自己实现回声消除.