speech separation
Speech separation
0 概述
人类很神奇,在嘈杂的环境中,人类可以只专注于听其中一种声音,这就是鸡尾酒会效应。 Speech separation 要做的事情就是,机器跟人一样,把它想要得到的声音从嘈杂的环境抽取出来。
主要分为两种,如下所示。
- Speech Enhancement (speech-nonspeech separation),此种情况旨在将想要的人类声音部分与非人类声音部分分离。
- Speaker Separation (multi-peaker talking),此种情况将两个(甚至更多)人说话的声音进行分离,从而得到每个人各自的声音。
本文讲着重讲述两个人的 Speaker Separation ,同时专注于单麦克风,训练和测试的说话人是完全不同的。
由于输入的声音讯号与输出的两段声音讯号的长度一样,所以没有必要用 seq2seq 。但之前Google研发团队在做 Speech separation 的时候用了 seq2seq ,但他们知道这是杀鸡用了牛刀,他们想说明 seq2seq 很神奇, Speech separation 这种问题也能用其来解决。
1 数据说明
本课题不用刻意的去收集混合的声音讯号,就算收集了混合的声音讯号,在训练的过程中无法确定分离出的声音是否为正确答案。我们只需要收集不同语者的声音讯号,两两结合成混合声音讯号,之后再对其分离,这样得到的声音讯号就可以与原始声音讯号进行对照。有了这样的处理方法,数据的获取就变得十分简单。
2 客观估算方法
2.1 SNR(Signal-to-noise ratio)
可以将声音讯号想象成一段非常长的向量,如果是16KHZ声音,那么每秒的声音讯号就有16k维的长度。在做 Speaker separate 的时候,我们是有正确答案进行客观的评估。
上图中 X ^ \hat X X^ 表示原始声音讯号, X* 表示model的输出,X* 跟 X ^ \hat X X^ 越接近,则表示这个model的效果越好, SNR 表示二者接近的程度。其中用 E 来表示 X* 与 X ^ \hat X X^ 的差距,E = X ^ \hat X X^ - X* 。 SNR 如下式所示。
从公式中可以看出, X* 与 X ^ \hat X X^ 的差距越小, E 越小, SNR 的值会越大。但使用 SNR 会造成一个问题,适当增大X* 的音量,那么 E 就会变小,从而 SNR 会变大(如下图所示)。即音量的大小会影响 SNR 的大小,所以使用 SNR 来估量结果不是一个好的方法。
2.2 SI-SDR(Scale invariant signal-to-distortion ratio)
SI-SDR (又叫 SI-SNR )对 SNR 进行了改进,其将 X* 分解成两个相互垂直的向量 XE 和 XT ,其中 XT 与 X ^ \hat X X^ 同向。如下图所示。
则有 XT + XE = X* 。关于计算 SISDR 的公式如下。
由上述公式可知,如果 X* 与 X ^ \hat X X^ 越平行, XE 会越小, XT 会越大,从而计算出的 SISDR 的值会越大。关于 XT 的计算,可以根据线性代数的向量投影公式,如下所示进行计算;关于 XE 就可以直接根据向量加减法进行计算, XE = X* - XT 。
回到 SNR 遇到的问题,此处将 X* 放大,XT 与 XE 也随之放大,但其计算出来的 SISDR 与原来相同,所以 SISDR 解决了之前的问题。
在整个训练过程中,需计算 SISDR improvement (用 SISDRi 表示),这里定义通过modle生成的声音与正确答案计算结果为 SISDR2 ,混合的声音和正确答案计算结果为 SISDR1 ,SISDRi 就是 SISDR2 与 SISDR1 的差值,其中由于 SISDR2 是经过modle生成的,所以其 SISDR 的值应该更大。下图即为参考。
2.3 其他估量
- PESQ (Perceptual evaluation of speech quality):was designed to evaluate the quality,and the score ranges from -0.5 to 4.5.
- STOI (Short-time objective intelligibility): was designed to compute intelligibility,and the score ranges from 0 to 1.
这两种方法过于复杂,此文将不做介绍。
3 训练过程与问题
3.1 训练过程
训练的过程如下图所示,其中 X1 与 X2 表示经过 Speaker Separation 分理出的两个声音讯号。
3.2 训练遇到的问题
经过这样的过程,问题似乎得到了解决,但有一个问题却被忽略了——对于生成的两个声音讯号,为什么非得是红色的在上面蓝色的在下面呢?可以相反吗?
由于为了实现speaker的独立训练,我们训练的数据集包含了各种不同speaker的声音。有的人可能说,我们每次默认红色的声音讯号在上面不就行了吗?但下图中的例子,说明此法不通。
从上图中可以发现一个问题, X1 与 X2 并不能单纯的表示指定性别的声音,这种情况在training的过程中,没有办法被解决。这个问题叫做 Permutation Issue ,意思是你不知道你的输出结果应该如何摆放。
3.3 Deep Clustering(稳的一批)
2016年美国的一个研究所提出了 Deep Clustering 来解决 Independent 的问题。声音讯号用的是矩阵来进行存储表示, Speaker Separation 要做的就是将输入矩阵 Matrix X 分成两个矩阵 Matrix X1 与 Matrix X2,但是 Matrix X1 与 Matrix X2 相较于 Matrix X 很相似,所以这里用 Speaker Separation 有些大材小用。
此处我们不需要产生新的声音讯号,只需要产生 Mask 矩阵 Matrix X1 与Matrix X2 ,其大小与 Matrix X 一样,之后再将 Matrix X1 和 Matrix X2 与 Matrix X 分别做点乘从而得到 Matrix X1 与 Matrix X2 。如下图所示,蓝色部分即可看做 Speaker Separation 。
3.4 Idea Binary Mask(IBM)
Idea Binary Mask (IBM),即 Mask 矩阵用二进制表示。如下图所示,将 Mask 矩阵分别与混合过的声音矩阵相乘,就能得到单独的声音矩阵,图中演示的是蓝色声音矩阵。
关于 Mask 矩阵的计算,比较两个声音矩阵相同的位置,哪个声音大就给其对应的 Mask 矩阵对应元素赋值1,小的则赋值0。这个方法看似行不通,但其确实是可行的,而且实现起来效果很好。虽然用 Idea Binary Mask 处理得到的声音矩阵跟原声音的矩阵在赋值上有些不同,但人听起来经过处理后与原始的声音讯号差不多。
在训练的时候,我们需要训练一个modle,用来生成 Idea Binary Mask 矩阵。在此之前我们需要知道 Embedding Generation 的由来。
首先我们有一个声音讯号,其是长度为 T ,高度为 D 的矩阵。该矩阵经过 Embedding Generation 之后变成一个立方体,立方体的长跟宽与原矩阵一样,但它多了一个高 A 。原来的每一个格子,现在被扩张成一个向量,这个向量由原矩阵相邻格子的值所决定。之后再将立方体内的向量利用 K-means Clustering (一般认知为不能train的部分)分成 K 种群,本文主要是处理分离两个人说话,所以取 K = 2。接着根据分群的结果即可产生 Binary Mask 矩阵,对于产生的 Binary Mask 矩阵中的0和1分别对应两种不同的声音。在训练的过程中,要尽量使不同颜色对应的向量相差越远越好,同种颜色则越接近越好。
在 Deep Clustering 真正train的是 Embedding Generation 的modle,保证两点。
- The grids for different Speakers are far way.
- The grids belonging to the same speakers are close to each other.
神奇的是,在训练的时候只用两种不同的声音,但是其能在测试的时候将三种声音分开 [Hershey,et al.,ICASSP’16]。 Deep Clustering 的缺点是没有做到真正的 end to end 。
3.5 Permutation Invariant Training(PIT) [Kolbæk,et al.,TASLP’17]
为了解决 Permutation Issue 问题,提出了 PIT 。其主要处理方法是,假设已经有了训练好的 Speaker Separation ,既然不知道输出应该如何排列,就把两种情况的 loss 值都算一遍,再看谁的 loss 比较小,小的那个就是比较理想的排法。
在论文 [Kolbæk,et al.,TASLP’17] 中,其先将输出的顺序随意排列,再train一下,update参数,得到一个 Network ,再用这个 Network 来决定正确答案如何安排,从而使 loss 值算出来最小,之后再进行train重复后两个过程,直至收敛为止……
下图是李宏毅实验室做出的结果。 [Yang,et al., ICASSP’20]
蓝色线是代表 SDR 的值,随着训练的进行其逐渐收敛。黑色的线代表输出结果与上一次结果不同的比例,由于training 的初始期间,由于Assignment会剧烈的变化,这是因为modle不知道如何确定结果的摆放顺序比较好,但其到最后也会逐渐收敛。
利用不同的方法与 PIT 相比较的实验结果。