Android WebRTC回声消除
文章目录
- 安卓可用的回声消除手段
- 各种回声消除技术优缺点
- WebRTC回声消除
- WebRTC
- 回声消除
- 回声消除处理流程
- WebRTC AECM
- APP
安卓可用的回声消除手段
- 硬件回声消除
使用 AudioRecord 的 VOICE_COMMUNICATION 模式:通过 AudioRecord 的 VOICE_COMMUNICATION 音频源可以直接启用硬件级别的回声消除功能。这种方式简单且兼容性好,因为它依赖于 Android 系统底层的回声消除算法。不过,使用时音频采样率通常需设置为 8000 或 16000Hz,通道数设为 1 个。 - Android 系统回声消除API
使用 Android 自带的 AcousticEchoCanceler:Android SDK 提供了 AcousticEchoCanceler 类,可在软件层面进行回声消除。使用时,需先通过 AudioRecord 获取 AudioSessionId,在创建 AudioTrack 时传入相同的 AudioSessionId,最后将此 AudioSessionId 用于 AcousticEchoCanceler 的创建和配置。但这种方式支持的设备可能有限,例如 Nexus 5 支持该方式。 - 免费第三方库
当 Android 自带的回声消除效果不满足需求时,可考虑使用 Speex、WebRTC 等第三方库。这些库提供了丰富的音频处理功能,包括回声消除。使用时,需将采集到的音频数据和播放的音频数据分别作为源数据和参考数据传入库中,并设置合适的延时间隔。不过,设置合适的延时间隔可能较困难,有时设置好后,通话一段时间效果可能会变差。 - 付费第三方库
阿里云音视频通信 RTC,即构科技 Purio AI 音频引擎,网易云信音视频通话 SDK,擎声科技QttAudio,腾讯云TRTC等。
各种回声消除技术优缺点
回声消除技术 | 优点 | 缺点 |
---|---|---|
硬件回声消除 | 处理高效、稳定,延迟低 | 成本高,灵活性差,可能有兼容性问题 |
Android 系统回声消除 API | 使用方便,与系统集成好,免费 | 功能有限,可定制性差,依赖系统更新 |
WebRTC | 开源跨平台,算法强,实时性好 | 集成难,可能耗资源,有兼容性问题 |
Speex | 轻量高效,开源可定制,支持多格式 | 回声消除能力有限,实时性欠佳,文档及社区支持弱 |
付费库 | 专业,可定制,有技术支持 | 有成本,集成复杂,对平台有依赖 |
WebRTC回声消除
WebRTC
WebRTC是一个由谷歌主导开发的开源项目,其目标是通过简单的API,实现实时通信(RTC)。WebRTC项目包含了多个处理音视频通讯问题的模块,其中就包括了一个性能优异的回声消除(AEC)模块。
回声消除
WebRTC 的回声消除系统主要包含声学回声消除(AEC)模块、语音活动检测(VAD)模块、舒适噪声生成(CNG)模块等。其中,AEC 模块是核心,负责回声的识别和消除;VAD 模块用于判断当前是否有语音活动,辅助 AEC 模块进行处理;CNG 模块则在无语音时生成舒适噪声,提升用户体验。
回声消除处理流程
- 信号采集:通过麦克风采集近端语音信号,同时获取扬声器播放的远端语音信号作为参考信号。
- 自适应滤波:使用自适应滤波器对参考信号进行滤波,得到模拟回声信号。
- 回声消除:将模拟回声信号从麦克风采集的信号中减去,得到初步估计的纯净语音信号。
- 双讲检测与处理:利用 VAD 模块检测是否处于双讲状态,并根据检测结果调整自适应滤波器的参数。
- 回声抑制和非线性处理:对初步估计的纯净语音信号进行回声抑制和非线性处理,进一步提高语音质量。
- 输出处理后的语音信号:将经过处理的语音信号进行编码和传输。
WebRTC AECM
WebRTC AECMj是从开源项目WebRTC提取并优化的声学回声消除(AEC)模块,专为移动设备设计。它旨在为开发者提供一个高效、可靠的解决方案,以消除通话中的回声干扰,提升用户体验。
源码:
https://github.com/cpuimage/WebRTC_AECM
访问不了就用这个:
https://gitcode.com/gh_mirrors/we/WebRTC_AECM
主要的函数接口
// 创建一个 AECM(Acoustic Echo Canceller Mobile,移动声学回声消除器)实例
// WebRtcAecm_Create 函数用于分配并初始化一个 AECM 实例
// 该函数返回一个指向 AECM 实例的指针,后续的操作都将基于这个实例进行
WebRtcAecm_Create();// 初始化 AECM 实例
// aecmInst 是通过 WebRtcAecm_Create 函数创建的 AECM 实例指针
// sampleRate 是音频的采样率,单位为 Hz,例如 8000、16000 等
// 该函数将使用指定的采样率对 AECM 实例进行初始化,使其能够正确处理音频数据
WebRtcAecm_Init(aecmInst, sampleRate);// 设置 AECM 的配置参数
// aecmInst 是 AECM 实例指针
// config 是一个包含 AECM 配置信息的结构体
// 通过设置不同的配置参数,可以调整 AECM 的工作模式、性能等,以适应不同的应用场景
WebRtcAecm_set_config(aecmInst, config);// 缓存远端音频数据
// aecmInst 是 AECM 实例指针
// far_input 是一个指向远端音频数据的指针,即扬声器播放的音频数据
// samples 是远端音频数据的样本数量
// 该函数将远端音频数据缓存到 AECM 实例中,以便后续进行回声消除处理
WebRtcAecm_BufferFarend(aecmInst, far_input, samples);// 执行回声消除处理
// aecmInst 是 AECM 实例指针
// near_input 是一个指向近端音频数据的指针,即麦克风采集的音频数据
// NULL 表示不使用额外的参考信号
// out_buffer 是一个指向输出缓冲区的指针,用于存储经过回声消除处理后的音频数据
// samples 是近端音频数据的样本数量
// 140 是回声延迟的估计值,单位为样本,用于更准确地进行回声消除处理
WebRtcAecm_Process(aecmInst, near_input, NULL, out_buffer, samples, 140);
主要回声消除函数就是上面介绍的这几个,如果要放到Android上调,就要把这几个包成jni的形式。
在c/c++下怎么进行回声消除,在上面git源码中的main.cc中会有实例。
网上也有已经包装好jni的git源码
比如https://github.com/theeasiestway/android-webrtc-aecm
APP
如果只是体验一下在安卓上的效果,可以直接下载别人编译的测试APP,
Android App下载地址:
https://gitcode.net/techinged/share/-/raw/master/android/echo_cancel/webrtc_echo_cancel(Android).zip
作者:帅得不敢出门