4

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

我发现 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,我需要它适用于所有设备......提前致谢

4

1 回答 1

2

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

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

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

于 2014-03-10T13:57:30.543 回答