speex的回聲訊息
就是speex_echo_cancellation函式的正確用法
回聲訊息的原理:
對參考聲音(解碼的對端原始語音包)做延遲(會有多個延遲,如麥克風直接採集到音箱的聲音,經牆壁反射後再次採集),衰減,
從聲卡里採集到的語音,做乙個語音合成。
回聲產生的條件:
通話中,有一方使用音箱(或者雙方都用音箱)。
在實際中如何使用speex_echo_cancellation這個函式呢?錯誤的使用,將導致speex無法快速地收斂回聲濾波器的引數。
使用音箱的那一方,這裡我們稱之為"傳送方",呼叫speex_echo_cancellation,
這樣做就繞開了網路延遲,引起對演算法收斂的幹撓。
這是第一點要注意的
(也可以在"接收方"呼叫speex_echo_cancellation,但網路出現抖動時,就會使演算法無法快速收斂,就無法消除回聲了)
這樣,我們的**中,大概會是這樣的邏輯:
解碼網路語音包(記為 play)
寫入音效卡
採集麥克風的聲音(記為rec)
呼叫speex_echo_cancellation 參play與rec傳給這個函式
回想一下,應用層的程式可能會是這樣(當然您的程式也可能不是這樣,但情形類似):
乙個接收執行緒,收包,放音
乙個傳送執行緒,錄音,發包
我們自然會在錄音執行緒裡呼叫speex_echo_cancellation
但這有乙個問題,錄音執行緒與放音執行緒因為系統的排程問題,也會造成抖動,導致speex的回聲消除演算法無法收斂。
以下的乙個程式模形,讀者們可以參考
1 接收執行緒a,解碼網路語音包,接語音包推入乙個訊息佇列a
2 放音錄音執行緒b,從佇列a中取出語音包,放音,錄音,錄音得到的語音包,通過speex_echo_cancellation處理後,存入佇列b
3 傳送執行緒c,從佇列b中取語音包,編碼,傳送
採用這種方式,就避免了因為執行緒排程引起的抖動,避免了不確定的延遲對speex演算法收斂過程的幹撓。
最後乙個幹撓因素:os提供的錄音放音介面也是非同步的。。。
這個幹撓因素基本在應用層是無法排除的了。。。可能就是幾毫秒的誤差,但足以幹撓回聲消除演算法了。
多路語音(會議)
選乙個超級節點做合成語音,或者終端對語音進行合成,之後,處理就變成與單對單語音通話類似的情形了
直接上speex_echo_cancellation
speex回聲消除功能測試
今天測試了speex中帶回聲消除模組,效果還可以。測試環境 網路雙工通話,16k取樣16位編碼,speex壓縮以及解壓.原來通話會聽到線路另一端傳過來的自己的聲音,現在在程式中加入speex回聲消除模組。include speex speex echo.h define speex frame by...
speex與webrtc回聲消除小結
回聲消除aec包含 延時估計對齊 線性自適應濾波器 nlp 雙講檢測 處理 舒適雜訊cng 一 speex aec 1 沒有nlp 2 只考慮實時dsp系統,即是沒有延時對齊等 3 自適應濾波 mdf 使用雙濾波器結構,自適應濾波器因子自動更新 二 webrtc aec 1 雙講檢測沒有,雙講時遠端...
回聲消除概述
回聲消除概述 2016 02 21 23 00 00 分類 android平台 首先,a的聲音傳給b,b然後用喇叭放出來,而這時b的mic則會採集到喇叭放出來的聲音,然後傳回給a,如果這個傳輸的過程中時延足夠大,a就會聽到自己剛才說的話,這就是回聲。回聲消除器的作用就是在b端對b採集到的聲音進行處理...