训练语音降噪模型的一些感想
当前基于深度学习的语音降噪方法主要分为两个类:
- 基于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频域变换, 输出采样点的值。更简单明了一些。但是模型大小更大,而且训练过程中的参数设置影响较大。