Android WebRTC回聲消除

文章目錄

  • 安卓可用的回聲消除手段
  • 各種回聲消除技術優缺點
  • 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時出現"搶…