文章目录

  • 安卓可用的回声消除手段
  • 各种回声消除技术优缺点
  • WebRTC回声消除
    • WebRTC
    • 回声消除
    • 回声消除处理流程
    • WebRTC AECM
  • APP

安卓可用的回声消除手段

  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

主要的函数接口

// 创建一个 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
在这里插入图片描述
作者:帅得不敢出门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/78273.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/78273.shtml
英文地址,请注明出处:http://en.pswp.cn/web/78273.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 SAFM 超分辨率上采样模块的 YOLOv12 改进方法—模糊场景目标检测精度提升研究

在复杂视觉环境中,如低光照、雾天或远距离拍摄等场景下,图像质量下降导致目标模糊,使得传统目标检测模型难以实现高精度识别。YOLO系列作为主流单阶段检测框架,在速度和精度方面表现出色,但在模糊和小目标场景中仍存在性能瓶颈。本文提出一种面向 YOLOv12 的创新性改进方法…

Spring 事务的底层原理常见陷阱

一、Spring 事务的底层原理 1. 核心机制 动态代理(AOP): Spring 通过动态代理(JDK 或 CGLIB)生成代理对象,拦截被 Transactional 注解标记的方法。事务拦截器: TransactionInterceptor 负责管…

Java SE(6)——类和对象(一)

1.初始面向对象 1.1 什么是面向对象 Java是一门纯面向对象的编程语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交换来完成一件事情 1.2 面向过程…

cpp细碎知识点

1 重写 (Override): 派生类中定义一个与基类虚函数具有相同函数签名(函数名、参数列表、返回类型)的函数,这被称为重写。 重写意味着派生类提供了基类虚函数的一个特定于派生类的实现。 重写是实现多态的关键 2 虚基类 (Virtual Base Class…

若依 FastAPI + Vue3 项目 Docker 部署笔记( 启动器打包教程)

本文记录了将 start.bat 打包成 .exe 启动器的详细教程,适合项目交付或导师演示用。 🧭 一、如何将 start.bat 打包为启动器 .exe(含图标 自动打开浏览器) ✅ 1. 创建三大功能脚本 start.bat → 启动项目(docke…

基于springboot的金院银行厅预约系统的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着信息技术在管理上越来越深入而广泛的应用,信息管理系统的实施在技术上已逐步成熟。信息管理系统是一个不断发展的新型学科,任何一个单位要生存要发展,要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的…

创意控制台:下雨动画特效(ASCII 雨滴下落)

在编程的世界里,控制台不仅仅是输出文本信息的工具,通过巧妙的代码设计,我们还能在其中创造出充满趣味的动态画面。本文将带领大家使用 C 语言打造一个创意控制台下雨动画特效,利用 ASCII 字符模拟雨滴下落的过程,为单…

MySQL--索引入门

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 Mysql在存储数据之外,数据库系统各种还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据…

MIT XV6 - 1.2 Lab: Xv6 and Unix utilities - pingpong

接上文 MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - user/_sleep 是什么?做什么? pingpong 不务正业了那么久(然而并没有,虽然还在探索sleep,但是教材我已经看完了前三章了),让我们赶紧继续下去 在进行本实验之前请务…

前端面经-VUE3篇(二)--vue3组件知识(一)组件注册、props 与 emits、透传、插槽(Slot)

组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成一个层层嵌套的树状结构: 一、注册 Vue 组件本质上是一个可以复用的 自定义 HTML 元素,为了在其他组件中使用一…

LeetCode —— 102. 二叉树的层序遍历

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️…

Linux第20节 --- inode和文件系统

一、没有被打开的文件 如果一个文件没有被打开,那么该文件存储在哪里? 该文件是存储在磁盘当中的! 文件 文件内容 文件属性! 文件的内容是按照数据块存储的;文件的属性其实就是inode(是一个128字节的…

1.PowerBi保姆级安装教程

1.进入power bi网站 PowerBi下载链接 2.下载power bi软件 3.双击安装 4.下一步 5.下一步 6.下一步 7.下一步 8.安装 9.双击桌面图标

Android Studio中OpenCV应用详解:图像处理、颜色对比与OCR识别

文章目录 一、OpenCV在Android中的集成与配置1.1 OpenCV简介1.2 在Android Studio中集成OpenCV1.2.1 通过Gradle依赖集成1.2.2 通过模块方式集成1.2.3 初始化OpenCV 1.3 OpenCV基础类介绍 二、指定区域图像抓取与对比2.1 图像抓取基础2.2 指定区域图像抓取实现2.2.1 从Bitmap中…

前端面试每日三题 - Day 22

今天我们将深入探讨 JavaScript 中的 Set 和 Map 数据结构,了解它们的特性及应用场景。接下来,我们会分析 React 的 Suspense 和 Concurrent Mode 的工作原理,探索它们如何提升应用的性能和用户体验。最后,我们将学习如何设计一个…

[Vue]编程式导航

在 Vue 中&#xff0c;编程式导航是通过 JavaScript 代码&#xff08;而非 <router-link> 标签&#xff09;动态控制路由跳转的核心方式。这个方法依赖于 Vue Router 提供的 API&#xff0c;能更灵活地处理复杂场景&#xff08;如异步操作、条件跳转等&#xff09;。 一、…

邹晓辉教授十余年前关于围棋程序与融智学的思考,体现了对复杂系统本质的深刻洞察,其观点在人工智能发展历程中具有前瞻性意义。我们可以从以下三个维度进行深入解析:

邹晓辉教授十余年前关于围棋程序与融智学的思考&#xff0c;体现了对复杂系统本质的深刻洞察&#xff0c;其观点在人工智能发展历程中具有前瞻性意义。我们可以从以下三个维度进行深入解析&#xff1a; 一、围棋程序的二元解构&#xff1a;数据结构与算法的辩证关系 1.1.形式…

The Traitor King (10 player 25 player)

The Traitor King 十字军试炼尾王成就。叛变的国王&#xff1a;在30秒内杀死40只虫群甲虫。考验团队配合的成就。比不朽者&#xff0c;黑曜石31等等强度大&#xff0c;甚至感觉比宝库地风火难。

数据结构一 单链表

1.单链表 1.数据结构简介 程序数据结构算法 数据 数据&#xff08;data&#xff09;是客观事物的一个符号表示 数据元素&#xff08;data element&#xff09;是数据的基本单位&#xff0c;一 个数据元素可以由若干个数据项&#xff08;data item&#xff09;组成。数据项…

GPU集群监控系统开发实录:基于Prometheus+Grafana的算力利用率可视化方案

一、科研场景下的GPU监控痛点 在深度学习模型训练、分子动力学模拟等科研场景中&#xff0c;GPU集群的算力利用率直接影响着科研效率。笔者在参与某高校计算中心的运维工作时&#xff0c;发现以下典型问题&#xff1a; 资源黑洞现象&#xff1a;多课题组共享GPU时出现"抢…