默认
发表评论 1
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
如何利用深度学习实现单通道语音分离?
阅读(20175) | 评论(1 收藏 淘帖 1

一直以来,语音分离在音视频领域都是一个重要的课题,近年来深度学习的快速发展为解决单通道语音分离提供了一个新的思路。在LiveVideoStackCon 2019上海音视频技术大会上,大象声科高级音频算法工程师闫永杰以降噪场景为例,详细介绍了深度学习在单通道语音分离中的应用。


一、单通道语音分离问题的引入


首先,到底什么是单通道语音分离呢?

1)音频采集的方式
目前主流的音频采集方式主要包括两种场景:近场拾音和远场拾音。对于近场拾音,在我们生活中是很常见的,例如我们在使用手机打电话时手持或者开启免提。对于远场拾音,我们同样也不会陌生,像现在非常火的麦克风阵列技术就是采用的远程拾音,例如小爱同学、天猫精灵等,它们都可以做到在相隔三到五米的情况下实现远距离拾音。那么,就近场拾音和远场拾音的区别所在,首先是使用场景的不同,再就是麦克风数量的不同。远场拾音采用的麦克风数量通常为多个,有两麦、四麦、六麦、七麦,甚至还包括更加非常复杂的情况。而对于近场拾音,以手机通话来举例,通常情况下使用的是单麦或者双麦。当我们手持手机时,如果仔细观察手机可以发现手机实际上是有两个麦克风的,其中位于底部的是主麦,位于顶部的是副麦,在业界副麦也常会被叫做降噪麦克风。本次为大家介绍的单通道语音,主要讨论的是单麦克风近场拾音的场景。

2)语音分离
首先,我们需要来界定一下,到底什么是语音分离?实际上,我们经常所讲的降噪、去混响、多人声分离等等的过程都属于语音分离的过程。其中,降噪指的就是语音与噪音的分离,去混响指的就是语音与混响的分离,而多人声分离的场景则相对复杂一些,在这里包含有目标人声和其它的干扰人声。其实对于以上几种语音分离的场景,它们的最终目标是相同的,即将目标人声与其它非目标人声的语音进行分离。下面就以降噪为例。

3)降噪
在我们的现实生活中,噪音的种类是形形色色的。例如在车水马龙的街道、吵闹的酒吧和KTV,都是典型的充满嘈杂的噪音的地方。噪音对通话质量来说是一个非常大的挑战,特别是当下所流行的视频通话,视频通话双方所处的环境各有可能,那么在嘈杂的环境中对于视频通话的良好体验就会产生巨大的挑战。因此,在语音通话中实现更好的降噪已经成为了一个必不可少的课题。

那么,降噪的最终目标是什么呢?直白的说就是将目标人声从多种噪音源中分离出来。该如何实现这个目标,解决目标人声和噪音源分离的问题呢?

二、借助深度学习来解决单通道语音分离


1)传统的单通道语音增强
单通道语音一般只包含一个麦克风,这很大程度上也限制了算法的能力。如果存在有多个麦克风的话,通过一些空间信息将与主讲人方向不同的噪音去除掉即可达到语音分离的目的。而单通道语音只有一个麦克风,因此就只存在一路信号,没有方位信息,这也就为实现语音分离带来了挑战。传统的语音增强算法包括有谱减法、维纳滤波、卡尔曼滤波以及其他算法。

传统语音增强算法的缺陷在于:传统方法是基于对信号的理解,采用人工编制的一些规则;由于规则是人工编制的,这就导致存在规则很难编制详尽的问题;存在很多需要估计的算法,通过对噪音调参得到适配的参数的调参过程十分考验人对于信号的理解以及自身经验的丰富程度;最后一个也是最重要的问题就是瞬态噪音,瞬态噪音不符合算法假设,传统方法对它的处理结果基本上都是不尽如人意的。

下面为大家介绍我们解决单通道语音分离的方法。

2)计算听觉场景分析

对于这一部分,首先为大家分享一个概念——计算听觉场景分析,这套理论的主要贡献者之一是我们的首席科学家汪教授,他于2001年提出理想二值掩膜(Ideal Binary Mask,IBM),并将预测IBM作为计算听觉场景分析解决语音分离问题的计算目标。

我们来看IBM的计算公式,公式里面的IBM其实就是深度学习最终预测的目标,IBM计算所得的值为0和1,即可认为把最终结果分类成0和1,那么如何去界定0和1呢?界定条件如下:如果语音的能量s减去噪音的能量n大于一个θ值,θ一般取值为0,此时IBM的值为1,即我们认为语音比噪音大的地方,IBM是1;同样地,我们认为语音比噪音小的地方,IBM是0,即认为是噪音。这解释了为何将在之前图中第二层从左到右的第一张图谱覆盖到第一层从左到右的第二张图谱上所得的信号与纯净语音是有差距的。而这样做的好处就是成功将一个回归问题改变为分类问题,只需要预测它是0或者1就可以了,这就使得学习难度变小,更容易预测。但不好的地方就是听上去语音会有些许失真。但在2013年,当时这个方法所取得的效果已经算是非常好的。在此之后,陆续又有人提出了其他的一些计算目标,如TBM、IRM等,而这些目标其实都与IBM是相似的,只是进行了一些修正改进,例如IRM的值不仅仅只是0和1了,当我们认为它有一半的部分是语音,那么我们的目标值就是0.5。当前我们所采用的计算目标大多数是IRM。

3)深度学习

深度学习方法的本质就是通过构建模型,来拟合一个函数映射,即我们提供一个输入并告诉应该输出什么,然后通过输入大量数据,不断学习数据之间的潜在对应关系,找到一个模型去模拟这个函数映射关系。

如何用深度学习方法实现语音分离:1)首先要确定目标——IBM,当然我们在这里是以IBM为例来讲的,如果你采用IRM;2)特征输入—— 短时傅里叶变换后的幅度谱;3)训练工具现在都已经十分成熟了,Tensorflow、Pytorch都很好用;4)数据驱动,最后就是需要不断喂数据,这个喂的数据就是语音。在这里,需要讲一下的就是大部分环境中的噪音都是加性噪声,因此我们可以仿真得到混合后的声音,只需将裁好的噪音与语音加在一起即可。这样一来,我们有了训练的目标,纯净语音、噪声都是已知的,只需要把这些数据喂给网络,让它不断的调整参数,就会得到一个比较不错的效果。

三、工程实践中的挑战及解决方案


1)工程实践中的挑战

深度学习讲究的是落地,而在落地的时候,所面临的最大挑战就是部署。对于ASR或者NLP来说都是可以部署在云端上的,因此可以对模型有一些容忍度,可发挥的空间也更大一点。但是,对于实现降噪效果的,如果运行在服务器上,它的延时、实时性都是不切实际地,所以部署的终端大多数是移动设备,例如手机、iPad,甚至是在耳机中非常弱的M4芯片上。因此,对于这些设备来说,功耗必须得控制好,那么计算量就不能太大;由于这些芯片的内存非常小,例如M4可能只有几百K的空间,因此模型参数不能太大,否则无法部署。

2)模型优化

针对上述问题,我们对模型进行了优化,优化的方向包括控制模型参数规模和替换计算代价高昂的激活函数。首先,模型参数规模一定要降下来,模型参数最先影响的是带宽。如果模型参数大于所要部署的嵌入式设备的内存,则不可能实现部署,这是一个裁模性的考量。其次,要减少计算量,参数减少以后,乘加指令自然会减少。控制模型的大小是一个非常重要的方向,例如全连接层的经典模型,我们输入1024个节点,则输出1024个节点,仅仅一层网络就已经占用了4M的空间,然而设备却只有几百K的内存。因此,对于全连接层的使用一定要慎重,尽量选用其他结构如RNN或CNN来替代,尤其是CNN的参数共享可以带来非常大的提升。

我们在设计网络的时候,一定要考量DNN的输入与输出的大小规模,这是一个非常重要的点,尽量使用CNN或者RNN的结构去替代DNN。然后,还有最重要的一点就是选取一个好的Feature,刚才前面讲的我们用的Feature选择的是Mix语音、经过STFT后的幅度图,这虽然是最直观、最简单的,但是学起来难度较大。我们也在这方面做了很多的尝试和工作,例如将输入Feature从幅度谱改为mel谱就可以将输入规模大大减小。就像我在前面所讲的深度学习要学的是个函数映射,可能大家会有疑问,为什么在输入特征时不直接把时域的信号送进去,然后目标就是纯净语音的信号?其实如果这么做能成功的话,那肯定是最好的,但是如果你告诉网络的是一个完整、没有丢失的信息,这在它学习规律的过程中,对于深度学习来说,学习难度太大,参数量是降不下来的。因此,我们折中选取了频域的信号,选取频域信号以后,学习难度就会下降很多,不仅可以比较容易的能学到它的模式,而且参数量也会大大下降。所以,在裁模型的时候,一定要注意选取一个好的Feature。

最后一点也是来自工程实践中的一个问题,例如当我们训练好模型交给同事部署时,同事会反馈说,你用的ELU函数,一个EXP指令直接占用了600个cycle。后来我们发现问题,工程师在训练模型的时候,一定要与最终部署的同事沟通好,要了解到哪些函数对他们来说是很有挑战的。例如将ELU换成一个简单一些的RELU,部署所需指令可能就只有一个两个cycle,而如果用ELU,在性能上对实验结果来说差距是不大的,但是在部署时差距就会放大几百倍,所以一些代价高的函数一定要慎重使用。

3)算法优化

在做好模型优化后,一个比较小且合理的模型给到工程团队,工程团队在落地的时候还要做一些算法优化。1)定点化。大家都知道,如果做图像的话,一般会用int8去量化,这样带来的好处就是学习时用的float32,部署时用int8可以节省4倍的内存,这是一个很好的优化。但是,对于语音还不能用int8,我们尝试过,使用int8最终会导致精度太差,部署的模型预测出来的值与float32的值差距太大。这主要是因为对于语音,我们一般采样的是16bit,在后面量化时会使用Int16去替代float32,会带来1倍的内存带宽的下降。2)合理排布流水线,注意不要因为频繁地数据访存缺页,导致打断了流水线使cycle数急剧增加,一定要在汇编层流程上排布好流水线。3)利用平台并行计算指令。大多数平台都是有这个并行指令计算的,例如ARM上的NEON或者是SIMD,在可用的情况下一定要用起来,一般会有2到4倍的加速。经过这些优化以后,基本上就可以得到一个部署在手机上的模型。

四、思考


为什么深度学习会有这么好的效果呢?

1)数据驱动,一定条件下,数据越多性能越好。我们只需要采集足够多的噪音、足够多的语音,源源不断地喂给网络 ,就能够从中学习到语音的模式,所得的模型更加精确。为什么在这里要说一定条件下呢?一方面如果是同类噪音,采集的再多也没什么用,这就要求我们要保证数据的丰富性。另一方面,大家可能有一个疑虑,既然说是数据驱动的,如果某种噪音并未采集过或见过,那该怎么办呢?此时就要考量算法的泛化能力。深度学习中有一个概念就是过拟合,如果见过的数据都能拟合的非常好,而没见过的数据就会突然表现非常差,说明模型过拟合了,这是不可接受的。所以,在做音频降噪的时候,一定要考虑模型的泛化能力,同等条件下,如果模型越小,学习过程中最后的loss值跟大模型基本一致,那就说明模型泛化能力强。也就是说参数越少,泛化能力一定程度上越好,所以前面所讲的我们做的裁减模型的工作对泛化能力也是有很大的提高的。这样一来,在部署的时候,对于没见过噪声,预测的结果也不会太差。

2)相比传统算法手工统计的模式,深度学习可以学到更加鲁棒的模式。对于传统算法的调参是十分麻烦的,例如我们看过的有一些竞品算法公司调参,参数大概有几百个,在对接厂商的时候需要将参数逐一调整,以实现不错的效果,这中间的工作量非常大。但是,这几百个参数跟深度学习相比就太少了,深度学习的参数量基本上是百万规模的,甚至是千万规模的。因此,手工统计的那些参数所包含的信息,它所拟合的模型的建模能力跟深度学习是不可比拟的,因此深度学习相比于传统算法,它学到的模式更加鲁棒。

3)深度学习有记忆的能力。对于深度学习来说,一定程度上,见过的数据越丰富,效果越好。

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

推荐方案
评论 1
看不懂
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部