课程向:深度学习与人类语言处理 ——李宏毅,2020 (P12)

Speech Separation

李宏毅老师2020新课深度学习与人类语言处理课程主页:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
视频链接地址:
https://www.bilibili.com/video/BV1RE411g7rQ
课件ppt已上传至资源,可免费下载使用

前言

在上两篇中(P10、P11),我们讲解了语音转换 Voice Conversion 的定义、应用 以及实现技术中重要的Encoder和Decoder、Vocoder等。并着重讲解了 针对Unparallel Data的 Feature Disentangle 特征分离法和 Direct Transformation 直接转换法。

而在本篇开始我们将讲解 Speech Separation 语音分离技术,从定义、分类再到其中一种 Speaker Separation的评估和排列问题与最新的解决方法。


I Definition and Classification

在这里插入图片描述

鸡尾酒会效应 (cocktail party effect):是指人的一种听力选择能力,在这种情况下,注意力集中在某一个人的谈话之中而忽略背景中其他的对话或噪音。
该效应揭示了人类听觉系统中令人惊奇的能力,即我们可以在噪声中谈话。

1.1 Definition

因此,我们也希望机器可以像人类一样,把它要听的资讯,从嘈杂的环境和其他资讯中抽取出来。这就是 Speech Separation 语音分离技术的研究方向。

1.2 Classification

而 Speech Separation 可分为两类:

  1. Speech Enhancement: speech-nonspeech separation (de-noising),要做的是speech 和 nonspeech 的 分离。如只有一个人在讲话,有其他不是人类的声音讯号在干扰,在其中抽取出人类的声音讯号。
  2. Speaker Separation: multi-speaker talking,同时有很多个speaker语者在讲话,把每个人的声音讯号分离出来。(HW3,作业3)

II Speaker Separation

在这里插入图片描述
对于Speaker Separation,其训练目的是:
   输入:Mixed audio ,如两段声音讯号叠在一起的
   输出:Two audios , 两段分离后的声音讯号,一般情况下,输入和输出的长度是一样的,因此用不上seq2seq模型
注意:在以下的讨论中,我们只专注在输入是两个speakers语者的声音混合起来的状况(多语者方法类似),并且,只专注在单一麦克风的状况(最后会提一下多个麦克风会怎么解),接下来讨论,也会专注在 Speaker independent 语者不相关,也就是说训练和测试的语者是完全不同的,例如训练时用A B C D的声音,但测试听到的是E F G 的声音,训练和测试是完全不同的语者。

而且,对于 Speaker Separation来说,训练数据并不需要刻意去搜集mixed和分离后的声音讯号,只需要收集很多单一语者的声音讯号,然后将这些声音讯号两两拿出来做结合就可以产生mixed的资料了。

III Evalution

在进入技术之前,我们来讲一下Speaker Separation 的 Evalution 评估方式,是可以有客观的评估方法的。在上一堂Voice Conversion时没有提到怎么评估结果,那是因为做VC转换声音后,我们往往没有正确答案,只能靠人做主观的衡量。但在Speaker Separation中,我们是有被混合之前的声音,即正确答案。

3.1 SNR (Signal-to-noise ratio)

在这里插入图片描述
如上图,我们将正确答案记作 X ^ \hat{X} X^,将模型的输出记作 X ∗ X^{*} X, 当然 X ^ \hat{X} X^ X ∗ X^{*} X越接近表示模型效果越好,那怎么评估这两者的接近程度呢?

有很多方法,最基本的想法是SNR,这边我们的输出和真实值都是一段声音讯号,它可以被一段很长的向量来表示,用
E = X ^ − X ∗ E = \hat{X} - X^{*} E=X^X
S N R = 10 log ⁡ 10 ∣ ∣ X ^ ∣ ∣ 2 ∣ ∣ E ∣ ∣ 2 SNR = 10\log_{10}{\frac{||\hat{X}||^2}{||E||^2}} SNR=10log10E2X^2

如果得到的E是0,那SNR算出的就是无穷大,这个E越小SNR就越大,模型效果越好。
但用SNR会有什么样的问题呢?当我们用SNR来评估Speaker Separation上的时候有一些问题:
  假设我们的 X ^ \hat{X} X^ X ∗ X^{*} X如上图左下角所示的平行的两条射线,E为灰色的射线,此时的E较大,SNR很小,但其实这里的 X ^ \hat{X} X^ X ∗ X^{*} X只是音量大小的差异,模型的效果其实很好,但SNR很小。同样伸长 X ∗ X^{*} X,E直接就变短了,SNR就变大了。正因如此,SNR在Speaker Separation上并不是一个很好的评估方式。

3.2 SI-SDR

在这里插入图片描述

而今天在文献上,比较常看到的一种,评估 Speaker Separation 的表现的方法 ,叫 SI-SDR(Scale invariant signal-to-distortion ratio),也称为 SI-SNR

如上图,正确答案记作 X ^ \hat{X} X^,将模型的输出记作 X ∗ X^{*} X,把 X ∗ X^{*} X投影到 X ^ \hat{X} X^上面得到 X T X_{T} XT,剩下的叫 X E X_{E} XE X T X_{T} XT X E X_{E} XE线代,余弦定理可计算得)
X ∗ = X T + X E X^{*} = X_{T} + X_{E} X=XT+XE
S I − S D R = 10 log ⁡ 10 ∣ ∣ X T ∣ ∣ 2 ∣ ∣ X E ∣ ∣ 2 SI-SDR = 10\log_{10}{\frac{||X_{T}||^2}{||X_{E}||^2}} SISDR=10log10XE2XT2
故可以知道,如果 X ∗ X^{*} X X ^ \hat{X} X^平行,SI-SDR就越大。越垂直,SI-SDR就越小。也因此,解决了平行和伸长的问题
(平行:SI-SDR无穷大,伸长 X ∗ 则 X T 与 X E X^{*} 则X_{T} 与 X_{E} XXTXE同时变大,SI-SDR不变 )
在这里插入图片描述
在文献中,也常常可以看到 SI-SDR improvement: S I − S D R i = S I − S D R 2 − S I − S D R 1 SI-SDR_{i} = SI-SDR_2 - SI-SDR_1 SISDRi=SISDR2SISDR1 ,如上图。为什么要用相减的方式来计算SI-SDR呢?因为 如果混合的声音的SI-SDR值很小,则分离后的声音的SI-SDR通常也不会很大,因此我们会考虑SI-SDR的增加量而非绝对值的大小。
除了SI-SDR还有很多针对声音讯号的评估方式,比如说:(因为它们很复杂,古圣先贤花了很多时间,根据人类听觉得到的计算方法,不细讲)

  1. PESQ:量语音的 quality,质量
  2. STOI:量语音的intelligibility,可理解程度

IV Permutation Issue

在这里插入图片描述
有一个问题,是在模型输出两端声音讯号, X 1 , X 2 X_1,X2 X1,X2 究竟对应哪一个颜色的Speaker的语音,这个问题叫做 Permutation Issue 排列问题,也就是说不知道该怎么摆放你的正确答案,有两种摆放正确答案的方式,但不知道哪一种才是对的

4.1 Deep Clustering

在这里插入图片描述
有这样一个模型可以解决 Permutation Issue 的问题,因为 Speaker Separation 不是需要我们去产生完全不同的声音讯号,故不需要我们像Vocie Conversion 一样去训练一个类似语音转换的模型,我们其实只需要将混合的声音讯号区分开就好,基于此思想,产生了这个模型 Deep Clustering
   通过设计一个 Mask Generation 输入混合的声音讯号 X X X来生成 M 1 , M 2 M_1,M_2 M1,M2
   X X X 分别与 M 1 , M 2 M_1,M_2 M1,M2点乘 得到 X 1 , X 2 X_1,X_2 X1,X2 ,这样可以确保 X 1 , X 2 X_1,X_2 X1,X2 就只是 X X X 乘上一些系数得到的,与X有一定的关系
这个Mask里的数可以是binary(0或1),或者 continuous(连续值)。

如果使用binary的Mask的话,将会忽略很多混合的语音讯号内的信息,那么binary的Mask真的可以解决Speech Separation的问题么?这里,我们举一个理想二元掩码

4.1.1 IBM (Ideal Binary Mask)

在这里插入图片描述
正如,上图所示,我们有红蓝混合的声音讯号,输入给Mask Generation后得到来个矩阵,将其中一个矩阵乘以红蓝混合矩阵便可以得到蓝色的声音讯号。

其实原理也很简单,就是在矩阵中的每一个格内比较红和蓝,哪一个出现的可能性更大,比较大的就是1,比较小的就是1。

虽然如果我们真的得到了Ideal Binary Mask,是完全可以解决Speech Separation的。但问题是,没有那么容易产生 Ideal Binary Mask,因为 Ideal Binary Mask 必须要知道原来的声音讯号是什么,才能比较它们转成矩阵的大小,而我们要做的就是Speech Separation,是并不知道分离后的单独的声音讯号是什么。当然这是测试时会有的问题,但训练是可以得到一个针对训练集不错的 Ideal Binary Mask。

但是就算我们有了 Ideal Binary Mask ,还是没有解决 Permutation Issue 的问题,因为我们还是有两种排列方式。

4.1.2 Deep Clustering Inference

在这里插入图片描述
那 Deep Clustering 到底是怎么运作的呢?我们先讲 Inference 时的运算过程,然后再讲在 Training 的时候,应该怎么训练。
  Deep Clustering的本体是一个 Embedding Generation,可以通过这个Generation生成Mask
    Embedding Generationd的输入是一段声音讯号(如上图的左上角)矩阵,长度是T,高度是D
    Embedding Generationd会输出长度是T,高度是D,深度为A的立方体。相当于把每一个格子grid扩展成一个vector向量
    接下来,对这些向量做 K-means Clustering 聚类,分成K=2的两群(两个Speaker,就是K=2,三个Speaker,就是K=3)
    最终,根据分群的结果就可以产生 Binary Mask,同样,将Mask与输入做点乘就可以分离两个人的声音讯号

虽然 K-means Clustering 是无法进行训练的,但是后来研究出了专门用于 Speech Separation的 可训练K-means,这里老师没讲,可以查文献阅读其具体训练方法。但 Embedding Generation 是可训练的。

4.1.3 Deep Clustering Training

在这里插入图片描述
Embedding Generation 该怎么训练呢?
   首先,因为在训练集里,我们可以根据Mixed Matrix 找到它的 Ideal Binary Mask
   之后,假设在找到 Ideal Binary Mask 后,我们发现第一排第二三列的值不同1和0
   然后,根据Mask的第一排第二三列的不同,表示 Mixed Matrix 中的第一排第二三列的Speaker不同
   最终,我们只需训练 Embedding Generation 使得生成的对应位置的vector的距离越大越好。同理,对于Mask值相同的,我们训练 Embedding Generation 得到的 vector的距离越小越好。

总结而言,Embedding Generation 的训练目标

  1. The grids for different speakers are far way.。不同Speaker的格子距离更远。
  2. The grids belonging to the same speakers are close to each other.。相同Speaker的格子距离更近。

最终的实验结果表明,Embedding Generation 的训练效果是真的有效的,多语者只需更改K的值即可。但问题是,它不是End-to-End端到端的,中间有很多的process,如K-means、产生Ideal Binary Mask等等。

接下来,我们将讲第二招,这种方法是可以做到End-to-End的。

4.2 PIT (Permutation Invariant Training)

在这里插入图片描述
PIT 的基本想法是:如果我们已经有一个 speaker separation 的模型 ,它的参数是 θ i \theta^{i} θi。这样我们就可以得到分离后的语音讯号 X 1 , X 2 X_1,X_2 X1,X2,此时我们可以把真实值红色的vector放到 X 1 X_1 X1的对应位置上,或把红色的vector放到 X 2 X_2 X2的对应位置上,根据这两种情况算出loss以后,再看哪种loss比较小,就代表这种排列对应方式更好。

但问题是,我们需要知道有一种排法才能训练模型啊。”鸡生蛋,蛋生鸡的问题“,有一个model才知道怎么排,知道怎么排才能训练出这样一个model。
在这里插入图片描述
那 PIT 是怎么解决上述问题的呢?
   一开始,先有 Random initialize 随机安排,训练一下模型,更新参数
   之后,有了根据随机安排的模型后,再去重新安排正确答案,让loss更小
   然后,重新安排正确答案以后,再去训练模型,更新参数
   迭代二三步,直到收敛为止

训练效果,如上图,蓝色的线代表SI-SDR的提升,黑色的线代表这一次的assignment和上一次的assignment的比例,可以看出虽然前期的assignment是随机的,但训练的结果是收敛的。
在这里插入图片描述
PIT对于assignment的问题是很有用的,正如上图所示,

  1. a :Energy来摆放正确答案,音量大的放上面,音量小的放下面
  2. b:d-vector,根据Speaker来分
  3. c、d、e、f:加PIT迭代训练后的效果

猜你喜欢

转载自blog.csdn.net/qq_44574333/article/details/108181922
今日推荐