深度学习如何应用于单通道语音增强的处理?
摘要:本文代码请见:https:github.comRyuk17SpeechAlgorithms 博客地址(转载请指明出处):https:www.cnblogs.comLXP-Neverp14142108.html 如果你觉得写
本文代码请见:https://github.com/Ryuk17/SpeechAlgorithms
博客地址(转载请指明出处):https://www.cnblogs.com/LXP-Never/p/14142108.html
如果你觉得写得还不错,点赞👍,关注是对我最大的支持,谢谢😃
传统的语音增强方法基于一些设定好的先验假设,但是这些先验假设存在一定的不合理之处。此外传统语音增强依赖于参数的设定,人工经验等。随着深度学习的发展,越来越多的人开始注意使用深度学习来解决语音增强问题。由于单通道使用场景较多,本文就以单通道语音增强为例。
目前基于深度神经网络单通道语音增强方法大致可以分为两类:
第一种基于映射的方法
第二种基于mask的方法
基于映射的语音增强
基于映射的语音增强方法通过训练神经网络模型直接学习带噪语音和纯净语音之间的映射关系,有两种映射方案:
频谱映射:使用模型预测语音的时频域表示,之后再将语音的时频域表示通过波形合成技术恢复成时域信号。使用最多的时频域表示特征是短时傅里叶变换谱,利用人耳对相位不敏感的特性,一般只预测短时傅里叶变换幅度谱,并使用混合语音的相位合成预测语音的波形。
波形映射:直接将带噪语音波形输入到模型,模型直接输出纯净语音波形的方法。
我们以频谱映射举例说明一下:
训练阶段
输入:这里采用较为简单地特征,即带噪声语音信号的幅度谱,也可以采用其他的特征。值得一提的是,如果你的输入是一帧,对应输出也是一帧的话效果一般不会很好。因此一般采用扩帧的技术,如下图所示,即每次输入除了当前帧外还需要输入当前帧的前几帧和后几帧。这是因为语音具有短时相关性,对输入几帧是为了更好的学习这种相关性
Label:数据的label为纯净语音信号的幅度谱,这里只需要一帧就够了。
损失函数:学习噪声幅度谱与纯净语音信号的幅度谱类似于一个回归问题,因此损失函数采用回归常用的损失函数,如均方误差(MSE)、均方根误差(RMSE)或平均绝对值误差(MAE)等....
最后一层的激活函数:由于是回归问题,最后一层采用线性激活函数
其他:输入的幅度谱进行归一化可以加速学习过程和更好的收敛。如果不采用幅度谱可以采用功率谱,要注意的是功率谱如果采用的单位是dB,需要对数据进行预处理,因为log的定义域不能为0,简单的方法就是在取对数前给等于0的功率谱加上一个非常小的数
增强阶段
输入:输入为噪声信号的幅度谱,这里同样需要扩帧。对输入数据进行处理可以在语音信号加上值为0的语音帧,或者舍弃首尾的几帧。如果训练过程对输入进行了归一化,那么这里同样需要进行归一化
输出:输入为估计的纯净语音幅度谱
重构波形:在计算输入信号幅度谱的时候需要保存每一帧的相位信息,然后用保存好的相位信息和模型输出的幅度谱重构语音波形,代码如下所示。
spectrum = magnitude * np.exp(1.0j * phase)
基于Mask的语音增强
Mask这个单词有的地方翻译成掩蔽有的地方翻译成掩膜,我个人倾向于翻译成“掩蔽”,本文就用掩蔽作为Mask的翻译。
时频掩蔽
我们都知道语音信号可以通过时域波形或者频域的各种频谱表示,此外语谱图可以同时展示时域和频域的信息,因此被广泛应用,如下图所示。语谱图上的像素点就可以称为 时频单元。
现在我们假设有两段语音信号,一段是纯净信号,另一段是噪声,他们混合在一起了,时域波形和对应的语谱图分别如下图所示:
如果我们想将纯净语音信号从混合信号中抽离在时域方面是很难做到的。现在我们从语谱图(语音的时频单元)角度入手去解决语音分离问题。首先我们提出两个假设:
1、我们假设信号能量稀疏的,即对于大多数时频区域它的能量为0,如下图所示,我们可以看到大多数区域的值,即频域能量为0。
2、我们假设信号能量不相交的,即它们的时频区域不重叠或者重叠较少,如下图所示,我们可以看到时频区域不为0的地方不重叠或者有较少部分的重叠。
基于以上两点假设,我们就可以分离我们想要的信号和噪声信号。给可能属于一个信号源的区域分配掩码为1,其余的分配掩码0,如下图所示。
我们通过0和1的二值掩码然后乘以混合信号的语谱图就可以得到我们想要喜好的语谱图了,如下图所示。
神经模型一般直接预测时频掩蔽$M(t,f)$,之后再通过$M(t,f)$与混合语音$Y(t,f)$相乘得到预测的纯净语音$\hat{S}(t,f)=\hat{M}(t,f)\otimes Y(t,y)$,其中$\otimes$代表哈达玛乘积(Hadamard Product)。
