當前基於深度學習的語音降噪方法主要分為兩個類:
- 基於TF時頻域的方法 (有兩大類:基於mask和非基於mask的方法)
- 基於時域的方法,就我自己的實驗結果來說,基於時域的方法比基於TFmask的方法要差一些,可能這樣方法的trick更多一些吧。
基於時頻域方法中的基於mask的方法更常見一些,主要的是對語音提取頻域特征,通過計算干凈音頻和對應的加噪音頻的頻域特征計算一個頻域的mask。然后用加噪音數據訓練以mask作為label訓練。
基於時頻域方法中的非基於mask的方法,主要是對語音提取頻域特征,通過噪聲數據的頻譜特征作為輸入特征,以干凈音頻的頻譜特征作為label進行訓練。
(注:此處實驗中使用的頻域特征是stft短時傅里葉變換)
這兩種方式中基於mask的方法試驗結果相對較好,因此我們再詳細看一下基於mask的方法。那mask的方式其實有很多中:
- Irm ideal ratio mask. 只考慮幅頻,不考慮相頻: square(abs(stft(clean)))/square(abs(stft(noise))+abs(stft(clean))) 在論文中也有別的表示方式,特點是取值范圍是0-1
- smm Spectral Magnitude Mask : abs(stft(clean))/abs(stft(noise)+stft(clean)) 更結合音頻頻域特征相加的性質,取值范圍(0- INF)取值范圍較大,相對於irm更難訓練一點
- psm Phase-Sensitive Mask 考慮phase相位譜:(abs(stft(clean))/abs(stft(noise)+stft(clean)))*cos(theta) theta 是相角。考慮了相位譜,語音通過mask 重建出來更完整,失真更少,取值范圍更大(-INF ~ INF)。
試驗中發現一般情況下irm 更好訓練,容易收斂,Psm 訓練結果的指標更好一些。說到指標論文里一般使用:
- PESQ (衡量失真)-0.5 ~ 4.5 模擬mos值
- STOI(衡量可理解讀)0 ~ 1
- SNR
- 也有的用ASR識別結果對比,pesq/STOI github 上現成的代碼,可以直接用。 主要是計算干凈音頻和噪聲音頻在頻域上的差別。
基於時域的方法,我試了類似wavenet/tcnn 的方法,直接輸入wav的采樣點,有個前面加了二維卷積類似 stft頻域變換, 輸出采樣點的值。更簡單明了一些。但是模型大小更大,而且訓練過程中的參數設置影響較大。