Android WebRTC回声消除

文章目录

安卓可用的回声消除手段

  1. 硬件回声消除
    使用 AudioRecord 的 VOICE_COMMUNICATION 模式:通过 AudioRecord 的 VOICE_COMMUNICATION 音频源可以直接启用硬件级别的回声消除功能。这种方式简单且兼容性好,因为它依赖于 Android 系统底层的回声消除算法。不过,使用时音频采样率通常需设置为 8000 或 16000Hz,通道数设为 1 个。
  2. Android 系统回声消除API
    使用 Android 自带的 AcousticEchoCanceler:Android SDK 提供了 AcousticEchoCanceler 类,可在软件层面进行回声消除。使用时,需先通过 AudioRecord 获取 AudioSessionId,在创建 AudioTrack 时传入相同的 AudioSessionId,最后将此 AudioSessionId 用于 AcousticEchoCanceler 的创建和配置。但这种方式支持的设备可能有限,例如 Nexus 5 支持该方式。
  3. 免费第三方库
    当 Android 自带的回声消除效果不满足需求时,可考虑使用 Speex、WebRTC 等第三方库。这些库提供了丰富的音频处理功能,包括回声消除。使用时,需将采集到的音频数据和播放的音频数据分别作为源数据和参考数据传入库中,并设置合适的延时间隔。不过,设置合适的延时间隔可能较困难,有时设置好后,通话一段时间效果可能会变差。
  4. 付费第三方库
    阿里云音视频通信 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 模块则在无语音时生成舒适噪声,提升用户体验。

回声消除处理流程

  1. 信号采集:通过麦克风采集近端语音信号,同时获取扬声器播放的远端语音信号作为参考信号。
  2. 自适应滤波:使用自适应滤波器对参考信号进行滤波,得到模拟回声信号。
  3. 回声消除:将模拟回声信号从麦克风采集的信号中减去,得到初步估计的纯净语音信号。
  4. 双讲检测与处理:利用 VAD 模块检测是否处于双讲状态,并根据检测结果调整自适应滤波器的参数。
  5. 回声抑制和非线性处理:对初步估计的纯净语音信号进行回声抑制和非线性处理,进一步提高语音质量。
  6. 输出处理后的语音信号:将经过处理的语音信号进行编码和传输。

WebRTC AECM

WebRTC AECMj是从开源项目WebRTC提取并优化的声学回声消除(AEC)模块,专为移动设备设计。它旨在为开发者提供一个高效、可靠的解决方案,以消除通话中的回声干扰,提升用户体验。

源码:

https://github.com/cpuimage/WebRTC_AECM

访问不了就用这个:

https://gitcode.com/gh_mirrors/we/WebRTC_AECM

主要的函数接口

c++ 复制代码
// 创建一个 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

作者:帅得不敢出门

相关推荐
奥尔特星云大使21 小时前
MySQL 慢查询日志slow query log
android·数据库·mysql·adb·慢日志·slow query log
2501_915918411 天前
iOS 框架全解析,原生框架与跨平台框架对比、开发应用打包与 App Store 上架实战经验
android·ios·小程序·https·uni-app·iphone·webview
K24B;1 天前
多模态大语言模型LISA++
android·人工智能·语言模型·分割·多模态大语言模型
molihuan1 天前
开源 全平台 哔哩哔哩缓存视频合并 Github地址:https://github.com/molihuan/hlbmerge_flutter
android·flutter·缓存·ffmpeg·开源·github·音视频
奶糖 肥晨1 天前
批量重命名技巧:使用PowerShell一键整理图片文件命名规范
android·服务器·数据库
Momentary_SixthSense1 天前
如何对较长的Stream链进行Debug
android·java·开发语言
little_fat_sheep1 天前
【Rive】rive-android源码分析
android
教程分享大师1 天前
新魔百和m401h全部版本当贝桌面固件卡刷包和线刷包带adb权限
android
rufeii1 天前
网鼎杯 2020 青龙组
android
我要升天!1 天前
MySQL表的内连和外连
android·mysql·adb