RNNoise是一個採用音頻特徵抽取+深度神經網絡結合的降噪方案. 更多相關基本信息, 請查看 RNNoise學習和翻譯系列
目錄
1.讀取文件生成特徵的主循環
Denoise.c 中的main函數是特徵提取部分的主流程.
循環之外的內容有:
- 數據對象管理
- 命令行參數分析
- 文件操作
- 跳過噪音開頭的幀
主循環主要做了三件事:
- 定期生成隨機參數(參考第二節)
- 特徵和標記提取運算(參考第三節)
- 把特徵數據和標記數據寫到文件
這部分代碼邏輯來說就是: 循環讀取語音和噪音, 混成訓練數據, 併產生對應的特徵和標記數據.
其中, 數據片大小是20ms, 步進速度是10ms, 有10ms的重疊數據.
其框圖如下:
2. 構造不同場景和條件的訓練
一個有效的模型, 爲了能在現實場景下工作的很好, 必須要刷題, 也要實戰, 這意味着訓練用的數據必須花樣百出. 一種最基本的考慮是使用不同SNR的語音來進行訓練, 實驗表明使用SNR範圍較廣的訓練數據得到的訓練模型對不同的SNR有更好的支持度(參考鏈接的3.1節 SNR維度)
本模型中採用了以下幾種變化參數:
- 語音增益 和 噪聲增益, 這兩者合起來可以表示不同的SNR還可以表示不同的音量範圍
- 兩個隨機的二階濾波器, 模擬各種特殊的聲學場景
- 最高截止頻率(lowpass), 用來模擬各種採集環境的頻率範圍
各取值的範圍:
- 語音增益: 40~20dB, 10%概率變爲靜音
- 噪音增益: 語音增益*30~20dB, 10%的概率不疊加噪音(這個10%和前面的10%乘數疊加的)
- 濾波器係數: 0~0.75
- Lowpass: FREQ_SIZE*50rand(1)/8, 當FREQ_SIZE爲481時, 取值範圍大概是60~3000
3. 特徵和標記提取代碼
該部分代碼的數據流向圖如下, 從中我們可以發現, 執行梳狀濾波那個函數是沒必要的:
其中比較關鍵的子函數有:
- 特徵提取(參考第四節)
- 幀分析: 計算fft和頻帶能量
- 梳狀濾波: (本文先不涉及)
- 疊加場景效果: 根據隨機產生的場景參數來疊加效果.
其中的幀分析和特徵提取部分都會緩存部分數據. 比如幀分析會緩存一幀的數據, 加上當前幀, 共20ms的數據用.
4. 特徵提取代碼
該部分代碼的數據流向圖如下:
其中比較關鍵的子函數有:
- 特徵計算: 此處使用了一個環形buffer來計算導數和譜穩度
- 基音估計: (本文先不涉及)
- 幀分析: 如上節