
1 引 言
在語音通信中,有一個很影響通話質量的因素就是回聲。回聲就是指說話者通過通信設備發送給其他人的語音又重新又回到自己的聽筒里的現象。回聲會對說話者產生嚴重的干擾,必須想辦法消除。一般,回聲分為兩種,即“電路回聲”和“聲學回聲”。“電路回聲”可以通過硬件設備的合理設計而消除,在此不作討論。最復雜和最難消除的應該是所謂的“聲學回聲”。“聲學回聲”是指遠端用戶的聲音從聽筒出來以后,經過空氣或其他的傳播媒介傳到近端用戶的話筒,再通過話筒錄音后又重新傳到遠端用戶的聽筒中形成的回聲。當近端用戶的放音音量比較大而錄音設備和放音設備距離比較近時回聲尤其明顯。“聲學回聲”受近端用戶環境的影響,可能產生多路回聲,包括直接回聲和反射回聲,各個回聲的路徑不同,延遲也就不同,因而難以消除(如圖1)。
2 聲學回聲消除器
對于聲學回聲消除,常見的消除算法有2類,即回聲抑制(acoustic echo suppression)算法和聲學回聲消除(acoustic echo cancellation)算法。
回聲抑制算法是較早的一種回聲控制算法。回聲抑制是一種非線性的回聲消除。它通過簡單的比較器將準備由揚聲器播放的聲音與當前話筒拾取的聲音的電平進行比較,如果前者高于某個閾值,那么就允許傳至揚聲器,而且話筒被關閉,以阻止它拾取揚聲器播放的聲音而引起遠端回聲。如果話筒拾取的聲音電平高于某個閾值,揚聲器被禁止,以達到消除回聲的目的。由于回聲抑制是一種非線性的回聲控制方法,會引起揚聲器播放的不連續,影響回聲消除的效果,隨著高性能的回聲消除器的出現,回聲抑制已經很少有人使用了。
聲學回聲消除算法(AEC)是對揚聲器信號與由它產生的多路徑回聲的相關性為基礎,建立遠端信號(s[n])的語音模型,利用它對回聲進行估計(e~[n]),并不斷地修改濾波器的系數,使得估計值更加逼近真實的回聲(e[n])。然后,將回聲估計值從話筒的輸入信號中減去,從而達到消除回聲的目的,如圖2所示。
3 聲學回聲消除器設計
一般,回聲消除器的初始化需要兩個參數:一次處理的數據量(幀長)和估計的錄音中回聲相對于錄音開頭的偏移量,即回聲相對于錄音的延遲的最大值(尾長)。回聲消除接口的一般形式為:AecFunction(input frame, playback frame, out frame),對錄音數據進行回聲消除需要等量的播放數據輸入作為建立回聲模型的參考數據。要達到良好的回聲消除效果,必須保證以下3點:
(1) 播放數據的產生速度要和錄音數據的產生速度達到動態平衡,為此如果錄放音數據的采樣率不同,那么需要把他們統一成同一采樣率下的數據以后再進行回聲消除。如果是實時的語音處理,由于網絡的不穩定性,數據包可能在網絡上丟失或者由于過大的延遲而被其他的處理環節丟棄,那么來自遠端的數據量可能會少于近端錄音產生的數據量,對于這種情況我們必須補充播放數據,以保證放音數據的量和錄音數據量達到平衡。
(2) 播放數據帶有的聲音信息先于錄音數據中帶有的對應的回聲信息送給回聲消除接口。這個先后順序是回聲消除的前提,回聲消除器不可能消除自己沒有“見過”的回聲。
(3) 播放數據的聲音對應的回聲在錄音數據中出現的位置相對于錄音的開頭的偏移量(即延遲)不能太大,因為所有的回聲消除器支持的尾長都有一個范圍,延遲超過了這個范圍回聲就無法消除了。
為了滿足第一條,我們需要對放音線程數據產生的速度進行控制,控制拿給聲卡播放的數據量和從聲卡獲得的錄音數據量總是保持一致。由于錄音數據產生的速度總是均勻的,因此放音數據的產生也必須均勻,也就是說從服務器得到的放音數據沒有及時達到時,我們需要“創造”放音數據給系統播放,同時將這些數據緩存到放音數據隊列里。創造的方式有很多,比如填充靜音數據或是通過Wsola算法來模擬連續語音數據。
4 回聲延遲估計
在第一次獲得放音數據時,我們開始對錄音數據進行回聲消除。開始回聲消除之后,從系統錄音接口得到的錄音數據里可能含有回聲消除開始前錄到的數據。而從開始回聲消除那一刻起到放音幀真正從聲卡放出來被錄音設備捕獲可能也需要等待一段時間(我們假設聲音一放出來立即被錄到錄音數據里,忽略其在媒介中的傳播時間,因為實際中最突出的回聲是直接回聲,即聲音從播放設備出來,通過空氣或手機本身直接傳輸到錄音設備,而不是經過反射回到錄音設備,一般直接回聲從放音設備出來再回到錄音設備的時間是很短的,一般不到1毫秒,可以忽略),這個時間跟聲卡放音的緩沖區的長度和我們的放音幀長度有關。放音數據和錄音數據的時序關系如圖3所示。
(以AEC開始后取得的第一個錄音幀的起始錄音時間為起點t0)
粗虛線圈表示一個放音幀時長,實線圈表示錄音緩沖區對應的時長,淺虛線圈表示錄音幀時長。
為了保證所有播放的聲音一定會在錄音數據中重現,應先啟動錄音線程,然后再啟動放音線程。回聲的延遲決定了回聲消除器需要的“尾長”,“尾長”越小,同樣長度的數據回聲消除器的處理時間越短,回聲消除算法的收斂也越快,即消除回聲起效越快。為了使回聲的延遲盡量小,我們需要從設備支持的采樣率中選擇最合適的錄放音采樣率。這個選擇的過程是移動設備上回聲消除處理的關鍵。
如上所述,延遲可分為兩部分,一部分是由錄音時產生的,另一部分是由放音產生的。
先說放音,移動設備支持的放音采樣率有多種,每種采樣率下都有一個最小放音緩沖區長度,放音的緩沖區只能設置得比這個長度長。我們每次給放音API播放的數據會去填充緩沖區,只有當緩沖區被填滿以后才會真正拿到聲卡去播放。如果放音幀比放音緩沖區長,那么放音的延遲就只是聲卡固有的放音延遲。如果放音幀比放音緩沖區短,那么就要等若干個放音幀來填充放音緩沖區,直到填滿以后才送給聲卡去播放。而聲卡收到放音數據到放音數據開始播放,這之間可能還有一個間隔,這是由于聲卡總是一段數據一段數據地播放,如果送到聲卡的時候前一段數據還沒播放完,那么聲卡會等到前一段數據播放完了才開始播放送來的這段數據,這個“數據段”的長度一般對應的就是“最小放音緩沖區長度”。所有上述的時間內產生的錄音數據也會被送到回聲消除器里去處理,因此這段時間內造成的數據延遲為(用時長表示):
放音延遲 = - 1 ・ 放音幀時長 + 聲卡延遲 (1)
其中[ ]表示向上取整,即取不小于該數的最小整數。“聲卡延遲”即數據包送到聲卡后到其播放出來之間的間隔。如果有多個采樣率下的放音延遲都達到最小,那么我們選取最接近編解碼采樣率的那個采樣率,因為越相近的采樣率重采樣時造成的失真越小。而放音緩沖區長度也就設置為(大于或等于最小放音緩沖區長度的)重采樣為放音采樣率后的放音幀長度的最小倍數。
再說錄音,錄音稍微復雜一些。錄音也和放音一樣,在每種錄音采樣率下都有一個最小錄音緩沖區長度,錄音的緩沖區只能設置得比這個長度長。當錄音數據填滿第一個緩沖區以后,我們才能從錄音API中獲得第一個錄音塊,由于回聲消除的原因,我們每次都要從錄音數據里取得和放音幀“等長”(這里的“等長”是指播放時長相等)的錄音幀來進行處理。在放音線程得到第一個放音幀、開始回聲消除這個時刻之后,我們從錄音API里得到的錄音數據里可能有一部分是在回聲消除開始之前就錄到的,這個數據有多少跟錄音幀長度以及錄音緩沖區的長度都有關。如果錄音緩沖區的長度不是錄音幀長度的整數倍,錄音數據里錄到的回聲消除前的聲音數據的時長的最大值是一個錄音幀時長加上填滿一個錄音緩沖區需要的數據對應的播放時長之和。而如果錄音緩沖區長度是錄音幀長度的整數倍,那么錄到的回聲消除前的聲音的最大時長就是填滿一個錄音緩沖區需要的數據對應的播放時長。
錄音延遲 < (2)
因此我們選擇使錄音延遲最大值最小的錄音采樣率,而存在多個同時達到最小值的錄音采樣率時,我們選擇最接近錄音編碼采樣率的采樣率。錄音緩沖區長度就設為(大于或等于最小錄音緩沖區長度的)換算到錄音采樣率下的錄音幀長度的最小倍數。
由于放音延遲除去“聲卡延遲”的部分以外,剩下的那部分是固定的(見式(1)),作為一種優化,我們可以把錄音數據從頭部先丟掉一部分數據,這部分數據對應的時長就等于這部分延遲,這樣將縮短回聲的延遲,可以降低回聲消除器的“尾長”。
5 結 論
本文通過仔細地分析移動設備的錄放音系統的各個環節對回聲消除器得到的數據產生的影響,精確地估算出了回聲延遲可能的范圍,通過精確估計延遲的下限值,給回聲消除器的優化提供了可能,提高了回聲消除器的處理效率和效果。