Chapter3-1_Speech Separation(Deep Clustering, 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说的,这样子。
ch3-1-1
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=10log10E2X^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认为模型的结果越差,反之越好。
ch3-1-2
这种简单粗暴的评价方式,在面对声音的时候,会存在一个致命的问题。比如模型输出的 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受音量大小的干扰太大。
ch3-1-3

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=10log10XE2XT2

其中

{ 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=XXTXT=X^2XX^X^

这个评价指标就是在看 X ∗ X^* X X ^ \hat{X} X^的平行程度,解决了SNR被音量大小干扰的问题。
ch3-1-4
而在实际使用的时候,我们看的,往往是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会更有意义。
ch3-1-5

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的神经网络。
ch3-1-6
那怎么办?下面来介绍一下Deep Clustering和PIT。

4 Deep Clustering

在介绍deep clustering之前,我们先来说一下其中用到的mask。由于Speech Separation只是对于输入声音信号的一个拆分,所以我们可以不生成声音信号,而是生成两个mask。这两个mask是互斥的,即 M 1 = 1 − M 2 M_1 = 1 - M_2 M1=1M2,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=M1X X 2 X_2 X2就是 X − X 1 = M 2 ⋅ X X-X_1 = M_2 \cdot X XX1=M2X
ch3-17

这种binary的方式,显得非常简单粗暴,这样难道不会造成很多信息的丢失吗?不管你信不信,实际情况下,这种做法是work的。不过既然要把我们的训练目标变成一个mask,那在处理数据,生成label的时候,也有一些相应的操作。

如下图中,我们有蓝色的声音和红色的声音,然后合成了左上角红蓝结合的声音。蓝色和红色的矩阵表示声音信号转换之后得到的spectrogram,红蓝矩阵的shape是一样的,矩阵中每个元素之间比个大小,蓝的大的话,蓝色mask相应为止的值就是1,反之是0。红色的也是一样。mask就是用这种方式构造出来的。

然后用这种方式得到的mask在mixed audio上去取值,得到左下角的信号,这个信号的声音,和蓝色信号的声音,人听起来,是没什么区别的。这样的mask叫做Ideal Binary Mask (IBM)。
ch3-1-8

也就是说,我们的模型只要能学到这样的两个IBM,就可以实现Speech Separation了。那么,我们的模型就变成了下图这样。

c3-1-9
但是!到现在为止,我们仍旧没有解决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。
ch3-1-10
不过这个东西训练该怎么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是可以做成可导的。
ch3-1-11
神奇的是,用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下去。
ch3-1-12
每train一次,这个排序都可能会发生变化,所以刚开始的时候,是非常不稳定的,但只要这样train下去,最终,是可以收敛的。感觉这个真的要靠做实验做出来。
ch3-1-13
还有就是,PIT相比于按照某种方式,假定一个顺序的训练方式是要好一点的。
ch3-1-14

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

七元权

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

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

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

打赏作者

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

抵扣说明:

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

余额充值