其实这个系列是我的毕业设计,很早就准备写了,一直拖延症比较严重,终于在今天有机会总结总结了。首先描述一下要做的工作。
一、工作描述
用于语音增强的基于纯DNN的mask预测。(其实纯DNN的效果确实不是特别好,当初看到了最简单的一篇文章就直接用他的结构做了。
二、环境描述
深度学习框架:PyTorch
数据集:上传百度网盘中…(其实就是TIMIT和NOISE-92的噪声混合的数据
三、实验设计
3.1 实验总体设计
如图,实验可以分成两个阶段,训练阶段和测试阶段。训练阶段使用我们自己混合好的带噪语音对模型进行训练;测试阶段使用测试数据评估模型的性能。
3.2 训练阶段
3.2.1 数据合成
训练阶段我们需要根据需要合成不同信噪比的数据,合成过程见利用纯净语音和噪声合成不同信噪比的训练数据。
训练数据可以在这里获取。
3.2.2 短时傅里叶变换(STFT)
对于短时傅里叶变换,这里有一些小坑需要注意:
- 加窗时候的窗函数必须统一。切忌训练网络时一种窗函数,预测语音时使用另一种窗函数
- STFT方法必须一致。STFT的方法众多,比如librosa的stft()方法以及网上一些大神自己写的STFT方法,对于一个实验,所有用到的STFT的地方必须使用同一个STFT方法,这样才能让你的结论更有说服力。
- 对于数据进行stft然后再进行istft(逆傅里叶变换)是无法恢复到原来数据大小的,因为在STFT过程中进行了对齐处理,可能会进行丢弃/补齐操作
3.2.3 扩帧
本次实验是使用纯DNN实现,如果不进行扩帧,网络就是161特征预测161特征(STFT之后是共轭复数,所以取一半也就是161维即可,这个操作库函数一半都会自动操作,无需手动截取161),这样就是纯粹的线性预测线性,就丢失了语音的时间序列特性。因此我们对输入帧进行帧扩展,从STFT的结果(T,F)扩展为(T,F * 11)即向前向后各扩5,使用11特征预测1特征。
3.2.4 训练目标
本次实验是采用mask的方法进行降噪,因此我们的目标为
I
R
M
(
t
,
f
)
IRM(t,f)
IRM(t,f):
(3.1)
I
R
M
(
t
,
f
)
=
∣
S
(
t
,
f
)
∣
2
∣
S
(
t
,
f
)
∣
2
+
∣
N
(
t
,
f
)
∣
2
IRM(t,f)= \sqrt {\frac{\lvert S(t,f)\lvert^2}{\lvert S(t,f)\lvert^2 + \lvert N(t,f)\lvert^2}} \tag{3.1}
IRM(t,f)=∣S(t,f)∣2+∣N(t,f)∣2∣S(t,f)∣2(3.1)
其中
∣
S
(
t
,
f
)
∣
2
\lvert S(t,f)\lvert^2
∣S(t,f)∣2为纯净语音的能量谱,
∣
N
(
t
,
f
)
∣
2
\lvert N(t,f)\lvert^2
∣N(t,f)∣2为噪声的能量谱。
3.3 评价标准
本次实验使用短时客观可懂度(Short-Time Objective Intelligibility, STOI)和主观语音质量评估(Perceptual Evaluation of Speech Quality, PESQ)来衡量预测语音的优劣。