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

作者:帅得不敢出门

相关推荐
Yang-Never44 分钟前
Kotlin协程 -> Job.join() 完整流程图与核心源码分析
android·开发语言·kotlin·android studio
一笑的小酒馆6 小时前
Android性能优化之截屏时黑屏卡顿问题
android
懒人村杂货铺9 小时前
Android BLE 扫描完整实战
android
TeleostNaCl11 小时前
如何安装 Google 通用的驱动以便使用 ADB 和 Fastboot 调试(Bootloader)设备
android·经验分享·adb·android studio·android-studio·android runtime
fatiaozhang952712 小时前
中国移动浪潮云电脑CD1000-系统全分区备份包-可瑞芯微工具刷机-可救砖
android·网络·电脑·电视盒子·刷机固件·机顶盒刷机
2501_9159184113 小时前
iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
android·ios·小程序·https·uni-app·iphone·webview
lichong95113 小时前
【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
android·vue.js·iphone
Android出海13 小时前
Android 15重磅升级:16KB内存页机制详解与适配指南
android·人工智能·新媒体运营·产品运营·内容运营
一只修仙的猿13 小时前
毕业三年后,我离职了
android·面试
编程乐学14 小时前
安卓非原创--基于Android Studio 实现的新闻App
android·ide·android studio·移动端开发·安卓大作业·新闻app