深度学习在AEC中的应用探索
本文來自大象聲科高級算法工程師閆永杰在LiveVideoStackCon2019北京大會上的分享。閆永杰介紹了深度學習在回聲消除(AEC)中的應用。正如我們所知,AEC是 在線音視頻通話(VoIP)領域中一個非常棘手的問題,目前應用比較廣泛的AEC方法主要還是基于傳統信號處理的方法。大象聲科在成功將深度學習應用于人聲和噪聲分離的基礎上,正在通過引入深度學習技術,解決回聲消除問題。
?
文 / 閆永杰
策劃 / LiveVideoStack
AEC問題定義
上圖是個典型的AEC 系統,我們先看左框和右框。
我們可以想象為兩個人通電話,從左框看到的遠端信號(Far-End)是指對方傳過來的信號x(n),而右框的近端信號(Near-End)指著本地麥克風收到的信號y(n)。
傳統意義上,AEC 的問題目標在于去除回聲的分量d(n),? 如果一個 VOIP 通話系統后面還會有降噪算法將近端語音中的背景噪聲v(n)去掉, 使得我們送給對方的信號是純凈的語音s’(n)。 當我們打電話時聽到自己講話的聲音,其實是對方的手機AEC算法出現了問題. 在對方設備AEC算法沒把你的聲音消掉的情況下,就會聽到自己的聲音。這里我們強調一點,傳統AEC問題定義只針對回聲分量去除,對噪音毫無影響。
?
簡單介紹傳統自適應算法原理
第一,我們必須在近端沒有講話情況下做計算,來估計參考信號到回聲的傳輸路徑,也就是常說的回聲路徑。回聲路徑的估計至關重要,如果回聲路徑估計不準確,后續步驟都會出問題。
第二,如果第一步我們得到了準確的回聲路徑h(n), 那么我們用得到的遠端信號和h(n)進行卷積,就算得了估計的回聲分量
第三, 麥克風收到的近端信號減去第二步中估計的回聲分量,將會得到AEC 的結果
?
傳統自適應算法存在的問題
第一,算法要求在僅有遠端信號段才能做回聲路徑的估計,因此雙講檢測(Double-Talk)要求要非常準確。如果這一點沒有做好檢測,會導致濾波器發散, 算得錯誤的h(n),進而導致目標語音過壓、回聲漏消等問題。
第二,傳統的AEC不考慮背景噪聲的,如果在實際場景背景噪聲比較大,也會帶來性能的下降。
第三, 估計的 回聲路徑h(n)是線性系統。但現實場景是有揚聲器帶來的非線性問題。如果揚聲器非線性很嚴重,會給AEC帶來很大的挑戰。
從另一個視角看AEC
?
我們在此圖中可以從另一個角度看AEC,麥克風分別收到三種信號- 目標語音,回聲,背景噪聲。我們的目的是把回聲與背景噪聲去除(傳統意義上,AEC僅僅是將回聲分量去除)。那么,我們就可以將AEC看成一個分離問題,這個任務就可以看成從近端混合信號中分離出目標語音。
?
計算聽覺場景分析
?
講到語音分離問題,就不得不提我們大象聲科首席科學家汪德亮老師提出的理想二值掩膜(IBM) 理論。 這個理論將分離任務的目標設定為理想二值掩膜, 只存在兩個取值, ?0 或者1。當目標信號大于非目標信號的時候,它會被設置為 1否則是0。
?
IBM
以上有四張圖:
左上圖表示的是近端信號(Near-End),前面和后面都是一段靜音。
右上圖表示的是遠端信號 ??(Far-End)?,也就是對方傳過來的聲音,遠端一直有人在說話,這路信號會通過揚聲器播放出來。這種場景下,麥克風同時收到第一段近端講話的聲音以及第二段揚聲器所播放出來的聲音,聽起來就像兩個信號混合在一起,中間那段就是實實在在的Double-Talk。
左下圖表示的就是麥克風收到的摻雜了近端信號和遠端信號的混合語音。
如果左上圖和左下圖按照上述IBM公式計算,就會得到目標的Mask ,如右下圖。不難想象,如果把右下圖蓋在左下圖,會產生接近第一張圖的效果。
通過這四張圖,我們可以直觀的明白IBM的計算方式以及使用方式。
?
深度學習
接下來我們講下深度學習。我們首先思考一個問題,學習的本質是什么呢?事實上,學習的本質就是通過構建模型,來擬合一個函數映射,即我們給定模型一個輸入以及對應的目標輸出,通過模型自動優化調整,使得模型預測的輸出不斷地逼近目標輸出。當模型預測準確率達到比較高時,我們就可以使用這個模型來做預測了。
構建模型有很多方法,例如高斯混合模型、支持向量機、多層感知機以及深度神經網絡(DNN),它們都能完成給定輸入來預測一個輸出的任務。隨著當前深度神經網絡的快速推進,已經取得了卓越的性能提升,因此我們選擇深度神經網絡來建模。對于AEC這個任務,前面我們講到的IBM就是模型的目標y,而我們的輸入有兩個,一個是混合語音的幅度譜,另一個是遠端參考信號的幅度譜,那么這樣就建立好了函數映射。
訓練數據的構建
那么,如何生成實驗所需的數據呢?首先我們需要挑一句語音作為近端信號(Near-End),再挑一句為遠端信號(Far-End)。 遠端信號與房間的沖激響應(RIR)卷積后的結果作為回聲信號。然后,回聲信號加上近端信號就得到實驗中混合語音信號, 同時根據近端信號和混合語音可以求出我們所說的目標 IBM。這樣我們就有了完整的實驗數據,輸入:混合語音,遠端參考信號,目標:近端目標語音與混合語音計算得到的IBM。
?
深度學習解決AEC問題
下面,總結一下深度學習解決AEC問題:
選定訓練目標--IBM,此處我們以IBM為例進行講解,實際中也可以采用IRM(Idea Ratio Mask);
輸入網絡的特征--混合語音及參考信號STFT 后幅度譜;
訓練工具現在都比較成熟了,Tensorflow、Pytorch 都非常好用;
數據驅動,將訓練的數據不斷送入網絡,讓它不斷地調整參數,就會得到一個不錯的效果。
?
實驗結果示例
上圖是模型收斂后的一組處理前后對比。我們可以看到混合語音經過處理后,前后兩段遠端聲音信號是完全去掉了,中間雙講部分也完整保留了目標語音,結果還是非常理想的。
上面實驗在實驗數據上已經取得了不錯的結果,但如果處理實際采集的數據,效果就不盡如人意了,我們分析主要有以下幾點原因:
現實場景中要考慮噪音的干擾;
非線性帶來的不匹配;
現實中的房間沖激響應與實驗室生成的存在差異。
綜合來看以上幾點,其實都可以總結為實驗數據與真實數據分布不同,導致我們訓練的模型在真實環境下表現急劇下降。那么我們如何解決這個問題呢?
我們可以從兩個方向來進行優化:
?
一方面,從優化仿真數據入手 :首先,我們可以在訓練數據中加入一些噪聲干擾,來解決背景噪聲帶來的數據不匹配問題;其次我們可以使用一些非線性函數,來模擬揚聲器的非線性,以此減少實驗數據與真實數據的差異;
另一方面,從采集真實回聲數據入手:我們可以采集真實的回聲數據,進行訓練。我們編寫了一個 APP, APP會讀取 SD 卡內的音頻并播放,同時APP將麥克風采集到的數據寫入SD卡中。這樣,我們就得到了遠端信號以及對應的回聲分量。利用這個方法,我們可以在不同的房間,不同位置,使用不同設備大量采集語料。實驗時,我們再選取近端信號,和采集到的回聲分量進行混合,這樣我們就能夠得到接近真實的數據。使用這樣的數據,能夠極大改善訓練數據與真實數據之間分布不一致帶來的性能下降。
講到這里,我們總結下深度學習方法相比傳統方法解決回聲消除問題的優勢:
無需考慮雙講。Double-Talk 是神經網絡自己去學習的,因為我們的目標里面隱含Double-Talk 的信息。由于無需檢測雙講,避免了傳統方法雙講檢測不準確時回聲消除異常的問題。
深度學習本來就具有非線性擬合能力,能夠更好地覆蓋AEC 系統中非線性因素。
無需復雜的調參過程。這一點是我們非常看中的優點,可以極大地提高工程效率。
局限性
我們目前所用的方法僅恢復了目標語音的幅度,并沒有恢復它的相位,合成時使用混合語音的相位進行合成的。這種方法在高信回比下沒什么問題,但在低信回比下聽感就不太好了;
在低信回比條件下,Masking方式恢復幅度的能力也有限;
即使我們做了大量弭平訓練數據與真實數據的工作,但還是會存在分布差異時模型能力下降的問題。
這項工作是一個探索性質的,我們看到了有不錯效果,同樣也有很多問題需要去解決,需要我們和業界一起努力,共同推進這個這項工作,
目前我們能看到可能解決上述問題的思路主要有:
同時預測目標語音的幅度譜和相位;
直接在時域上進行預測。
應用場景
AEC 的應用領域包括智能家居,云通訊,智能安防,智能車載,耳機,機器人,手機等等。
我們在手機領域已有一定的落地,手機手持模式下回聲回聲分量比較小,比較適合目前技術的落地,已經有多款搭載大象聲科算法的手機商業落地了。
?
Q & A
如何合成含噪聲的數據?
???????如果是降噪領域一般只考慮加性噪聲,在訓練的時候使用不同的SNR ,不同輸入幅度的訓練數據去做multi-condition的訓練。
一般會采用什么樣的網絡結構呢?
???????在做回聲消除的時候,我們一般用時序模型,如LSTM,或者GRU,這類的RNN 是可以追蹤歷史信息,能夠更好地分離回聲和目標聲音。
訓練時單講和雙講數據的比例大概是什么樣呢?
???????我們一般訓練時雙講的比例在百分之二十,大部分情況還是單講的,這也符合實際場景中的比例。
?
LiveVideoStack?秋季招聘
LiveVideoStack正在招募編輯/記者/運營,與全球頂尖多媒體技術專家和LiveVideoStack年輕的伙伴一起,推動多媒體技術生態發展。同時,也歡迎你利用業余時間、遠程參與內容生產。了解崗位信息請在BOSS直聘上搜索“LiveVideoStack”,或通過微信“Tony_Bao_”與主編包研交流。
總結
以上是生活随笔為你收集整理的深度学习在AEC中的应用探索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LiveVideoStackCon深圳-
- 下一篇: 你今天怎么这么好看——基于深度学习的大型