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

Speech Separation

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

前言

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

而在本篇开始我们将详细讲解 端到端TasNet 的模型结构,以及Speech Sparation领域的前沿研究领域及其扩展等。


I TasNet (Time-domain Audio Separation Network)

在这里插入图片描述
这个将会是我们在作业上使用的模型(系列课程笔记写完后会写作业),因此,会花一定的时间来讲。当然,如果你注意到这篇论文的propose的时间是19年,是很新的一个模型。比较神奇的是输入和输出直接是声波,没有抽什么acoustic feature,但还是可以把它当做vector sequence,只不过它的每一个vector的维度是1

TasNet的架构如上图,分成三块:

  1. Encoder :声音讯号通过Encoder后变成 Feture map
  2. Separator :Encoder的输出给Separator后产生两个Mask
  3. Decoder :将这两个Mask分别乘上Encoder的输出上,将这两个结果给Decoder后就会产生分离后的两段声音讯号。
  4. PIT: TasNet在训练的时候是需要PIT的

1.1 Encoder 、 Separator & Decoder

在这里插入图片描述
TasNet 的 Encoder 就是一个 Linear 的 Transform,就是一个Matrix矩阵。输入是非常小的一段声音讯号, 只有16个sample,经过Encoder后变成512维*16个的vector向量,不一定需要均为正值。
Decoder 也同样是一个 Linear 的 Transform,把512维的16个的向量转成16个sample。

那Encoder和Decoder是 完全互相相反(Inverse)的么,也就是说,经过Encoder得到的512-d,再输入给Decoder输出的和最开始的16 sample需要完全一样么?在TasNet的原始论文中,故意尝试过在训练中强制Encoder和Decoder完全互相相反,结果还会变差。

1.1.1 Encoder

在这里插入图片描述
Encoder 训练出来的结果如上图,Encoder里面就是一个矩阵,这个矩阵其中一边是512维,代表有512个basis。将这16个 samples 通过 512个basis后,就产生512个值 (Weights)。
那这些basis在匹配什么呢?如上图所示,很明显,它们在匹配不同的频率frequency的讯号( ||FFT||频率图,上图的黑色框),有encode高频的、有encode比较低频的,低频的特别多,因为人的发音也是低频的更多。而这一切都是network自动学到的。

1.1.2 Separator

在这里插入图片描述
Encoder的输出是一堆向量,如上图的下侧黄色矩阵,Separator会把这一排vector吃进去,然后产生两个Mask。
这个Separator里面有很多层的CNN,所用的结构是dilated CNN,
  这个CNN的第一层会把输入的vector两个两个一组,然后通过filter变成新的vector,上图每一个点代表一个vector
  第二层里面就不是输入相邻的vector,是会跳一个输入两个vector得到一个新的vector。再下一层,会跳三个也就是四步再输入两个vector
  逐步,直到变成一个vector(用d来代表跳了几步)
  最终,将得到的这个vector乘上两个不同的Transform,并通过sigmoid激活函数,得到两个Mask。得到这两个Mask再与Encoder的输出相乘得到的结果再输入到Decoder里。在此,需要两个Mask同一位置的和为1么?在原始论文中做了softmax的实验对模型没有帮助。
在这里插入图片描述
刚刚讲的Separator只是一个例子,而上图才是真正的Separator结构,在从 d = 1 、 2 、 4 、 8 d = 1、2、4、8 d=1248到最终经过 d = 128 d = 128 d=128后,将再重新再来repeat,最后产生Mask,而这个repeat次数也是一个超参数,需要自己实验调参。并通过Depthwise Separable Convolution的方法使得CNN的参数减少,其机器学习有讲过链接如图。

那为什么要反复这么多次CNN呢?因为反复多次后,就可以看到够长的资讯。

在此还有一个问题,为什么我们不使用善于处理时序讯息的LSTM模型而使用CNN呢?
在这里插入图片描述
其实,在原始论文中,最开始使用TasNet的Separator内的模型是LSTM,但因为对于一般的LSTM而言,输入的开始往往就是讯息的起始点。但声音片段的输入往往不是声音的起始,原始论文中做了这样的实验,如上图左侧,输入起始位置不同的声音片段,LSTM模型的稳定性很差。

1.2 TasNet Overview

在这里插入图片描述

II More

2.1 Unknown number of speakers

在这里插入图片描述在这门课里面,我们都假设都是两个人的声音讯号混合在一起,但事实上,我们并不知道会有多少个人的声音混在一起,我们有没有办法让模型在不知道多少个speaker的情况下就做到Speaker Separation呢?

对于Deep Clustering,是有可能做到的。但对于TasNet来说,只有知道多少个Speaker才能生成多少个Mask来做到Speaker Separation。那该怎么把TasNet的架构用在不知道语者数量的语音分离上呢?

这边提供一篇文献上的一种方法,不管输入的声音讯号是几个人的混合,对于每次训练只分离出一个Speaker的声音讯号。而分离的次数也是需要通过模型学习控制的。

2.2 Multiple Microphones

在这里插入图片描述
这门课里面我们假设我们的声音都只来自一个麦克风,但事实上,比如人有两个耳朵,相当于人有两个麦克风的输入。那对于模型,该怎么使用来自多个麦克风的声音讯号呢?
在信号方面,有一系列的讯号处理的方法来解这个问题。如果是deep learning,就是相当于输入多个声音讯号,如上图的方法。

2.3 Visual Information

在这里插入图片描述
我们有机会用有影像和混合声音的方式来强化做Speaker Separation,比如影像中两个人一起讲话,输入给模型的将会是讲话时的两个人的头像影像和这段混合的声音讯号。此时训练就不需要PIT了,可根据头像来生成对应的声音。如上图,只不过训练的Mask是带有复数的Mask,具体训练细节请阅读文献。

2.4 Task-oriented Optimization

在这里插入图片描述
最后,其实我们的训练目标应该是根据不同对象、不同任务选择不同的训练目标,比如Speaker Separation后得到的结果是给人听还是给机器听。但这些训练目标是很复杂的,比如SI-SDR是可微分的,也就可以训练优化。但比如,对于PESQ是不可微分的,那我们该怎么训练呢,你可以看一下上面这篇paper是怎么做的。

有关Speaker Separation的部分就讲到这边,下一篇将讲Speech Synthesis语音合成。

猜你喜欢

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