論文:https://arxiv.org/pdf/1709.08243.pdf
官方博客鏈接:https://people.xiph.org/~jm/demo/rnnoise/?__s=sgkgganpatrhthvch4js
github:https://github.com/xiph/rnnoise
改進github:https://github.com/GregorR/rnnoise-nu
Introduce for RNNoise
Rnnoise是一種實時(低複雜度)全頻帶的語音增強(噪聲抑制)方法,A hybrid DSP(signal process + Deep learning)
主要包含兩部分:
-
信號處理
噪聲抑制在信號處理技術中已經很成熟,但同時存在一些問題,信號處理中某些estimator算法的調參非常麻煩。
-
RNN
RNN的關鍵在R(recurrent,循環),R決定了它非常適合處理序列數據,而語音數據是一種時間序列數據。
RNNoise彌補了信號處理中調參的問題,採用學習參數的方式,總結如下:
-
keep all the basic signal processing that's needed anyway (not have a neural network attempt to emulate it)(保留基本信號處理的部分,而不是使用網絡去模擬它)
-
let the neural network learn all the tricky parts that require endless tweaking next to the signal processing. (讓神經網絡去學習應該怎麼微調其他難以調整的部分,如estimator)
-
RNNoise相比於直接使用RNN的端到端(直接輸入語音,全部由網絡計算得到降噪結果)方法計算複雜度小,所以多用於視頻會議(video-conference)。
Architecture for RNNoise
系統框圖
系統框架圖如下所示:
其中最主要的兩個部分爲A和B,主要的噪聲抑制在A部分完成。
噪聲抑制原理(RNN模擬部分) 原聲 - 噪聲 = 降噪
常規的噪聲抑制可概括爲以下三步:
-
檢測出信號包含的語音和噪聲部分。
-
噪聲部分通過噪聲譜評估器計算出一個噪聲譜特徵(每個頻域上的功率)。
-
噪聲抑制 = 語音譜 - 噪聲譜
爲了避免產生過多神經元的問題,RNNoise使用RNN估算理想臨界帶增益,而非直接估算譜的大小,論文中說法爲ideal critical band gains。採用22個頻帶的模式:
如上圖,使用Opus 圖中的第二個頻帶(因爲低頻時頻帶更寬,容易獲得足夠的數據)
對於每個頻帶來說,估算可用於信號的一個增益。(相當於一個22段的均衡器,改變每個的值來達到降低噪聲,保留信號的一個功能)
RNN
-
其中的三部分便是噪聲抑制的三步,將計算增益的三個部分全部由神經網絡模擬,最關鍵的部分是圖中的三個GRU(門控循環單元)。
-
GRU的作用是保證RNN的長期記憶性(序列中靠後的數據單元結果依賴靠前的數據單元,由於網絡的傳播性質,沒有GRU時前層傳到後層會有信息丟失)。
-
RNNoise使用GRU而非LSTM(也是一種記憶單元) 因爲此實驗中GRU性能好,且需要更少的資源。
關於增益
對於22個頻帶每一個估算的增益值都在[0, 1]中。對於增益的詳細使用,論文中做如下解釋:
對於每一個頻帶b在頻率k下對於一個轉換後的信號X可以估算一個能量E,
而增益便是
其中gt是標記數據的能量,noisy是噪聲的能量。
概括的來說就是:RNN則是學習到最好的gb從而使得噪聲的能量小。換一種理解方法,可以認爲增益就是一個值,如果是噪聲,就乘一個小的增益。如果不是,就乘一個大的增益。
關於架構中B部分pitch filter
由於我們採用22頻帶,頻帶分辨率過於粗糙,對於音調諧波( pitch harmonics)的噪聲很難消除, 所以便有了這麼一個濾波器。(非RNN部分,使用固定數學公式進行濾波,沒有學習功能)
Dataset for RNNoise
-
數據至關重要,可以決定效果的好壞。
-
數據要求:
-
不能只收集 乾淨的語音/嘈雜的語音 兩部分,因爲很難獲得具有相同內容的兩部分。(需要從乾淨的語音和噪音的單獨記錄中人爲的創建數據,難點在於獲得各種各樣的噪音來增加語音。)
-
還需要覆蓋各種錄製條件。(如,只是基於全帶(0-20kHz)音頻訓練的版本在處理低頻濾波產生的0-8kHz的音頻是會出現錯誤。)
-
-
輸入網絡的是22個頻段的頻譜信息,因爲音頻有很大的動態範圍,所以最好可以計算能量的對數值。
原理部分大概羅列如上,數據集具體格式接下來繼續調研
一個開源語音數據集: