文章目录
本文为李弘毅老师【Speech Separation - Deep Clustering, PIT】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。
下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。
文章索引:
下篇 - 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的计算公式如下所示
S N R = 10 l o g 10 ∣ ∣ X ^ ∣ ∣ 2 ∣ ∣ E ∣ ∣ 2 SNR=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∗
不难看出,当
E
E
E越大的时候,
S
N
R
SNR
SNR就小,也就是
S
N
R
SNR
SNR认为模型的结果越差,反之越好。
这种简单粗暴的评价方式,在面对声音的时候,会存在一个致命的问题。比如模型输出的
X
∗
X^*
X∗和
X
^
\hat{X}
X^向量几乎是平行的,只不过
X
∗
X^*
X∗短了一点(音量小了一点),这个时候SNR却认为模型学的不好,这其实是不合理的,不我们只要把音量调大一点就可以了。
又比如说,模型输出的 X ∗ X^* X∗和 X ^ \hat{X} X^偏差比较大,但是当 X ∗ X^* X∗被调大了音量之后,这个 S N R SNR SNR就认为模型变好了,这也是我们不希望看到的。
总而言之,
S
N
R
SNR
SNR受音量大小的干扰太大。
2.2 Scale invariant signal-to-distortion ratio (SI-SDR)
另一种文献中常用的评价指标叫做SI-SDR,SI-SDR也被称为SI-SNR,知道这两个是同一个东西就可以了。SI-SDR的计算公式为
S I S D R = 10 l o g 10 ∣ ∣ X T ∣ ∣ 2 ∣ ∣ X E ∣ ∣ 2 SISDR=10log_{10} \frac{||X_T||^2}{||X_E||^2} SISDR=10log10∣∣XE∣∣2∣∣XT∣∣2
其中
{ X E = X ∗ − X T X T = X ∗ ⋅ X ^ ∣ ∣ X ^ ∣ ∣ 2 X ^ \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,出来一个 X 1 X_1 X1和 X 2 X_2 X2,再算一下loss,然后反向传播,就结束了。真的就么就结束了吗?错错错!
我们仔细来思考一下,输出 X 1 X_1 X1的这端和 X 2 X_2 X2的这端是连接着固定的weights的,为什么 X 1 X_1 X1一定是红色信号, X 2 X_2 X2一定是蓝色信号。这两个不能换一下吗?加入我们又来了一个橙色信号,那这个橙色信号应该在哪个输出?仔细想一下,这样子网络是没法train起来的。这个其实就是Speech Separation中的Permutation Issue。
它不能像其他问题那样直接转变为一个可以直接train的神经网络。
那怎么办?下面来介绍一下Deep Clustering和PIT。
4 Deep Clustering
在介绍deep clustering之前,我们先来说一下其中用到的mask。由于Speech Separation只是对于输入声音信号的一个拆分,所以我们可以不生成声音信号,而是生成两个mask。这两个mask是互斥的,即
M
1
=
1
−
M
2
M_1 = 1 - M_2
M1=1−M2,mask中的值可以是binary的(0和1),也是可以是continuous的(0至1)。如果是binary的,
X
1
X_1
X1就是
X
X
X中
M
1
M_1
M1对应元素为1的元素的组合,即
X
1
=
M
1
⋅
X
X_1 = M_1 \cdot X
X1=M1⋅X;
X
2
X_2
X2就是
X
−
X
1
=
M
2
⋅
X
X-X_1 = M_2 \cdot X
X−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
×
T
D \times T
D×T的矩阵,经过一个Embedding的网络之后,生成了一个
D
×
T
×
A
D \times T \times A
D×T×A的矩阵,这个
A
A
A就是embedding之后的特征维度。然后,我们会对这个输出做k-means clustering,如果有2个说话人,就把cluster的个数设置为2即可,然后每个cluster就代表一个speaker的Ideal Binary Mask。是不是很机智!完美解决Permutation Issue。
不过这个东西训练该怎么train呢?k-means clustering是额外的算法,且不可导,要做loss的话,就要在
D
×
T
×
A
D \times T \times A
D×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对应于输出的
X
1
X_1
X1和
X
2
X_2
X2的顺序,稍微train几下,得到一个model。然后,下一次train的时候,我会算两次SI-SDR之类的评价指标,分别是红1,蓝2和蓝1,红2,然后把Loss小的那个作为排序,然后按这个顺序train下去。
每train一次,这个排序都可能会发生变化,所以刚开始的时候,是非常不稳定的,但只要这样train下去,最终,是可以收敛的。感觉这个真的要靠做实验做出来。
还有就是,PIT相比于按照某种方式,假定一个顺序的训练方式是要好一点的。