首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用TensorFlow 2.0构建深音频降噪器

使用TensorFlow 2.0构建深音频降噪器

作者头像
代码医生工作室
发布2019-12-06 13:51:55
发布2019-12-06 13:51:55
3.6K0
举报
文章被收录于专栏:相约机器人相约机器人

作者 | Daitan

来源 | Medium

编辑 | 代码医生团队

介绍

语音降噪是一个长期存在的问题。给定有噪声的输入信号,目的是在不降低目标信号质量的情况下滤除此类噪声。可以想象有人在视频会议中讲话,而背景音乐正在播放。在这种情况下,语音去噪系统的任务是消除背景噪声,以改善语音信号。除许多其他用例外,此应用程序对于视频和音频会议尤其重要,在视频和音频会议中,噪声会大大降低语音清晰度。

语音降噪的经典解决方案通常采用生成模型。在这里诸如高斯混合之类的统计方法会估计感兴趣的噪声,然后恢复去除噪声的信号。但是最近的发展表明,在有可用数据的情况下,深度学习通常胜过这些解决方案。

在本文中,使用卷积神经网络(CNN)解决了语音降噪问题。给定有噪声的输入信号,目标是建立一个统计模型,该模型可以提取干净信号(源)并将其返回给用户。在这里,着重于将常规语音信号与在城市街道环境中经常发现的十种不同类型的噪声进行信号源分离。

数据集

对于语音降噪问题,使用了两个流行的公开音频数据集。

  • Mozilla通用语音(MCV)

https://voice.mozilla.org/

  • UrbanSound8K数据集

https://urbansounddataset.weebly.com/urbansound8k.html

正如Mozilla在MCV网站上所说的那样:

Common Voice是Mozilla的一项倡议,旨在帮助教会机器真实的人们如何说话。

数据集包含记录的2,454小时,以简短的MP3文件传播。该项目是开源的,任何人都可以在该项目上进行协作。在这里,使用了数据的英文部分,其中包含30GB的780个经过验证的语音小时。该数据集的一个很好的特征是说话者的巨大变异性。它包含各种年龄和口音的男女录音。

UrbanSound8K数据集还包含小片段(<= 4s)的声音。但是有8732个带有标签的示例,其中包含十种常见的城市声音。完整列表包括:

  • 0 =空调
  • 1 = car_horn
  • 2 =儿童游戏
  • 3 =狗吠
  • 4 =钻孔
  • 5 =发动机怠速
  • 6 =枪声
  • 7 =手提凿岩机
  • 8 =警笛声
  • 9 = street_music

将使用城市声音作为语音示例的噪声信号。换句话说,首先接收一个小的语音信号-可能是有人在说MCV数据集中的随机句子。

然后,增加了噪音-例如女人在说话,狗在背景中吠叫。最后,将此人为噪声信号用作深度学习模型的输入。反过来,神经网络接收到此噪声信号,并尝试输出清晰的信号。

下图显示了来自MCV的纯净输入信号(上),来自UrbanSound数据集的噪声信号(中)和所得的噪声输入(下)的可视化表示(添加噪声信号后的输入语音)。另外,请注意,将噪声功率设置为使信噪比(SNR)为零dB(分贝)。比率大于1:1(大于0 dB)表示信号多于噪声。

数据预处理

当前深度学习技术的大多数好处都在于,手工制作的功能不再是构建最新模型的重要步骤。以SIFT和SURF之类的特征提取器为例,它们经常用于计算机视觉问题(例如全景拼接)中。这些方法从图像的局部提取特征以构造图像本身的内部表示。但是,为了实现通用化的必要目标,需要大量工作来创建足够强大的功能以应用于实际场景。换句话说,这些功能必须与经常看到的常见转换保持不变。这些可能包括旋转,平移,缩放等方面的变化。当前深度学习的一件很酷的事情是,这些属性中的大多数都是从数据和/或从特殊运算(例如卷积)中获悉的。

对于音频处理,希望神经网络将从数据中提取相关特征。但是,在将原始信号馈送到网络之前,需要将其转换为正确的格式。

首先,将来自两个数据集的音频信号下采样至8kHz,并从中删除无声帧。目标是减少计算量和数据集大小。

重要的是要注意,音频数据与图像不同。由于假设之一是使用CNN(最初是为计算机视觉设计的)进行音频降噪,因此了解这种细微差别非常重要。原始形式的音频数据是一维时间序列数据。另一方面,图像是即时瞬间的二维表示。由于这些原因,音频信号通常被转换为(时间/频率)2D表示。

梅尔频率倒谱系数(MFCC)和恒定Q频谱是音频应用中经常使用的两种流行表示。对于深度学习,可以避免使用经典的MFCC,因为它们会删除大量信息并且不保留空间关系。但是,对于源分离任务,通常在时频域中进行计算。音频信号在大多数情况下是不稳定的。换句话说,信号的均值和方差在一段时间内不是恒定的。因此,在整个音频信号上计算傅立叶变换没有太大意义。因此,向DL系统提供了使用256点短时傅立叶变换(STFT)计算的频谱幅度矢量。可以在下面看到音频信号的常见表示形式。

音频数据的常见2D表示。从上到下:(1)STFT幅度谱;(2)频谱图;(3)我的频谱图;(4)常数q; (5)梅尔频率倒谱系数(MFCC)

为了计算信号的STFT,需要定义一个长度为M的窗口和一个跳数值R。后者定义窗口如何在信号上移动。然后,在信号上滑动窗口并计算窗口内数据的离散傅里叶变换(DFT)。因此,STFT只是对数据的不同部分进行傅立叶变换的应用。最后,从256点STFT向量中提取幅度向量,并通过去除对称的一半获取第一个129点。所有这些过程都是使用Python Librosa库完成的。下图来自MATLAB,说明了该过程。

MATLAB STFT文档

在此,将STFT窗口定义为长度为256,跳数为64的周期性Hamming窗口。这确保了STFT向量之间有75%的重叠。最后,将八个连续的带噪STFT向量连接起来,并将其用作输入。因此,输入矢量的形状为(129,8),由当前STFT噪声矢量加上七个先前的STFT噪声矢量组成。换句话说,该模型是一种自动回归系统,可以根据过去的观察预测当前信号。因此,目标包括纯音频中形状(129,1)的单个STFT频率表示。下图描述了特征向量的创建。

深度学习架构

深度卷积神经网络(DCNN)很大程度上基于完全卷积神经网络进行的语音增强功能。在这里提出了级联冗余卷积编解码器网络(CR-CED)。

https://arxiv.org/abs/1609.07132

该模型基于对称编码器-解码器体系结构。这两个组件都包含卷积,ReLU和批归一化的重复块。该网络总共包含16个这样的块-总共增加了33K参数。

同样,在某些编码器和解码器模块之间存在跳过连接。在这里来自两个分量的特征向量通过加法进行组合。与ResNets非常相似,跳过连接可加快收敛速度并减少渐变的消失。

CR-CED网络的另一个重要特征是卷积仅在一个维度上完成。更具体地,给定形状的输入频谱(129 x 8),仅在频率轴(即第一个)上执行卷积。这确保了频率轴在转发传播期间保持恒定。

少量训练参数和模型体系结构的结合,使该模型非常轻巧,执行速度快,尤其是在移动或边缘设备上。

网络生成输出估算值后,将优化(最小化)输出信号与目标信号(纯音频)之间的均方差(MSE)。

结果与讨论

检查一下CNN去噪器获得的一些结果。

首先,请听MCV和UrbanSound数据集中的测试示例。它们分别是干净的语音和噪声信号。概括地说,干净的信号用作目标,而噪声音频用作噪声的来源。

https://github.com/sthalles/sthalles.github.io/blob/master/assets/practical-dl-audio-denoising/examples/clean_input.wav

https://github.com/sthalles/sthalles.github.io/blob/master/assets/practical-dl-audio-denoising/examples/noise_signal.wav

现在,看看传递给模型的噪声信号以及各自的去噪结果。

https://github.com/sthalles/sthalles.github.io/blob/master/assets/practical-dl-audio-denoising/examples/noisy_input.wav

https://github.com/sthalles/sthalles.github.io/blob/master/assets/practical-dl-audio-denoising/examples/denoised.wav

在下面,可以将降噪后的CNN估计值(底部)与目标(顶部的干净信号)和噪声信号(用作中间的输入)进行比较。

鉴于任务的难度,结果在一定程度上是可以接受的,但并不完美。确实在大多数示例中,模型都可以使噪声平滑,但并不能完全消除噪声。看一个不同的例子,这次是狗在后台吠叫。

https://github.com/sthalles/sthalles.github.io/blob/master/assets/practical-dl-audio-denoising/examples/dog_noisy.wav

https://github.com/sthalles/sthalles.github.io/blob/master/assets/practical-dl-audio-denoising/examples/dog_clean.wav

阻止更好的估计的原因之一是损失函数。均方误差(MSE)成本可优化训练示例中的平均值。

可以认为这是找到一种平滑输入噪声音频以提供干净信号估计的均值模型。因此,解决方案之一是针对源分离的任务设计更具体的损失函数。

一个特别有趣的可能性是使用GAN(Generative Adversarial Networks)来学习损失函数本身。确实,音频去噪问题可以被构造为信号到信号的转换问题。非常类似于图像到图像的转换,首先,生成器网络接收噪声信号并输出干净信号的估计值。然后,鉴别器网络接收噪声输入以及生成器预测器或实际目标信号。这样,GAN将能够学习适当的损失函数,以将输入的噪声信号映射到它们各自的干净对应对象。期待着实现这一有趣的可能性。

结论

音频降噪是一个长期存在的问题。通过遵循本文中描述的方法,以相对较小的努力即可达到可接受的结果。轻量级模型的优势使其对于边缘应用程序很有趣。下一步,希望探索新的损失函数和模型训练程序。

可以在此处获取完整的代码。

https://github.com/daitan-innovation/cnn-audio-denoiser

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档