基于FullSubNet 的单通道实时语音增强算法
2024-05-18许苏魁万家山潘敬敏胡婷婷
许苏魁*,万家山,潘敬敏,胡婷婷
(安徽信息工程学院计算机与软件工程学院,安徽芜湖)
引言
语音降噪是语音领域一个古老又基本的话题,旨在从受噪声干扰的信号中有效地分离出纯净的目标信号。传统的语音降噪主要是基于数字信号处理的方法,常用的有谱减法[1]、滤波法[2]等。但是这些方法都是基于噪声稳定性的假设,一旦噪声是非平稳的,比如说是冲激噪声,则降噪效果非常有限。
最近几年,基于深度学习的语音降噪技术得到了巨大的发展,并且也证实了对于非平稳噪声也能有很好的去除能力。基于深度学习的语音降噪技术主要采用的是时频掩蔽(time-frequency mask, TF-Mask)的有监督训练方式,通过学习一个定义在时频域上的二维矩阵的值来进行网络优化。基于神经网络的语音降噪常用的模型有全连接神经网络,卷积神经网络(CNN),循环神经网络(RNN)[3],Transformer[4]等。
然而在实时会议的场景下,为了减少通信的延时,对语音信号的各种处理往往都要求必须采用“一帧进一帧出”的方式,也就是“帧流式”(frame streaming mode)来进行。并且为了防止延时的累积,对于时长为Tframe的一帧数据,模型处理其耗费的时间Tprocess必须满足Tprocess Hao 等人[5]提出了一种完全依赖于长短时记忆单元(Long Short Term Memory, LSTM)[6]的实时降噪模型FullSubNet,在没有卷积操作的情况下,也取得了很优秀的客观指标提升和主观听感认可。 我们综合考虑语音增强的各项客观指标和性能,以及“帧流式”的易实现性,决定在FullSubNet 的原始模型基础上进行修改。通过手动保存LSTM不同时刻的state信息,以及实现帧级层面的累积拉普拉斯规整,以让整个模型真正可以做到“帧流式”,更方便的应用在实时通信的工程项目里。 本文的主要贡献包括3 个方面:(1) 提出一种基于FullSubNet 的“帧流式”实时语音降噪模型,并且详细介绍了如何实现按帧处理数据和恢复语音。(2) 在“帧流式”模式的基础上,重新测试了DNS 挑战赛的数据集,客观语音质量评估(perceptual evaluation of speech quality, PESQ)[7]指标只有0.1 的下降,并且证明了性能下降的主要原因是按帧做iFFT和overlap and add 操作。(3) 验证了新模型在GPU 和CPU 上的速度均满足实时处理的要求。 语音信号降噪任务在时域上可以定义为 式中:x(t),s(t),n(t)分别表示带噪语音,纯净语音和噪声;t 是时域的索引。我们的任务目标是在观测到带噪信号x(t)的情况下尽可能的恢复出原始的纯净语音s(t)。如果我们对公式两边做短时傅里叶变换(short time fourier transform, STFT),得到其在STFT域的表示为 式中:f 是频率域的下标。假设一段语音总共有T 帧,做完FFT 之后的频域通道共有F 个通道,那么t=1,2,…,T,f=1,2,…,F。 2.1 全频带特征 对于第t 帧,我们将F 个频域通道的复数模拼接成一个长度为F 的向量,即为该帧的全频带特征,可以记为 因为我们的全频带模型是一个LSTM结构,需要序列输入,因此可以取t=1,2,…,T 的所有Xfull(t)拼成一个序列作为全频带模型的输入,即 3.2 模型训练目标 本文模型输入只有幅度谱,没有相位信息。我们参考复数掩模cIRM 的方式,在没有输入相位,仅输入模长信息的条件下,预测复数谱的实部和虚部对应的mask。 假设带噪信号的STFT谱、预测的复数掩模、恢复后信号的STFT谱的复数值分别为X,M,S,从而有 根据公式可以分别求解出Mr和Mi为 在训练的时候,会把式(9)里的值进行压缩获得cIRM 作为训练目标以加速收敛,即 一般取K=10,C=0.1。在测试的时候,根据式由cIRMr和cIRMi求出Mr和Mi,再代入式得到恢复后语音的复数谱S。 3.3 帧流式实时模型 在训练的时候,我们可以把整句话的特征输入给模型,也就是输入的张量有时间维T,对于单通道的语音,Gfull的输入X~full张量形状可以是[B,F,T],LSTM模型的状态由框架内部处理,比如直接调用torch.nn.LSTM 接口。但是在“帧流式”实时推理时,由于数据是按帧送入模型的,时间维T 消失,对于单句测试有B=1,从而Gfull的输入Xfull(t)形状为[1,F]。因此我们需要重新构建模型,把所有LSTM换成LSTMCell,也就是自己维护LSTM的states 信息。 3.5 按帧复原语音 完整的按帧复原语音的流程如算法1 所示,注意这里用到了信号处理领域的overlap-and-add[9]的操作。 算法1.“帧流式”实时语音增强算法。 4.1 数据集简介 本文采用 DNS-Challenge InterSpeech2020 的数据集进行实验,该数据集包含来自2 150 个说话人的500 小时干净语音,和包含150 类总计180 小时的噪声。测试集是DNS 挑战赛提供的一个公开测试集,为了计算相关指标,我们选择了该测试集里合成的集合,这个集合有带噪语音对应的纯净语音,可以作为目标计算各项指标。 4.2 训练策略 对于STFT我们采用512 点FFT,帧移256,除了按帧复原时采用的合成窗之外,其他窗函数都是512 点的hanning窗。训练采用整句训练的方式,句子长度统一为3.072 s。为了利用未来信息同时考虑延时的要求,设置τ=2 也就是延时2 帧。子频带特征左右各展开频点N=15。Gfull和Gsub的LSTM隐含层节点数分别为512 和384。采用Adam优化方式,学习率设置为默认的0.001。所有代码在PyTorch 框架[10]下实现。 4.3 评价指标 我们主要关注语音质量感知评估(PESQ)[7]指标,该指标越大越好,并且和主观听感关联最大。 4.4 性能对比 我们关注以下几种策略在DNS 测试集上的PESQ结果,如表1 所示。 表1 不同策略下的性能比较 策略1 是标准的方式,采用整句LSTM训练和测试,语音恢复直接调用框架的iSTFT 接口即可,分析与合成窗采用相同的hanning 窗。策略2 将模型里的LSTM换成了LSTMCell,通过直接映射模型state_dict的方式给LSTMCell 权重赋值,根据算法1 进行“帧流式”的按帧复原测试,采用overlap and add,窗函数采用双正交循环的方式处理。 可以看到,采用策略2 的完全“帧流式”方式,PESQ相比于策略1 下降了约0.13,但是2.85 的PESQ 相比于原始带噪语音的1.82,或者是官方给出的基线模型性能2.37,提升也是相当明显的。 为了分析策略2 最后计算出的PESQ 指标相比于策略1 下降的原因,也为了验证LSTMCell 模型的“帧流式”测试流程正确性,我们进一步尝试了策略3。即将策略2 按帧处理增强后的频域信号S 完整保留下来;待所有时刻的S 全部计算完,拼接成一个完整的时频信号,直接调用框架的iSTFT接口。可以看到,策略3 的PESQ和策略1 完全一致,从而说明策略2 性能下降主要来源于overlap and add 的复原方式。 为了评估真实产品下的实时率,我们测试模型在GPU 和CPU 下处理16 ms 一帧数据的平均耗时。对于CPU如果将模型由torch 转为onnx,则性能会有较大的提升,这可能是PyTorch 对于CPU 并没有做太多优化的原因。相关测试结果如表2 所示。 表2 不同硬件和模型格式下的一帧数据平均耗时比较 可以看到,如果采用GPU的话,16 ms 一帧的数据仅耗时1.5 ms,肯定达到实时性的要求。如果是CPU 的话,通过将模型转为onnx格式,平均耗时3.8 ms,也能达到实时性的要求。 本文提出了一种基于LSTM的“帧流式”实时语音增强模型,在系统固定延时32 ms 的前提下,实现“帧流式”的语音增强,在公开的DNS 挑战赛测试集上取得了2.85 的PESQ,相比于原始的带噪语音和官方基线性能提升明显。 同时,本文详细的给出了按帧复原信号的算法流程细节。并且在不同硬件平台上测试了模型的实时率,在GPU 和CPU 上处理16 ms 一帧的语音分别耗时约为1.5 ms 和3.8 ms,基本满足真实的实时通信系统集成要求。1 任务定义
2 全频带- 子频带特征
3 帧流式实时语音增强模型
4 实验结果
5 结论