语音降噪模型GTCRN学习笔记(二)

上篇文章(语音降噪模型GTCRN学习笔记(一))对GTCRN做了概述。从本篇开始,讲GTCRN里面的细节,本文先讲ERB、SFE和MASK等。

先说明一下,我主要是通过调试来理解GTCRN基本原理。GTCRN的开源代码提供了模型、推理代码以及带噪的音频文件等,在python环境下通过这些就可以来调试。为了更方便调试(即更方便看打印信息),我把带噪的音频文件做了截取,只留下7帧数据。模型的输入是做完STFT后的复数频谱,分别取出实部和虚部,再算出幅值,就得到了3维数据,或者说3通道(channel)数据。音频文件是16K HZ采样率的,帧长32ms,帧移16ms,做完STFT后是257维的数据,即特征是257维的。GTCRN中送给模型的数据格式是(B,C,T,F)。B表示batch size,执行推理时只有一个文件,所以B一直等于1。C表示channel通道数,这里有实部、虚部和幅值3通道,所以为3。T表示帧数,这里是7。F表示特征feature,这里是257。所以我在调试时送给模型第一个模块ERB.BM的数据是一个(1,3,7,257)的矩阵。通过看各个步骤后的数据的维度以及其他打印信息来帮助理解原理。

1,ERB

ERB(Equivalent Rectangular Bandwidth,等效矩形带宽)是 GTCRN等现代语音增强模型中经常使用的一个特征,它的目标是把频率轴从线性频率刻度转换成更接近人耳听觉分辨率的刻度。人耳低频分辨率高,高频分辨率低,因而低频需要更多频带,高频可以粗些。具体到GTCRN,它把做完STFT后257个bin的前65个bin上的值保留,后192个bin上的值变成64个band上的值,这样得到一个129(129 = 65 + 64)维的特征。下面讲怎么把线性频率下的后192个bin上的值变成ERB下的后64个band上的值。

EVB下共129个band,前65个可以看成是低频的,后64个可以看成是高频的。前65个沿用STFT下前65个bin上的值,后64个band上的值是STFT下后192个bin上的值与相应的系数做乘累加得到的。假设STFT下高频192个bin上的值为bi(0 <= i <= 191), 相对应的EVB下高频64个band上的值为ej, (0<= j <= 63),系数为Wi_j, 所以

以高频下第一个band(band 0)为例,

所以系数是一个64行192列的矩阵。下面看怎么求这个系数矩阵。

做完STFT后的频点如下图所示:

共257个频点,256个频带,每个频带的带宽是31.25HZ(16k采样率,最大频率是8kHZ。8000/256 = 31.25)。ERB中低频的65个band沿用STFT的。从频点65(即第66个频点)开始,把STFT下的192个频点变成ERB下的64个band。STFT中要变化的起始频点65的频率是2031.25HZ(31.25x65=2031.25),STFT中要变化的结束频点256的频率是8000HZ。在ERB刻度下每个band是均匀等刻度的。

从线性频率变成ERB刻度的公式如下:

可以算出开始处的ERB刻度是21.2846,结束处的ERB刻度是33.2945。均匀分成63(63=64-1)份,每份是0.1906(0.1906 = (33.2945-21.2846)/ 63),所以ERB下每个band的刻度分别是:21.2846,21.4752,......,33.2945。具体如下:

再把ERB下的band映射到STFT下的频点上去,比如ERB下的band 66对应STFT下的频点是多少。从ERB刻度变到线性频率的公式如下:

可以求得ERB下的band对应的频率是多少Hz,再根据频率找到最靠近的STFT下的bin,这样就得到了ERB 下band和STFT下bin的映射,具体如下:

可以看到band 65对应bin 65, band 66 对应bin 66, band 67 对应bin 68,......, band 128 对应bin 256。下图看的更直观些:

令b表示STFT下某个频点,Bc表示ERB下某个band对应的中心频点,Bl表示ERB下某个band的左边界频点,Br表示ERB下某个band的右边界频点。以band 66为例,对应的STFT下的中心频点Bc为66,左边界频点Bl为65,右边界频点Br为68。频点b对应的系数由下面的数学表达式得到:

从上式看出,在band的左右边界之外,系数均为零。举几个例子:

1)算band 65值时用到的系数

这时没有左边界。Bc = 65, Br = 66。Bin 65对应的系数为(66 - 65)/(66-65) = 1,Bin 66对应的系数为0,其余bin对应的系数也均为零。所以算band 65值时用到的系数为(1,0,0,0,......)。

2)算band 66值时用到的系数

这时Bl = 65,Bc = 66, Br = 68。Bin 65对应的系数为(65 - 65)/(66-65) = 0,Bin 66对应的系数为(68 - 66)/(68-66) = 1,Bin 67对应的系数为(68 - 67)/(68-66) = 0.5,Bin 68对应的系数为0,其余bin对应的系数也均为零。所以算band 65值时用到的系数为(0,1, 0.5, 0, 0,......)。

3)算band 128值时用到的系数

这时Bl = 251,Bc = 256, 没有右边界。Bin 251对应的系数为(251 - 251)/(256-251) = 0,Bin 252对应的系数为(252 - 251)/(256-251) = 0.2,Bin 253对应的系数为(253 - 251)/(256-251) = 0.4,Bin 254对应的系数为(254 - 251)/(256-251) = 0.6,Bin 255对应的系数为(255 - 251)/(256-251) = 0.8, Bin 256对应的系数为(256 - 251)/(256-251) = 1,其余bin对应的系数均为零。所以算band 128值时用到的系数为(0, 0, ......, 0, 0.2, 0.4, 0.6, 0.8, 1)。

至此,高频STFT 下192维到ERB下 64维值的换算需要的矩阵就求出来了。

上面是模型里第一个模块ERB.BM需要用的系数矩阵。进ERB.BM的数据是(1,3,7,257)的矩阵,出ERB.BM的数据是(1,3,7,129)的矩阵,示意如下图:

模型里最后一个模块ERB.BS,可以看作是BM的反过程,把高频的ERB下的64维值转换成STFT下的192维值。也需要一个转换矩阵,上面BM的转换矩阵做个转置即可得到。进ERB.BS的数据是(1,3,7,129)的矩阵,出ERB.BS的数据是(1,3,7,257)的矩阵,示意如下图:

上面的这两个矩阵共有24576(192x64x2=24576)个参数,是整个模型参数的一部分,只不过它们是事先算好的,不需要训练。

2,SFE

SFE(subband feature extraction,子带特征提取)的作用是学习频带之间的局部相关性。 ERB.BM把相邻频带的局部频谱关系变弱,SFE是把相邻频带的局部频谱关系重新编码进来。SFE的输入是由ERB实部、虚部和幅值形成的3通道数据。SFE就是在每一通道上把当前频带的左右相邻频带也各形成1通道数据,这样就得到了3通道数据。由于有实部、虚部和幅值3通道,所以总共就是9通道数据作为后续模块的输入。

下面以某帧前8个band上的值为例来说明,更好的帮助理解。做完ERB.BM后某帧前8个band上的值如下:

三行表示实部、虚部和幅值3个channel,8列表示前8个band上的值。SFE要做的是分别在实部、虚部和幅值这三个channel上,把1维数据扩展成3维数据,即除当前一维外,另两维分别是上一band和下一band上的值。以实部这一channel为例,当前band值为

所以各band上一band值为

前面没有的用0来padding。 各band下一band值为

后面没有的用0来padding。这样就形成了一个3维数据。另外两个channel的处理一样,都从1维数据扩成3维数据。最终就从3 channel扩成了9 channel的数据,如下:

这样,进SFE的数据是(1,3,7,129)的矩阵,出SFE的数据是(1,9,7,129)的矩阵,示意如下图:

3,Mask

在笔记1(语音降噪模型GTCRN学习笔记(一))里说过,GTCRN的输出是mask,是复数值,可以看成是复数的gain,GTCRN可以看成是神经网络版的维纳滤波。

设mask值为M = Mi +j * Mj,带噪PCM值做完STFT后的频谱Y = Yi + j * Yj,所以M*Y = (Mi +j * Mj)*( Yi + j * Yj) = (Mi * Yi -- Mj * Yj) + j * (Mi * Yj + Mj * Yi), 这就是降噪后的频谱。再做ISTFT,就得到了降噪后的PCM值。

GTCRN里的mask实际上是CRM(Complex Ratio Mask, 复数比率掩码)。CRM是近年来语音增强模型(如DPCRN、GTCRN 等)的核心思想之一,相比传统的 IRM(Ideal Ratio Mask),CRM不仅修改幅度,还修改相位,因此增强效果更好。模型的输出最简单可以是干净的频谱,但是有输出范围大、学习困难、网络容易发散等原因而不这么做。模型的输出还可以是实数的mask,即IRM,这样只改变幅值,不改变相位。但是现实中噪声不仅影响幅值,还影响相位。如果只改变幅值,不改变相位,声音会失真。于是就提出了复数的mask,即CRM,不仅改变幅值,还改变相位,因而有更好的降噪效果。