入门语音分离,从鸡尾酒问题开始!

机器学习算法工程师

共 6154字,需浏览 13分钟

 · 2020-10-22



   AI作者:田 旭  

  AI编辑:田 旭  

        


简 介


  

谷歌这篇文章《Looking to Listen at the Cocktail Party: A Speaker-Independent Audio-Visual Model for Speech Separation》,宣称“攻克”了鸡尾酒会问题。从提供的视频演示来看,可以通过滑动控制只听某一个人说话,非常神奇。


这篇文章本身大概讲了这么一个事:


  1. 提出一个视觉-听觉联合模型,通过视觉信息来检测环境中谁在说什么并且分离出来;模型包含两个网络来分别分析视频和音频,通过融合层合并特征,最后使用传统的时频掩膜(Time-frequency masking)来分离语音部分;

  2. 训练过程中,搜集大量(90000)高质量、单说话人且头部位置比较正的视频,选取其中说话声音干净的部分,通过融合不同的视频或者给视频加噪声来创建训练集。


可以看到深度学习在语音分离领域有着很大的推动作用,早起的语音分离方法都是基于信号处理的传统方法,再引入深度学习后,已经可以实现端到端的实时分离,特别是在单通道语音分离方面,深度学习方法已经很大程度超越了传统方法,但是在多通道的语音分离方面,深度学习方法与信号处理方法还是有很大差距。下面,我们来从鸡尾酒会问题开始入门语音分离。


由于本人水平有限,如有分析不对的地方,欢迎指正和交流。




01

鸡尾酒会问题


人类的听觉系统是除了视觉系统以外最重要的感觉系统,具有多种听觉功能,比如分辨声音的方位和距离,感觉声音的远近变化,选择性聆听感兴趣的声音等。其中,选择性聆听就是人类听觉能够在嘈杂环境中正常交流的根本原因。1953年,Colin Cherry提出了著名的”鸡尾酒会”问题:在嘈杂的室内环境中,比如在鸡尾酒会中,同时存在着许多不同的声源:多个人同时说话的声音、餐具的碰撞声、音乐声以及这些声音经墙壁和室内的物体反射所产生的反射声等。在声波的传递过程中,不同声源所发出的声波之间(不同人说话的声音以及其他物体振动发出的声音)以及直达声和反射声之间会在传播介质(通常是空气)中相叠加而 形成复杂的混合声波。因此,在到达听者外耳道的混合声波中已经不存在独立的与各个声源相对应的声波了。然而,在这种声学环境下,听者却能够在相当的程度上听懂所注意的目标语句。



“语音分离”(Speech Separation)来自于“鸡尾酒会问题”,采集的音频信号中除了主说话人之外,还有其他人说话声的干扰和噪音干扰。语音分离的目标就是从这些干扰中分离出主说话人的语音。

根据干扰的不同,语音分离任务可以分为三类:

  • 当干扰为噪声信号时,可以称为“语音增强”(Speech Enhancement)

  • 当干扰为其他说话人时,可以称为“多说话人分离”(Speaker Separation)

  • 当干扰为目标说话人自己声音的反射波时,可以称为“解混响”(De-reverberation)

由于麦克风采集到的声音中可能包括噪声、其他人说话的声音、混响等干扰,不做语音分离、直接进行识别的话,会影响到识别的准确率。因此在语音识别的前端加上语音分离技术,把目标说话人的声音和其它干扰分开就可以提高语音识别系统的鲁棒性,这从而也成为现代语音识别系统中不可或缺的一环。

基于深度学习的语音分离,主要是用基于深度学习的方法,从训练数据中学习语音、说话人和噪音的特征,从而实现语音分离的目标。




02

传统方法


1
独立成分分析 ICA


独立分量分析(Independent Component Analysis,ICA)是将信号之间的独立性作为分离变量判据的方法。由Comon于1994年首次提出。Comon指出ICA方法可以通过某个对比函数(Contrast Function)的目标函数达到极大值来消除观察信号中的高阶统计关联,实现盲源分离。盲源分离被描述成在不知道传输通道特性的情况下,从传感器或传感器阵列中分离或估计原始源波形的问题。然而,对于某些模型,不能保证估计或提取的信号与源信号具有完全相同的波形,因此有时要求放宽到提取的波形是源信号的失真或滤波版本。



2
稀疏主成分分析 Sparse PCA


稀疏主成分分析即是为了解决这个问题而引进的一个算法。它会把主成分系数(构成主成分时每个变量前面的系数)变的稀疏,也即是把大多数系数都变成零,通过这样一种方式,我们就可以把主成分的主要的部分凸现出来,这样主成分就会变得较为容易解释。

实现主成分分析稀疏化,最终会转化为优化问题, 也即对本来的主成分分析(PCA)中的问题增加一个惩罚函数。这个惩罚函数包含有稀疏度的信息。当然,最终得到的问题是NP-困难问题,为了解决它,我们就需要采用一些方法逼近这个问题的解。这也是不同稀疏主成分分析算法不同的由来。


3
非负矩阵分解 NMF


NMF的基本思想可以简单描述为:对于任意给定的一个非负矩阵V,NMF算法能够寻找到一个非负矩阵W和一个非负矩阵H,使得满足 ,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。如下图所示,其中要求分解后的矩阵H和W都必须是非负矩阵。
对一个M维的随机向量v进行了N次的观测,记这些观测为

其中

NMF的目标是求出非负的M×L的基矩阵

和L × N的系数矩阵

使得

用矩阵表示为




03

深度学习方法


处理鸡尾酒会问题的模型已经逐渐从基于信号处理,分解和规则的方法转变成为通过数据驱动形式进行学习的方法。以深度学习的一系列方法为代表,当前模型可以在大规模数据集上进行训练,从而在给定的条件下得到比较好的效果。然而,当前对鸡尾酒会问题建模的深度学习方法虽然充分利用了大规模数据集带来的优势,却也一定程度上过分依赖模型本身的优异性能,从而忽略了从人类听觉回路中进行借鉴,造成了可解释性较差,适用情况较局限等一系列问题。



下面我们已单通道(一个麦克风)和两个说话人为例,介绍几种流行的深度学习语音分离方法。



模型的输入是一段混合语音信号,表示两个说话人的声音叠加在一起,可以将输入用向量来表示,例如一段采样率16kHz的混合语音信号,1秒有16k的point,表示1秒的语音信号有16k维的长度。模型的输出是分离出的两个说话人的语音信号,输入输出纬度是一致的。

语音信号在时域有很强的时变性,在一段时间内呈现出周期信号的特点,而在另一段时间内呈现出随机信号的特点,或者呈现出两者混合的特性。将语音信号转换到频域或者其他变换域,此时语音信号在时域表现不明显的信号特征在该变换域上表现得很明显,再对表现出的信号特征进行分析。

由于语音信号的缓慢时变的特性,在进行语音信号处理时我们常用短时傅里叶STFT方法进行分析处理。具体做法是首先选取适当的窗函数将语音信号进行分帧处理,然后将各帧语音信号分别进行傅里叶变换。语音信号分帧后,每帧时间较短,可将其看成短时平稳的,这样就可观察语音信号的频谱图了。语谱图横轴为时间,纵轴为频率,语谱图可以很好的看出语音随时间、频率的变化特性。同时STFT变换后的语音时频信号为二维信号,可以将其看作一个矩阵,极大方便的语音的后续处理。



在鸡尾酒会(说话人分离)问题中,独立于说话人的系统泛化性能较好,要求是训练集与测试集说话人不重叠,排列问题和说话人数目未知问题是两个困难,现在的时域和频域上的语音分离方法大多都是基于mask掩模的思想,如下图,即语音分离可以看成矩阵分解的任务,特殊在于输入矩阵是若干输出矩阵之和,为了利用这个相关性来利用mask方法,深度聚类方法使用IBM掩模,即每个时频单元只属于一个人,因此可把掩模mask估计看成时频单元聚类(分类)的问题。

Masking实际上属于传统信号处理方法,利用的是盲源分离的特性,我们可以把语音信号表示成一个矩阵,mask方法输入的是一个混合语音(几个说话人的声音混合在一起合成)的矩阵,输出两个同样大小的mask矩阵。将每个mask矩阵与混合信号矩阵做点乘,即可分离出每个说话人的声音信号。



一般使用理想二值掩蔽方法来生产mask,对于时频表示的语音信号,输出有几个信号就会生成几个mask矩阵,以两个说话人为例,在每个时频点比较两个说话人语音能量的大小,将能量大的一方的mask矩阵对应位置的值设为1,另一个mask矩阵的对应位置设为0。深度学习方法可以通过训练得到输出信号对应的mask矩阵。



下面介绍几种流行的深度学习语音分离方法。


1
深度聚类 Deep Clustering


由于分离结果排列不确定,过去的深度学习方法通常只能做说话人相关的语音分离,即训练和测试的语音数据是相同的说话人的语音。Deep Clustering方法是最早应用于说话人无关的的模型,该模型训练的数据是这几个人的语音,测试数据可以是另外几个人的语音。

深度聚类Deep Clustering方法是MERL实验室Hershey等人于2016年提出的工作。Deep Clustering算法训练神经网络为输入特征中的每个元素生成一个具有区分性的嵌入向量(embedding),之后利用聚类算法,如K-means,对生产的embedding进行聚类,得出不同类别即是不同说话人的信号分离结果图。Deep Clustering性能和泛化性能(训练在英文,测试在中文等情况)都比较好,但缺点是它不是一个end to end的方法,因为聚类方法不能训练。

对于是时频域的语音信号,矩阵中的每个时频点只有一个元素,通过神经网络训练,对输入特征的每个时频点元素生产一个D维的embedding向量V,用以表示该时频点的说话人信息,对于所有的时频点,则得到embedding矩阵



模型训练完成后,在测试阶段,输入混合语音的频谱特征,网络会对每个时频点生成embedding向量。然后把每个时频点的embedding向量看作一个样本,利用聚类方法,如K-means,对样本集合按照设定的类别C进行聚类,每一个类别对应一个说话人。测试阶段的聚类类别C可以与训练阶段不同,例如训练时有两个说话人,测试时可以使用3个说话人,网络同样是work的。有了分类之后,利用IBM时频掩蔽的方式从混合信号中提取每个说话人对应的语音信号。


2
置换不变训练 Permutation Invariant Train (PIT)


PIT 是腾讯余栋等人提出来的一种end to end的语音分离方法。PIT模型的设计思想是当模型给定,就可以给出一个确定的排列(选择可以使得损失函数最小的那一种排列方式),反之当排列给定可以训练模型,因此最初随机初始化一个分离模型,得到一个排列,接着更新模型,反复迭代至收敛。



假如有两个说话人,由于输出排列不确定,我们无法确定网络的哪一个输出与应,哪一个与应。假设网络对两个说话人的估计是说话人无关语音分离需要解决的问题就是之间如何匹配的问题。PIT网络中对说话人语音的估计可以使用特征映射的方法,也可以使用时频掩蔽的方法。此时对说话人的预测可能由下式得到:


其中Mask1和Mask2别是网络两个输出层的输出,Y是混合信号的时频表示,示元素相乘。对于,网络预测与真实目标之间可能共有两种组合方式,可以每种组合方式计算对应的预测误差,选择误差小的那种输出排列,利用这种排列再对网络进行训练。



3
深度聚类 Deep Clustering


TasNet(Time-domain Audio Separation Network)是时域的方法(直接输入混合语音,不经过STFT等变化得到声音特征),由编码器、分离网络、解码组成,与频域方法相比,编码过程不是固定的而是网络学到的(论文中认为对于语音而言STFT并不一定是最佳编码方式,有两点证实了此观点,论文中对编码器输出增加非负的约束会使模型变差,对编解码器增加互逆的关联约束使模型变差,即同一信号经过编码器再经过解码器得到同一信号),通过分离网络得到两个mask,学到的mask与编码器输出相乘再经过解码器得分离的声音,训练过程使用前文提到的PIT方法,编解码器都是一维卷积(相当于全连接层线性变换),实验结果展示幅度和相位信息都被编码器学习到了特征之中。



编码器Encoder实质上是一个线性变换,将16维输入信号变为512维,这个变换过程相当于做匹配滤波,Encoder的512维的权重就是匹配滤波的权重。而解码器是与编码器相反的过程,将编码器的512维的输出和分离网络输出的mask的点乘结果作为输入,做线性变换后得到分离的语音信号。在训练过程中,编码器和解码器不一定是可逆的,不需要对编码器和解码器做额外要求。

TasNet的分离网络与WaveNet相似,采用多层的CNN网络,每一层都是卷积操作,涉及到的卷积主要包括因果卷积和空洞卷积(可以增大感受野,由于语音往往较长,空洞卷积和残差连接是标配)。最后一层最后一个输出经过sigmoid函数得到mask(0-1)矩阵,论文中认为对于输出的mask不需要softmax来归一化使得输出和为1,模型可以自己学到,另外sigmoid也不是必须的,生成的mask可以为负值,不用加特殊限制。



对于分离网络,可以将上述网络重复多次以达到更好的分离效果。TasNet将上述过程重复3~4次,下图是TasNet分离网络的结构图。这样重复卷积的好处是可以增大感受野,将更多的信息包括进来,当重复三次时,模型的每个输出point可以参考1.53秒的语音信息。TasNet最开始使用LSTM网络进行训练,结果效果并不好,LSTM网络由于存储记忆特性会导致过拟合,用CNN网络效果会好很多,每个point只用几个sample的信息就足够了。






04

总结


语音分离在ASR领域具有重要的研究意义。在复杂的声学环境下,除了目标说话人的语音信号之外,还经常会伴随这其他说话人的语音,比如在室外、街道等场景,千扰人的信号会严重影响目标人语音的识别性能,这个时候就需要语音分离技术来跟踪目标语音并抑制或者消除干扰语音。深度学习在单通道语音分离领域已经超越了传统信号处理算法,文中介绍的几种方法已经可以处理真实环境的语音分离,在性能和效率方面大大超过了传统方法,当然现在基于深度学习的方法还有很多问题没解决,相信随着深度学习的发展,深度学习可以很好的解决鸡尾酒会问题。



参考资料:

  1. 李宏毅深度学习(2020)课程http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html

  2. https://www.zhihu.com/question/274090770

  3. 李宏毅深度学习(2020)学习笔记 https://zhuanlan.zhihu.com/p/137771442




 

END



机器学习算法工程师


                                            一个用心的公众号







浏览 156
点赞
评论
1收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
1收藏
分享

手机扫一扫分享

举报