我正在开发一些语音识别应用程序。当手机响铃时我需要识别单词,但为了做到这一点,我必须取消扬声器对麦克风的贡献。所以我希望麦克风忽略来自扬声器的所有音频。
我发现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,我需要它才能在所有设备上运行......提前致谢
答案 0 :(得分:2)
你的方法很好。但正如您已经注意到,在API级别16中添加了AcousticEchoCanceler
。此外,制造商不会被迫实施它。因此,在API级别> = 16 AcousticEchoCanceler.isAvailable()
的各种设备上产生false
。
幸运的是,这并不一定意味着根本没有回声消除。由于您使用AudioRecord
,因此您可以选择MediaRecorder.AudioSource.VOICE_COMMUNICATION
作为API 11中添加的输入, 通常具有有效的降噪功能以及回声消除功能。
不幸的是,这也不能保证工作,所以如果您绝对需要它或需要您的应用程序使用API< = 10,那么您必须自己实现回声消除。