李宏毅DLHLP.11.Speech Separation.1/2. Deep Clusterring, PIT

介绍

本门课程是2020年李宏毅老师新课:Deep Learning for Human Language Processing(深度学习与人类语言处理)
课程网站
B站视频
公式输入请参考:在线Latex公式
Speech Separation: • Humans can focus on the voice produced by a single speaker in a crowded and noisy environments.人类可以关注某一个声音忽略其他杂音
在这里插入图片描述
Speech Separation可以分两类:
Speech Enhancement: speech-nonspeech separation (denoising)将人类的语音从非人类的噪音中剥离出来。
在这里插入图片描述
Speaker Separation: multi-speaker talking同时有很多人讲话,将这些人的语音分开。
在这里插入图片描述

Speaker Separation

输入一段声音,输出两段声音信号,这里信号长度是一样的。所以这里不用Seq2seq模型(特长是变长输入)
在这里插入图片描述
因为这里只考虑两个语者的情况。至于如何扩展到多个语者,可以自己想。
• Focusing on Two speakers
• Focusing on Single microphone只会有一段声音信号
• Speaker independent: training and testing speakers are completely different
训练数据通常合成得来(It is easy to generate training data.):
在这里插入图片描述

Evaluation

和上节内容的VC不一样,VC是将A的声音转换为B的声音,那么B的声音的ground truth是什么样子,很难界定。所以VC的Evaluation用了GAN的思想。这里的语音分离则不一样,我们有ground truth,因为混合声音是我们自己混合的,所以有原来未混合的声音的。直接丢输入,让输出的结果与ground truth越接近越好。
在这里插入图片描述
如何评估输出的结果 X ^ \hat X X^与ground truth X ∗ X^* X的接近程度?有很多方法,这里介绍SNR(Signal-to-noise ratio)
我们可以把每个声音信号看做是一个向量,当然这个向量长度比较长,例如一个16kHz的声音信号,其每秒就会有16k个点(一秒的声音信号就要16k维长度的向量来表示。)我们记输出 X ^ \hat X X^与ground truth X ∗ X^* X的差异为 E E E,则:
E = X ^ − X ∗ E=\hat X-X^* E=X^X
SNR的公式为:
S N R = 10 l o g 10 ∣ ∣ X ^ ∣ ∣ 2 ∣ ∣ E ∣ ∣ 2 SNR=10log_{10}\cfrac{||\hat X||^2}{||E||^2} SNR=10log10E2X^2
可以看到,当E越小,那么SNR就越大。这个SNR有一个问题,例如下图:
在这里插入图片描述
可以看到输入和输出实际上是一样的,但是声音强度(大小)不一样,造成E很大,SNR很小这样明显不科学;还一个例子:
在这里插入图片描述
可以看到黄色的输入变大(音量变大)后发现E变小,而输入声音其实没有变化。改进就是:
• Scale invariant signal-to-distortion ratio (SI-SDR)
注意:SI-SDR = SI-SNR(名字不重要,看具体怎么算)
在这里插入图片描述
将输出 X ∗ X^* X分解为两部分,一部分 X T X_T XT与ground truth平行一部分 X E X_E XE与ground truth垂直
计算这两部分的公式如下:(线代里面有)
X E = X ∗ − X T X T = X ∗ ⋅ X ^ ∣ ∣ X ^ ∣ ∣ 2 X ^ X_E=X^*-X_T\\ X_T=\cfrac{X^*\cdot \hat X}{||\hat X||^2}\hat X XE=XXTXT=X^2XX^X^
那么SI-SDR的公式为:
S I − S D R = 10 l o g 10 ∣ ∣ X T ∣ ∣ 2 ∣ ∣ X E ∣ ∣ 2 SI-SDR=10log_{10}\cfrac{||X_T||^2}{||X_E||^2} SISDR=10log10XE2XT2
从公式里面看到,当输出 X ∗ X^* X与ground truth X ^ \hat X X^越平行,SI-SDR越大。
再回过头看刚才SNR有缺陷的例子:
在这里插入图片描述
如果用SI-SDR来计算上图, X E = 0 X_E=0 XE=0,所以SI-SDR值为∞
再看另外一个例子:
在这里插入图片描述
当把输出增大k倍后:

S I − S D R = 10 l o g 10 ∣ ∣ X T ∣ ∣ 2 ∣ ∣ X E ∣ ∣ 2 = 10 l o g 10 ∣ ∣ k X T ∣ ∣ 2 ∣ ∣ k X E ∣ ∣ 2 SI-SDR=10log_{10}\cfrac{||X_T||^2}{||X_E||^2}=10log_{10}\cfrac{||kX_T||^2}{||kX_E||^2} SISDR=10log10XE2XT2=10log10kXE2kXT2
SI-SDR计算出来的结果还是一样的。
在文献中常常使用SI-SDR improvement来表示Speaker Separation的效果
在这里插入图片描述
就是用分离后的SI-SDR减去分离前的SI-SDR,这个差值通常为正的,因为进行分解后距离ground truth更接近,即:
SI-SDR i = SI-SDR 2 − SI-SDR 1 \text{SI-SDR}_i=\text{SI-SDR}_2-\text{SI-SDR}_1 SI-SDRi=SI-SDR2SI-SDR1
当然还有其他一些方法,这里不展开:
• Perceptual evaluation of speech quality (PESQ) was designed to evaluate the quality, and the score ranges from -0.5 to 4.5.
• Short-time objective intelligibility (STOI) was designed to compute intelligibility, and the score ranges from 0 to 1.

Permutation Issue

由于SI-SDR是可导的,模型就可以直接输入输出都直接用声波,不用acoustic feature。
来看这个问题的来源,如下图所示,我们的ground truth的位置能不能换位置?
在这里插入图片描述
如果我们的训练数据和测试数据都只有两个人,那么这样做是没有问题的,只要固定好位置,那么模型自然会把对应的语者放到相应的位置上,但问题是我们训练数据和测试数据中的人数是不固定的,且每个语者是相互独立的。To achieve speaker independent training, the training data contain many different speakers. 那么这样固定的摆放就会有问题,例如下图:
训练数据蓝男,红女,绿女,黄男,训练第一组数据的时候,模型学习到:男下女上(疑车无据),训练第二组数据的时候,模型又学到:男上女下。这下模型就蒙了,到底咋个姿势是对的呢?这个问题就称为Permutation Issue
在这里插入图片描述
因此为了解决这个问题,就是这节课的主题:

Deep Clusterring

先讲铺垫Masking

Masking

之前有说过,声音信号可以看做是一个矩阵。例如一个16kHz的声音信号,其每秒就会有16k个点(一秒的声音信号就要16k维长度的向量来表示。)一段长度的声音信号就是多个向量排在一起,成为矩阵,那么,上面讲的Speaker Separation可以看做是:
在这里插入图片描述
但是我们发现其实这个模型和VC direct transform模型不一样,应为输入和输出是有一定关系的, X X X分解为 X 1 , X 2 X_1,X_2 X1,X2或者说 X 1 , X 2 X_1,X_2 X1,X2可以组合为 X X X。那么我们用一个general的模型来解这个问题有点大材小用(相当于用微积分算小学的应用题,算出来没问题,但是麻烦),而是可以用Mask的思想来解。
在这里插入图片描述
如上图所示,模型的输出不是声音信号了,而是两个大小和 X X X一样的Mask M 1 , M 2 M_1,M_2 M1,M2
这里注意:Mask 可以连续的也可以是binary的。
下面开实例

Ideal Binary Mask (IBM)

下面是语音信号的示意图,表为矩阵后是下面的样子,右边是两个分离后的信号
在这里插入图片描述
这两个分离的语音信号对应的Mask如下图所示:
在这里插入图片描述
这两个Mask的大小可以看到和上面语音信号的矩阵一样大,Mask的求法也很简单,就是比较蓝色和红色语音矩阵每个位置上的值,谁大谁那个位置就是1,反之就是0:
在这里插入图片描述
最后计算的时候就用Mask与合成语音矩阵进行点乘就得到分离后的结果:
在这里插入图片描述
上面讲的过程是我们知道合成前的语音矩阵,才算的Mask矩阵,现在我们手上只有合成后的矩阵,我们要训练一个模型把Mask矩阵给学习出来,这个是可以训练的,因为ground truth我们有:
在这里插入图片描述

Deep Clustering

接下来是正题,Deep Clustering 实质是一个Embedding Generation,用Embedding Generation产生上面说的Mask
在这里插入图片描述
左边是声音信号矩阵(大小是 D × T D\times T D×T实际上是spectrogram时谱图,D可以看做frequency,T可以看做是时间步),经过Embedding Generation后,变成一个 D × T × A D\times T\times A D×T×A的立方体。
相当于声音信号矩阵每一个点或者说每一个格子grid会变成一个长度为A的向量
在这里插入图片描述
接下来对这些grid对应的向量做K-means Clustering
在这里插入图片描述
这里的K就是按语者的人数设置的,两个人就是2,然后分群的结果如上图所示,1代表一个人,2代表另外一个人。然后根据分群结果得到两个Mask。有多少个人就会有产生多少个Mask。

Deep Clustering – Training

上面的那个模型中K-means Clustering是固定的算法(也有NB的文献把这块弄成可以训练的),不训练,可以训练的就是上面那个粉色模块。
来看怎么训练:以下图中第一行第二和第三个grid为例,我们可以从ground truth可以知道,这两个grid是属于不同的语者的(Different Speakers),因此我们希望Embedding Generation 模块生成后面的grid向量时候,这两个向量距离很远,那么经过K-means Clustering后会分到不同的cluster中,最后产生Mask的时候就会得到不同的结果(一个是1/0,一个是0/1)。
在这里插入图片描述
同理,我们看下图中第一行第一和第二个grid,我们可以从ground truth可以知道,这两个grid是属于相同的语者的(Same Speakers),因此我们希望Embedding Generation 模块生成后面的grid向量时候,这两个向量距离很近,那么经过K-means Clustering后会分到相同的cluster中,最后产生Mask的时候就会得到相同的结果(一个是1/1,一个是0/0)。
在这里插入图片描述
因此我们可以知道,Embedding Generation 模块训练的目标是:
• The grids for different speakers are far way.
• The grids belonging to the same speakers are close to each other.
It is possible to train with two speakers, but test on three speakers (K=3 during k-means)!
[Hershey, et al., ICASSP’16]
神奇的事情是,用两个speaker训练好Embedding Generation 模块后,用在3个speaker的情况,我们只需要将K-means Clustering的参数K设置为3就可以得到结果。
但是这个模型有一个缺点,不是End2End模型,中间有K-means Clustering算法,还有IBM也不是很完美。下面来看一个End2End的模型

Permutation Invariant Training(PIT)

假设我们已经有一个 speaker separation模型,参数为 θ i \theta^i θi,我们可以将其输出的两种排列的Loss都算出来,看哪个小,就认为这个排序适合当前模型:
在这里插入图片描述
但是模型需要先有permutation才能构建。所以先随机初始化permutation,然后定模型,然后优化permutation,如此循环。
在这里插入图片描述
最后老师给出了PIT的实验结果:
在这里插入图片描述
最开始可以看到SDR刚开始有剧烈变化,到后面收敛。因为刚开始Assignment随机的。
下面是PIT和其它方法的比较,黄色是基于Energy的摆放Groud truth的位置,黑色根据语音的向量表示分组(语者的特点)来摆放
在这里插入图片描述
中间红色那个比较有意思,根据上一次蓝色的训练好的PIT模型作为初始,重新开始训练,绿色以此类推。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oldmao_2000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值