# RNNoise contributed by < [p61402](https://github.com/p61402) > ## 雜訊抑制 雜訊抑制(Noise Suppression)是一個發展成熟的領域,其目的是要將一段音訊中的嘈雜的部分盡量移除,並且盡可能地希望能夠不造成音訊中有興趣的部分失真,下圖為一個典型雜訊抑制的演算法: ![](https://i.imgur.com/BWEKvqk.png) 其中 Voice Activity Detection (VAD) 模組用來檢測訊號何時含有目標的聲音以及何時只是單純的雜訊。接著透過 Noise Spectral Estimation 模組找出噪聲的頻譜特徵,在得知噪聲的特性後,便可以將雜訊從輸入的音訊中減去 (Spectral Subtraction)。 以上三個元件都需要相當準確的 estimator 來實現,而且要將其調整(tune)到能夠運作通常十分困難,這也是為什麼近期深度學習會開始出現在雜訊抑制的應用當中。 ## 以深度學習進行雜訊抑制 深度學習已經被使用來進行雜訊的抑制,許多應用是為了解決 Automatic Speech Recognition (ASR) 的問題。而且在大部分的狀況下,神經網路的架構非常龐大,在沒有 GPU 協助下沒辦法進行即時的應用。 RNNoise 的目的就是希望能夠在低複雜度的情況下實現 real-time 的應用 (例如:視訊會議)。 而 Recurrent Neural Network (RNN) 在此應用下就扮演了非常重要的一個角色,因為 RNN 的特性就是能夠針對具有時間序列特性的資料進行建模。但是基本的 RNN 架構並不具有「長期記憶」的功能,而且在計算梯度下降(Gradient Descent)及反向傳播(Backpropagation)的過程中會有梯度消失的問題 (Vanishing Gradient Problem)。因此實際的應用上多半採用 RNN 的變形,也就是導入了 gated units 的 RNN,例如:Long Short-Term Memory(LSTM)、Gated Recurrent Unit(GRU)等等。 下圖為 RNN 的基本架構: ![](https://i.imgur.com/OVGBrlK.png) RNNoise 選擇採用 GRU,因為在這個應用中 GRU 的表現會比 LSTM 來得更好一點,而且所使用的運算資源更少(需要更新的參數較少)。 ### GRU 一般 RNN 進行 fordward propagation 時 hidden layer 的更新如下: $h_t=f(W^{(hh)}h_{t-1}+W^{(hx)}x_t)$ 而 GRU 架構如下: ![](https://i.imgur.com/xdTX7h0.png) 與 RNN 不同的,GRU 具有兩個額外的 gate:update gate ($z_t$) 及 reset gate ($r_t$)。 **update gate:** $z_t=\sigma(W^{(z)}x_t+U^{(z)}h_{t-1})$ **reset gate:** $r_t=\sigma(W^{(r)}x_t+U^{(r)}h_{t-1})$ **current memory:** $\hat{h_t}=tanh(Wx_t+r_t\circ Uh_{t-1})$ 若 reset gate 趨近於 0,代表選擇遺忘先前的記憶。可以將 $\hat{h_t}$ 這項視為目前當前 input 對記憶產生的影響,並且透過控制 reset gate 與過去的記憶結合。 **current time step memory:** $h_t=(1-z_t)\circ h_{t-1}+z_t\circ \hat{h_t}$ 最後藉由控制 update gate 將目前的記憶與與先前的記憶照比例結合。 可以想像 update gate 用來決定要將過去多少的資訊繼續傳遞下去,而 reset gate 則是決定要遺棄過去多少的資訊,如下圖所示: ![](https://i.imgur.com/Vvw3iEz.png) 透過調整兩個 gate 的權重, GRU 能夠有效解決梯度消失的問題。 若 reset 接近 0,選擇遺忘過去的記憶,能夠將對未來沒有幫助的資訊遺棄;若 update 接近 1,則模型能夠記住過去的記憶,同時減緩梯度消失的問題。 ## 方法 RNNoise 除了採用深度學習來取代傳統需要複雜建構的 estimator,也結合了一般數位訊號處理的技術,是一個 hybrid approach。相對於所謂 end-to-end 的系統(將大部分或全部數位訊號處理的操作都以機器學習來取代),混合方法所需的計算資源通常較少,而這也是這個系統的需求之一。 ### 系統架構 下圖為整個系統模型的 block diagram,簡單的概括一下流程,首先就是對輸入的訊號進行取樣以及快速傅立葉轉換(FFT),將訊號由時域轉換為頻域,讓輸入的訊號可以讓電腦方便進行處理,接著對訊號進行特徵擷取後丟進 RNN 模型進行訓練,得到消除雜訊的訊號後再透過 inverse FFT 將訊號由頻域轉換回時域。 ![](https://i.imgur.com/P0OQhnO.png) ### 深度學習架構 下圖為深度學習的架構: ![](https://i.imgur.com/tuPqbdu.png) 而在訓練資料的部分,由於採用監督式學習(Supervised Learning)方法,因此每筆 noisy speech 資料都需要有一組 clean speech 作為 ground truth。採用的方法是將 clean speech 加上雜訊後成為 noisy speech。 ### 結果 帶有雜訊的音訊,訊噪比(SNR)為 15 dB (input) ![](https://i.imgur.com/Gh2FNDX.jpg) 去除雜訊後的結果 (output) ![](https://i.imgur.com/k5bSWlE.jpg) 原始不帶雜訊的音訊 (ground truth) ![](https://i.imgur.com/u5DC3mb.jpg) ### 比較 使用 PESQ MOS-LQO 標準來測量語音的品質,將 RNNoise 與以 MMSE 為基礎的 Speexdsp 函式庫還有原始帶有雜訊的音訊做比較,相較兩者 RNNoise 確實有較好的去除雜訊改善。 ![](https://i.imgur.com/chOTcO6.png) 在介紹此方法的論文中,有詳細說明整個架構中每一個過程的細節,但小弟功力不足,對於數位信號處理(DSP)並不太熟悉,因此只能夠粗淺的介紹整個方法的概念,若有興趣可以參考原論文。 ## 參考資料 [RNNoise: Learning Noise Suppression](https://people.xiph.org/~jm/demo/rnnoise/) [*A Hybrid DSP/Deep Learning Approach to Real-Time Full-Band Speech Enhancement*](https://arxiv.org/pdf/1709.08243.pdf)