文章目录
- 1 内容简述
- 2 评价指标
- 2.1 Signal-to-noise ratio (SNR)
- 2.2 Scale invariant signal-to-distortion ratio (SI-SDR)
- 2.3 其他的评价指标
- 3 Permutation Issue
- 4 Deep Clustering
- 5 PIT
本文为李弘毅老师【Speech Separation - Deep Clustering, PIT】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。
下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。
文章索引:
上篇 - 2-2 CycleGAN and StarGAN
下篇 - 3-2 TasNet
总目录
1 内容简述
人在一个嘈杂的环境下听别人说话的时候,可以很神奇的抽取到说话人说话的信息,换而言之,也就是把说话人发出的声音和说话人之外的声音给分开了。而Speech Separation要做的事情,也就是把不同物体发出的声音给分开。
Speech Separation可以分为两大类:
-
Speech Enhancement
把人的声音和其他的声音给分开来,也被称为denoising -
Speaker Separation
把不同人说话的声音分开来
本篇的着重点在于Speaker Separation,而且在讨论的时候,都以两个speakers,单一麦克风的情况为例子。同时,要说明的是,用于训练和验证的声音数据来自于不同的speaker,也就是说,训练集是A,B,C,D说的,验证集是E,F说的,这样子。
Speaker Separation有一个特点,就是它的输入和输出的长度必然是一致的,所以可以不使用seq2seq的模型来解,用seq2seq的模型有一种杀鸡用牛刀的感觉。
Speaker Separation有一个好处就是,数据集很容易构造,我们只需要找一堆单个speaker的声音信号过来,然后两两合成一下,就可以了。
2 评价指标
2.1 Signal-to-noise ratio (SNR)
有一种评估模型输出质量的方法叫做SNR,SNR的目的是让模型的输出X∗X^*X∗和X^\hat{X}X^越接近越好。SNR的计算公式如下所示
SNR=10log10∣∣X^∣∣2∣∣E∣∣2SNR=10 log_{10} \frac{||\hat{X}||^2}{||E||^2} SNR=10log10∣∣E∣∣2∣∣X^∣∣2
其中,X∗X^*X∗和X^\hat{X}X^均为向量,且
E=X^−X∗E=\hat{X}-X^* E=X^−X∗
不难看出,当EEE越大的时候,SNRSNRSNR就小,也就是SNRSNRSNR认为模型的结果越差,反之越好。
这种简单粗暴的评价方式,在面对声音的时候,会存在一个致命的问题。比如模型输出的X∗X^*X∗和X^\hat{X}X^向量几乎是平行的,只不过X∗X^*X∗短了一点(音量小了一点),这个时候SNR却认为模型学的不好,这其实是不合理的,不我们只要把音量调大一点就可以了。
又比如说,模型输出的X∗X^*X∗和X^\hat{X}X^偏差比较大,但是当X∗X^*X∗被调大了音量之后,这个SNRSNRSNR就认为模型变好了,这也是我们不希望看到的。
总而言之,SNRSNRSNR受音量大小的干扰太大。
2.2 Scale invariant signal-to-distortion ratio (SI-SDR)
另一种文献中常用的评价指标叫做SI-SDR,SI-SDR也被称为SI-SNR,知道这两个是同一个东西就可以了。SI-SDR的计算公式为
SISDR=10log10∣∣XT∣∣2∣∣XE∣∣2SISDR=10log_{10} \frac{||X_T||^2}{||X_E||^2} SISDR=10log10∣∣XE∣∣2∣∣XT∣∣2
其中
{XE=X∗−XTXT=X∗⋅X^∣∣X^∣∣2X^\left\{ \begin{aligned} X_E = X^* - X_T \\ X_T = \frac{X^* \cdot \hat{X}}{||\hat{X}||^2}\hat{X} \end{aligned} \right. ⎩⎪⎨⎪⎧XE=X∗−XTXT=∣∣X^∣∣2X∗⋅X^X^
这个评价指标就是在看X∗X^*X∗与X^\hat{X}X^的平行程度,解决了SNR被音量大小干扰的问题。
而在实际使用的时候,我们看的,往往是SI-SDR的improvement。什么是improvement?比如我们要看下图中蓝色信号的improvement,那么我们就要先把输入mixed audio和蓝色信号的ground truth做一个SI-SDR得到SI-SDR1,然后再把蓝色信号对应的输出和蓝色信号的ground truth算一个SI-SDR2,再用SI-SDR2减去SI-SDR1来看这个增量。
为什么要这么做?因为有些时候,mixed audio的红色信号可能音量较低,这使得SI-SDR1本身就会比较大,SI-SDR2自然也就是大的,这个时候看增量improvement会更有意义。
2.3 其他的评价指标
除了SNR和SI-SDR之外,还有其他很多评价指标,比如用来评价输出声音质量的Perceptual evaluation of speech quality (PESQ),用来评价声音清晰度的short-time objective intelligibility (STOI)。这些评价指标都比较复杂,这里不多做介绍。
3 Permutation Issue
讲完了评价指标之后,我们就可以像正常了模型那样开始train了,我们的Loss就用L1或者L2或者SI-SDR都是可以的,SI-SDR是可以微分的。我们就输入一个mixed audio然后经过一个speaker Separation的model,出来一个X1X_1X1和X2X_2X2,再算一下loss,然后反向传播,就结束了。真的就么就结束了吗?错错错!
我们仔细来思考一下,输出X1X_1X1的这端和X2X_2X2的这端是连接着固定的weights的,为什么X1X_1X1一定是红色信号,X2X_2X2一定是蓝色信号。这两个不能换一下吗?加入我们又来了一个橙色信号,那这个橙色信号应该在哪个输出?仔细想一下,这样子网络是没法train起来的。这个其实就是Speech Separation中的Permutation Issue。
它不能像其他问题那样直接转变为一个可以直接train的神经网络。
那怎么办?下面来介绍一下Deep Clustering和PIT。
4 Deep Clustering
在介绍deep clustering之前,我们先来说一下其中用到的mask。由于Speech Separation只是对于输入声音信号的一个拆分,所以我们可以不生成声音信号,而是生成两个mask。这两个mask是互斥的,即M1=1−M2M_1 = 1 - M_2M1=1−M2,mask中的值可以是binary的(0和1),也是可以是continuous的(0至1)。如果是binary的,X1X_1X1就是XXX中M1M_1M1对应元素为1的元素的组合,即X1=M1⋅XX_1 = M_1 \cdot XX1=M1⋅X;X2X_2X2就是X−X1=M2⋅XX-X_1 = M_2 \cdot XX−X1=M2⋅X。
这种binary的方式,显得非常简单粗暴,这样难道不会造成很多信息的丢失吗?不管你信不信,实际情况下,这种做法是work的。不过既然要把我们的训练目标变成一个mask,那在处理数据,生成label的时候,也有一些相应的操作。
如下图中,我们有蓝色的声音和红色的声音,然后合成了左上角红蓝结合的声音。蓝色和红色的矩阵表示声音信号转换之后得到的spectrogram,红蓝矩阵的shape是一样的,矩阵中每个元素之间比个大小,蓝的大的话,蓝色mask相应为止的值就是1,反之是0。红色的也是一样。mask就是用这种方式构造出来的。
然后用这种方式得到的mask在mixed audio上去取值,得到左下角的信号,这个信号的声音,和蓝色信号的声音,人听起来,是没什么区别的。这样的mask叫做Ideal Binary Mask (IBM)。
也就是说,我们的模型只要能学到这样的两个IBM,就可以实现Speech Separation了。那么,我们的模型就变成了下图这样。
但是!到现在为止,我们仍旧没有解决Permutation Issue。别急,马上给你搞定。
先来说一下Deep Clustering的Inference的过程。我们的输入是一个代表mixed audio的D×TD \times TD×T的矩阵,经过一个Embedding的网络之后,生成了一个D×T×AD \times T \times AD×T×A的矩阵,这个AAA就是embedding之后的特征维度。然后,我们会对这个输出做k-means clustering,如果有2个说话人,就把cluster的个数设置为2即可,然后每个cluster就代表一个speaker的Ideal Binary Mask。是不是很机智!完美解决Permutation Issue。
不过这个东西训练该怎么train呢?k-means clustering是额外的算法,且不可导,要做loss的话,就要在D×T×AD \times T \times AD×T×A的这个矩阵上做文章。
我们是有Ideal Binary Mask这个label的,那么,我们呢就可以让mask上值一样的feature的距离越大越好,mask值上值不同的feature越远越好,这样的loss是可以做成可导的。
神奇的是,用2个speakers的声音mix的的数据和deep clustering模型train出来的结果,针对于3个speakers的输入,也是有效的!这真的是很了不起。
5 PIT
PIT是一种训练的方法,全称为Permutation Invariant Training。这种训练方式就可以end-to-end去训练,总体思想很直觉,就是我先随便假设一个speakers对应于输出的X1X_1X1和X2X_2X2的顺序,稍微train几下,得到一个model。然后,下一次train的时候,我会算两次SI-SDR之类的评价指标,分别是红1,蓝2和蓝1,红2,然后把Loss小的那个作为排序,然后按这个顺序train下去。
每train一次,这个排序都可能会发生变化,所以刚开始的时候,是非常不稳定的,但只要这样train下去,最终,是可以收敛的。感觉这个真的要靠做实验做出来。
还有就是,PIT相比于按照某种方式,假定一个顺序的训练方式是要好一点的。