導讀:回聲消除作為3A算法之一,是語音前處理的重要環節。回聲消除問題,並不是一個簡單的算法問題,它其實是一個系統性的問題。空間、傳播介質、器材特性等等都會影響到回聲的特性,目前算法的處理問題能力是有限的,所以做好回聲消除需要從更系統的視角來看問題。本文從幾個簡單的視角來聊一聊回聲消除的原理。
在實時音視頻通話中,回聲產生的主要原因是揚聲器播放的聲音又再次錄進麥克風裡去,而這個現象在A,B雙方開外放的通話下,就轉化成一個問題,A(下圖左)說話,A的聲音從B(下圖右)的揚聲器放出,又從B的麥克風採集進來,從而又傳回給A產生回聲。
麥克風採集聲音是播放聲音(回聲)和說話聲音的簡單合成?
當然不是,事實上:
一來在實際場景下回聲是經過多次反射和環境的噪聲(如圖中電風扇的噪聲)以及本地說話的聲音傳入麥克風的。
二來,由於設備(揚聲器或者麥克風都會存在失真),那麼麥克風錄到的回聲和揚聲器播放數據已經發生變化,在實際情況下這一過程中,聲音在頻域通常不僅包含一些線性變化,更會有很多的非線性變化,如下圖(一個真實手機錄的數據的only far end talk 部分選段),左聲道(上面)是播放前的數據也就是算法的遠端參考數據(即far end reference),右聲道(下面)是麥克風採集的聲音,可以看到不管是時域還是頻域都能看到比較大的不同。
又如下圖是綠色的遠端參考信號和藍色的本端信號數據的頻譜分析,區別可以自己看看。
回聲消除的論文非常多,各家的算法也有很多不同的優化,這裡不講公式,只講回聲消除的基本思想。
醫生在開刀的時候,知道哪裡要切哪裡不切,是因為他們有基於大量人體解剖實驗而得來的先驗的知識,清楚知道好的組織是什麼樣子,然後把基於先驗知識和經驗把不好的切除。回聲消除算法在輸入聲音數據的時候,並沒有太多的先驗信息,所以並不清楚什麼聲音是回聲,什麼聲音是本端人說話。回聲和本端說話只在頻譜特性上很難區別,所以回聲消除算法需要提供一個先驗信息——即播放前的數據做參考信號(far end reference),因為這組信號是回聲的源頭,被揚聲器播放後回錄進麥克風從而形成回聲。根據前面說的,我們知道reference的輸入並不等於麥克風採集的數據裡面的echo,播放到採集的中間經過的一系列過程稱之為 echo path。那麼回聲消除的基本思想簡單來說就是:
為了估計麥克風數據中的回聲部分,用濾波器組來模擬echo path,讓far end reference 經過濾波器組來模擬實際的聲音經過echo path的過程來逼近麥克風中回聲部分,得到了echo的估計後,再利用維納濾波或其他方式來消除麥克風數據中的回聲部分。
由於目前實際大部分工業界的實際算法的濾波器組都是模擬線性變化的濾波器組,對於非線性變化,還需要再做針對非線性的殘餘回聲的處理。
回聲消除大部分的應用場景都是實時場景,不管是傳統電話、視頻會議,還是人工智慧音箱為語音識別做的前處理回聲消除等。其中有非常多的ARM 設備,所以對於回聲消除算法的性能是有一定要求的,最起碼的要求是在應用的平臺能達到處理一幀數據的時間是低於一幀數據本身的時間。考慮到還有其他的處理,所以處理的時間是越短越好的。
為什麼要在頻域做呢?絕大部分原因是因為性能問題,如果在時域做,濾波器的長度會非常長,對性能的影響也會非常大。同時FFT在工程化的時候,都會考慮性能,來做彙編的優化。
nlms是一種迭代算法,使用它的主要原因有兩點:
計算量的優化
直接解方程求矩陣的逆非常的費計算量,很多場景下的設備無法滿足實時性的需求。
短時echo path 變化的假設
在絕大多數情況下,短時間內echo path是不會發生太大的變化。在不必要浪費計算資源的基礎上又能合理的跟蹤echo path的變化,迭代算法就是非常好的選擇了。
echo delay 問題
ref 信號和 麥克風採集的echo 存在一定delay,這個delay 一般是由於播放和採集的模塊的緩存以及空間傳播的時間造成的。所以通過Ref 信號來估計echo,首先Ref 數據本身不能錯,不然回聲消除算法效果不會好。 另外軟體層的回聲消除算法,還會因為系統或工程框架問題產生delay的跳變等問題。
實際使用空間的影響
空曠的會議室、樓道等等場景下,空間的混響本身就很重,這個時候產生回聲也會有明顯多次反射的情況。
實際使用的姿勢的影響
在手機包了手機殼擋住揚聲器,放在振動的桌面上,一直搖動設備等一系列情況下都會產品不同的回聲反饋。
根據上面描述,可以看出來,實際場景下的回聲消除是一個非常具有挑戰性的工作,也是行業的難點之一。做回聲消除算法訓練的時候,儘量不要自己合成測試數據再做仿真,更加建議根據應用設備和真實的場景來:
發現問題 -> 動手挖掘有效信息 -> 分析問題 -> 思考解決方案 -> 實現解決方案 -> 測試體驗 -> 持續優化 -> 再體驗 ...
願大家在實踐中,發現探索的樂趣!