语音增强概述

基本介绍

语音增强(Speech Enhancement)是处理和改善语音信号质量的一项技术,主要用于减少噪声和混响对语音的影响,提升语音的清晰度和可理解性。其应用场景广泛,如电话通信、语音识别、助听设备、会议系统和录音质量的提升等。 

语音增强的目标

语音增强的主要目标是从受干扰的语音信号中分离出干净的语音信号,通常通过以下两种方式实现:

  1. 去噪:消除背景噪音,包括交通噪音、人群噪音、风声等。
  2. 去混响:降低房间或环境中的回声和反射声的影响。

常用的语音增强方法

  1. 传统方法

    • 谱减法(Spectral Subtraction):通过从受噪声污染的语音信号频谱中减去噪声频谱估计值来减少噪音。
    • 维纳滤波(Wiener Filtering):通过频域滤波器减少噪音,滤波器的设计基于噪声和语音信号的估计。
    • 子空间方法:通过将信号分解为噪声和语音的不同子空间,从中提取干净的语音信号。
  2. 深度学习方法

    • 卷积神经网络(CNN):通过时域或频域的卷积操作来捕捉局部特征,从而去除噪声。
    • 循环神经网络(RNN)和长短期记忆网络(LSTM):利用语音信号的时序特性来提高语音增强效果,尤其适用于具有时间依赖性的噪声环境。
    • 生成对抗网络(GANs):通过对抗性学习生成高质量的增强语音。
    • 自注意力机制(Self-Attention):用于捕捉语音信号中长距离的依赖关系,提升语音的清晰度。

语音增强的评价指标

  • 信噪比(SNR, Signal-to-Noise Ratio):衡量增强后语音相对于噪声的强度。
  • 感知语音质量(PESQ, Perceptual Evaluation of Speech Quality):一种主观的语音质量评估标准。
  • 语音可懂度(STOI, Short-Time Objective Intelligibility):衡量语音可懂度的客观指标。

主要挑战

  1. 复杂噪声环境:面对多种噪声源和非平稳噪声时,传统方法表现有限。
  2. 混响处理:混响信号与噪声的性质不同,处理难度较大,尤其是需要保留一定的自然性。
  3. 低延迟要求:对于实时应用,如电话或会议系统,增强过程需要在极短时间内完成。

应用场景

  • 电话通信和会议系统:通过语音增强减少背景噪音,使通话或会议更加清晰。
  • 语音助手:改善设备拾取语音命令的准确性,尤其是在噪音环境中。
  • 助听设备:帮助听力受损者在嘈杂环境下更好地理解语音。

语音增强的发展

早期的DSP方法

早年间,语音增强主要依赖传统的DSP(Digital Signal Processing,数字信号处理)技术,市面上大部分通话以及视频软件的基本降噪思路都依赖于平稳噪声估计结合维纳滤波/谱减法,复杂一些的会引入卡尔曼滤波等方法对噪声进行更细致的估计,但无论怎样改动,对瞬态噪声的抑制都很难做好,因为传统的噪声建模和动态更新都是有一定延时的,且噪声和失真很难平衡,通常噪声抑制多就会导致频谱上的空洞,进而出现音乐噪声,还会带来语音失真。

AI结合DSP

早年AI算法的使用,主要是作为DSP的辅助。当然,DSP和AI结合使用的方案,到目前仍有很多研究,因为AI生成的语音,特别是mapping的模型,在低信噪比条件下容易出现机器音,且容易失真,结合DSP能对AI进行一定程度修补和辅助;只是早年间AI是辅助DSP,现在是DSP辅助AI。

RNNoise

早期结合方案比较有代表的是WebRTC RNNoise【2】,这一模块利用了递归神经网络(RNN)对噪声进行建模和抑制,尤其在复杂和非平稳噪声场景下表现优异。

以下是 RNNoise 的典型处理步骤:

1.特征提取

RNNoise 并不直接对原始频谱进行处理,而是提取一些特征。这些特征包括:

  • 对数谱(Log Power Spectrum):对频谱的功率谱取对数。
  • 线性预测系数(LPC):对语音信号的线性特性进行建模,帮助捕捉语音的共振峰和噪声之间的差异。
  • 其他特征:可能还包括MFCC(梅尔频率倒谱系数)等高级特征。

这些特征表示帮助神经网络理解信号中语音和噪声的区别。

2.递归神经网络(RNN)处理

提取的特征随后被输入到一个轻量级的递归神经网络(RNN)中,能够有效处理时间序列数据,适合建模语音信号的动态变化。

3.频谱掩蔽(Masking)

神经网络的输出是一个频谱掩蔽值(mask),这个掩蔽值通常在 0 到 1 之间,表示每个频带上噪声的概率。该掩蔽值被用来调整频谱的各个部分,以便保留语音并抑制噪声。

他优势就是计算量较低,能够在嵌入式系统或移动设备上实时运行,适合WebRTC等应用场景,而且通过RNN学习复杂的噪声模式,适合非平稳噪声。

Beamforming+AI

近年来,DSP主要为AI提供一些辅助信息,以到达一些特定的任务,比如在论文Guided Speech Enhancement Network中,如下图,作者将beamforming的结果作为后续AI网络的一个指导,实现对特定方向的进一步增强,到达语音隔离的效果。

还有一些类似的文章,也是这样的思路,如下图,论文Leveraging Low-Distortion Target Estimates for Improved Speech Enhancement中,将AI估计的干净谱作为MVDR的输入,得到MVDR的输出后再进行一次增强,传统算法作为两个DNN网络的桥梁,进一步提升了网络效果。

AI+DSP后处理

很多文章会利用传统算法对AI过后的语音进行后处理,以提升语音的可懂度并减小语音失真,比如A Perceptually-Motivated Approach for Low-Complexity, Real-Time Enhancement of Fullband Speech中,作者在AI处理后,加入了Envelope Postfiltering,使得频谱更加干净,听感更好。

当然,AI结合DSP还有很多例子,思路都基本都是作为辅助添加在AI网络的前中后,这边就不继续赘述。

纯AI方案

全连接网络

2014年,DNN开始用于语音降噪任务,在论文《Regression deep neural network for speech enhancement》引入了一种使用深度神经网络(DNN)的语音增强模型,DNN模型直接学习噪声语音和目标干净语音之间的映射。通过输入频谱特征,该模型可以预测每个时间频率点的增强后的语音谱,并去除噪声,GITHUB上可以找到一些他的实现【1】。

DNN 网络

上图出自《Regression deep neural network for speech enhancement》,可以看到,早期神经网络非常的粗糙,可以说是大力出奇迹,幅度谱直接输入到拼接在一起的多个全连接层,最后输出干净幅度谱。

其效果在测试集上还算可以,但泛化性较差,信噪比低一点的场景就会出现语音卡顿和失真,这也是其没有早期没有大规模商用的原因之一,另一个原因就是早年NPU,GPU,CPU性能较差,DNN模型的计算量和参数量相对DSP算法要大很多,并没有部署的土壤。

LSTM/GRU

LSTM(Long Short-Term Memory,长短期记忆网络)最早由Sepp HochreiterJürgen Schmidhuber1997年在他们的论文《Long Short-Term Memory》中提出。LSTM是一种特殊的递归神经网络(RNN),旨在解决RNN中常见的梯度消失和梯度爆炸问题,使得网络能够更好地捕捉和记忆长期依赖信息。

RNN被引入是因为全连接层的网络中,只会捕获输入时间范围内的信息,涉及到图片的处理时,全连接层的设计问题不大,但语音任务对实时处理要求比较高,需要关联前后帧信息,此时就需要一个记忆网络,LSTM是一个有代表性的RNN网络,一直在如今都在很多网络中使用,因为他非常适合real-time的处理。

LSTM整体结构可以看上图,简单来说就是引入了门控机制:

  • 门控机制(Gating Mechanism):LSTM通过三个门控机制来控制信息的流动:

    • 遗忘门(Forget Gate):决定应该遗忘哪些信息。
    • 输入门(Input Gate):决定要将哪些新信息加入到记忆单元中。
    • 输出门(Output Gate):决定当前时间步的输出应该是什么。

GRU是另一种RNN网络,其本身的设计思路和LSTM一样,具体可参考文章Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling,他的设计相比 LSTM 更加简单,它只有两个门,没有单独的记忆单元:

  • 重置门(Reset Gate):控制是否丢弃前一步的状态信息。
  • 更新门(Update Gate):控制当前状态信息与过去状态的混合程度

通过网络的训练,LSTM/GRU能有效的捕捉历时信息,在现今的网络中,LSTM/GRU通常不用于单独的网络,而是放置在一个大网络的某个部分,用于历史信息的捕获。

U-NET

2015年,在U-Net: Convolutional Networks for Biomedical Image Segmentation文章中,提出了下图的U-NET网络。

在图像任务中,输入通常为(C, H, W),对应通道数、高度和宽度,U-NET网络用卷积压缩H,W维度,并将通道数作为特征维度不断扩大,通过卷积层和池化层提取图像的高层次特征,逐步减少图像的空间分辨率,但增加特征图的深度,捕捉全局上下文信息,这是一个下采样过程,然后用反卷积操作恢复图像的空间分辨率,并逐步重建精细的空间信息,这是一个上采样的过程。

并且U-Net 的一个关键创新点是引入了跳跃连接(skip connections)。在每个下采样阶段,网络将相应层的特征图直接传递给对称的上采样层,通过直接将下采样中的特征图传递给上采样过程,跳跃连接保留了输入图像的细节信息,如边缘和结构,防止在下采样过程中丢失重要的空间信息,另外跳跃连接在一定程度上缓解了深层网络中梯度消失的问题,有助于信息在网络中的有效传播。

另外在实现方面,因为U-NET网络有下采样过程,逐步把空间分辨率降低,相较于同等层数的全连接网络,计算量大大降低,更好部署。

在语音任务中,特别是RTC任务中,无法一次性获得全部的语音,而且是causal(因果任务,即不能使用未来信息)的任务,以图象的思路来构建语音U-NET网络不太现实,语音的输入通常是两种

  1. 时域(通道数,时间帧)
  2. 频域STFT后(通道数,时间帧,频带数)

在REAL-TIME DENOISING AND DEREVERBERATION WTIH TINY RECURRENT U-NET中,如下图作者使用了一维卷积替代二维卷积,因为实时处理时,时间帧为1,处理频域语音信号只需要对频带卷积,这样的问题是每一次U-NET网络只关注本帧的内容,造成生成的语音会非常卡顿,因为前后没有联系,为了解决这个问题,作者将GRU引入到下采样的最后一层(bottleneck层),用来记住历史信息,从而保证了语音输出的连续性。

目前在语音实时处理任务中,U-NET算是最为流行的方式,因为整体模型计算量小,搭配GRU可以实现长时处理,很多前沿的文章也是在上述UNET结构上添添补补或者删删减减,比如将GRU替换为另一种特殊的网络Attention,或者卷积上用group卷积,膨胀卷积,亦或者改用复数域来做卷积,但万变不离其宗,都是在这个框架下修改。

语音增强还有很多种网络,可以参考这个github【4】,里面包含了各类网络以及他的实现。

GITHUB地址

【1】sednn/mixture2clean_dnn at master · yongxuUSTC/sednn (github.com)

【2】webrtcsdk/webrtcsdk: WebRTC Chromium Open Source and integrate RNNoise. Codecs supported: AV1, VP8, VP9, H264, H265. (github.com)

【3】nanahou/Awesome-Speech-Enhancement: A tutorial for Speech Enhancement researchers and practitioners. The purpose of this repo is to organize the world’s resources for speech enhancement and make them universally accessible and useful. (github.com)

【4】nanahou/Awesome-Speech-Enhancement: A tutorial for Speech Enhancement researchers and practitioners. The purpose of this repo is to organize the world’s resources for speech enhancement and make them universally accessible and useful. (github.com)

### 分割光流 U-net 网络架构 U-Net是一种专为生物医学图像分割设计的卷积神经网络,其特点在于能够有效地处理少量标注数据的情况。该网络采用了编码器-解码器结构,并通过跳跃连接将浅层特征与深层特征相结合,从而提高了分割精度[^4]。 #### 编码器部分 编码器由多个下采样路径组成,每条路径都包含了两次3×3大小的卷积操作(步幅为1,填充方式为same),一次ReLU激活函数以及一次2×2的最大池化操作(步幅为2)。随着层数加深,通道数量逐渐加倍,这有助于捕捉更丰富的上下文信息。 #### 解码器部分 解码器则负责逐步恢复空间维度并融合来自不同尺度的信息。它同样包含若干上采样的过程,每次都将当前特征图尺寸扩大一倍,并减少一半的通道数目。为了保持细节层次的一致性,在每个阶段都会加入相应的跳过链接——即把相同分辨率下的低级特征直接拼接到高级表示之上。 ```python import torch.nn as nn class UNet(nn.Module): def __init__(self, n_channels=3, n_classes=1): super(UNet, self).__init__() # Encoder layers self.enc_conv1 = DoubleConv(n_channels, 64) self.pool1 = nn.MaxPool2d(kernel_size=(2, 2)) ... # Decoder layers and skip connections self.up5 = UpSample(in_ch=1024, out_ch=512) self.dec_conv5 = DoubleConv(...) ... def forward(self, x): c1 = self.enc_conv1(x) p1 = self.pool1(c1) up_5 = self.up5(c5) merge5 = torch.cat([up_5, c4], dim=1) dec_c5 = self.dec_conv5(merge5) ... ``` 此代码片段展示了如何构建一个基础版本的U-Net模型框架。`DoubleConv`代表连续执行两轮卷积加ReLU的操作单元;而`UpSample`则是用于放大特征映射的方法之一。实际应用时还需要定义具体的参数传递给这些组件来完成整个网络的设计。 对于光学流动态场景中的物体运动估计任务而言,可以考虑引入额外的时间序列输入或者采用双向LSTM等机制加强时间依赖性的建模能力。此外,也可以借鉴FlowNet的工作思路,探索更适合于视频帧间变化预测的新颖损失函数形式[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值