资讯动态

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

发布时间:2026/10/27 10:29:51 来源:尧图企业网站定制
上篇文章语音降噪模型GTCRN学习笔记一对GTCRN做了概述。从本篇开始讲GTCRN里面的细节本文先讲ERB、SFE和MASK等。先说明一下我主要是通过调试来理解GTCRN基本原理。GTCRN的开源代码提供了模型、推理代码以及带噪的音频文件等在python环境下通过这些就可以来调试。为了更方便调试即更方便看打印信息我把带噪的音频文件做了截取只留下7帧数据。模型的输入是做完STFT后的复数频谱分别取出实部和虚部再算出幅值就得到了3维数据或者说3通道channel数据。音频文件是16K HZ采样率的帧长32ms帧移16ms做完STFT后是257维的数据即特征是257维的。GTCRN中送给模型的数据格式是BCTF。B表示batch size执行推理时只有一个文件所以B一直等于1。C表示channel通道数这里有实部、虚部和幅值3通道所以为3。T表示帧数这里是7。F表示特征feature这里是257。所以我在调试时送给模型第一个模块ERB.BM的数据是一个137257的矩阵。通过看各个步骤后的数据的维度以及其他打印信息来帮助理解原理。1ERBERBEquivalent Rectangular Bandwidth等效矩形带宽是 GTCRN等现代语音增强模型中经常使用的一个特征它的目标是把频率轴从线性频率刻度转换成更接近人耳听觉分辨率的刻度。人耳低频分辨率高高频分辨率低因而低频需要更多频带高频可以粗些。具体到GTCRN它把做完STFT后257个bin的前65个bin上的值保留后192个bin上的值变成64个band上的值这样得到一个129129 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, 所以以高频下第一个bandband 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.25HZ31.25x652031.25STFT中要变化的结束频点256的频率是8000HZ。在ERB刻度下每个band是均匀等刻度的。从线性频率变成ERB刻度的公式如下可以算出开始处的ERB刻度是21.2846结束处的ERB刻度是33.2945。均匀分成636364-1份每份是0.19060.1906 33.2945-21.2846/ 63所以ERB下每个band的刻度分别是21.284621.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) 1Bin 66对应的系数为0其余bin对应的系数也均为零。所以算band 65值时用到的系数为(1,0,0,0,……)。2算band 66值时用到的系数这时Bl 65Bc 66, Br 68。Bin 65对应的系数为(65 - 65)/(66-65) 0Bin 66对应的系数为(68 - 66)/(68-66) 1Bin 67对应的系数为(68 - 67)/(68-66) 0.5Bin 68对应的系数为0其余bin对应的系数也均为零。所以算band 65值时用到的系数为(01, 0.5, 0, 0,……)。3算band 128值时用到的系数这时Bl 251Bc 256, 没有右边界。Bin 251对应的系数为(251 - 251)/(256-251) 0Bin 252对应的系数为(252 - 251)/(256-251) 0.2Bin 253对应的系数为(253 - 251)/(256-251) 0.4Bin 254对应的系数为(254 - 251)/(256-251) 0.6Bin 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的数据是137257的矩阵出ERB.BM的数据是137129的矩阵示意如下图模型里最后一个模块ERB.BS可以看作是BM的反过程把高频的ERB下的64维值转换成STFT下的192维值。也需要一个转换矩阵上面BM的转换矩阵做个转置即可得到。进ERB.BS的数据是137129的矩阵出ERB.BS的数据是137257的矩阵示意如下图上面的这两个矩阵共有24576192x64x224576个参数是整个模型参数的一部分只不过它们是事先算好的不需要训练。2SFESFEsubband feature extraction子带特征提取的作用是学习频带之间的局部相关性。 ERB.BM把相邻频带的局部频谱关系变弱SFE是把相邻频带的局部频谱关系重新编码进来。SFE的输入是由ERB实部、虚部和幅值形成的3通道数据。SFE就是在每一通道上把当前频带的左右相邻频带也各形成1通道数据这样就得到了3通道数据。由于有实部、虚部和幅值3通道所以总共就是9通道数据作为后续模块的输入。下面以某帧前8个band上的值为例来说明更好的帮助理解。做完ERB.BM后某帧前8个band上的值如下三行表示实部、虚部和幅值3个channel8列表示前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的数据是137129的矩阵出SFE的数据是197129的矩阵示意如下图3Mask在笔记1语音降噪模型GTCRN学习笔记一里说过GTCRN的输出是mask是复数值可以看成是复数的gainGTCRN可以看成是神经网络版的维纳滤波。设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实际上是CRMComplex Ratio Mask 复数比率掩码。CRM是近年来语音增强模型如DPCRN、GTCRN 等的核心思想之一相比传统的 IRMIdeal Ratio MaskCRM不仅修改幅度还修改相位因此增强效果更好。模型的输出最简单可以是干净的频谱但是有输出范围大、学习困难、网络容易发散等原因而不这么做。模型的输出还可以是实数的mask即IRM这样只改变幅值不改变相位。但是现实中噪声不仅影响幅值还影响相位。如果只改变幅值不改变相位声音会失真。于是就提出了复数的mask即CRM不仅改变幅值还改变相位因而有更好的降噪效果。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑