文章目录
- 1 TasNet总体架构
- 2 Encoder和Decoder
- 3 Separator
- 4 TasNet回顾
- 5 More
- 5.1 Unknown number of speakers
- 5.2 Multiple microphones
- 5.3 Visual information
本文为李弘毅老师【Speech Separation - TasNet】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。
下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。
文章索引:
上篇 - 3-1 Deep Clustering, PIT
下篇 - 4-1 Tacotron
总目录
1 TasNet总体架构
TasNet的全程是Time-domain Audio Separation Network,它是一个可以end-to-end去train的一个网络。整个网络可以认为由三个部分组成,分别是Encoder,Separator和Decoder。Encoder相当于是一个Fourier Transformer,可以吃未经处理过的mixed audio原始声音信号,然后吐出一个特征维度为512维的特征向量。Separator会吃这个特征向量,然后吐出两个mask,这两个mask再作用到encoder吐出的feature map上,得到两个separated feature map。最后还有一个decoder,decoder吃这两个feature map。吐出separated audio。
2 Encoder和Decoder
TasNet的Encoder和Decoder都是linear transformer,可以看成是两个矩阵。Encoder的输入是一个非常短的声音讯号,只有16个samples,可以看作16维的向量,吐出的是一个512维的向量,Decoder的输入是一个512维的向量,吐出的是一个16维的向量。我们可能会很直觉的认为Encoder里的线性变换和Decoder里的线性变换应该是inverse的,但实际情况是,做了这样的限制之后,模型的效果并不好。对于Encoder而言,如果这个Encoder就是Fourier Transformer的话,那它的输出应该都是正的。但是做了这样的限制,效果也不好。
所以,就是不用做这些限制,直接train就行。
3 Separator
这个Separator是很多层dilated convolution的堆叠。它吃的是Encoder的输出,会把这个输出经过多个dilation不断成倍增长的dilated convolution。最后对得到的结果做一个transform和sigmoid得到两个mask。这个sigmoid可以不加,mask 1和mask 2中对应位置的元素之和也不需要是1。
实际情况下,这个dilated convolution是有很多层的,最后一层的dilation=128,也就是说有8层(27=1282^7=12827=128)。然后,这个过程一般会重复3次,这个repeat的次数是可以调整的超参数。这么做的目的就是,当Separator在输出某个mask值的时候,看过足够长的语音信号。比如下图的这种结构,模型单个mask值的输出会考虑1.53s长度的语音。由于用到的cnn太多了,其中还用到了Depthwise Separable Convolution的技术来轻量化模型。
在最初的时候,其实Separator用的是LSTM,但是为什么变成了CNN呢?原因就是训练的时候,我们都是从句子的开头开始放进LSTM去train的,这样一来LSTM就没法适应一句话从中间截断送进来的情况,也就是说LSTM很傲娇,刚开始看到的不是句子的开头,就坏掉了。而CNN是time invariant的,它无所谓句子的开头在哪里。从下图中不难看出,总体的表现也是CNN更好。
4 TasNet回顾
我们再来回顾一下TasNet的整个架构。如下图所示,图中用的是一个真实的例子画出来的图像,红色和蓝色分别代表不同的speaker,可见TasNet学到的mask可以很好地把两个speaker的声音给分开来。对了,TasNet在train的时候要用上篇中提到的PIT的技巧。
最后再来看一下TasNet的效果究竟如何。下图是Wavesplit这篇文章中对不同方法在WSJ0-2mix上结果的对比。不难看出TasNet比Deep Clustering要好很多。但是,在实际情况下,Deep Clustering的泛化能力会比TasNet要好。比如WSJ0-2mix是一个英文的数据集,TasNet在这个数据集上train了之后,给它说中文,它就搞不懂,但是Deep Clustering在这个数据集上train了之后可以把中文给Seperate了。这也是比较奇怪的地方。
5 More
上一篇,以及这篇讲的只是Speech Separation中的沧海一粟,还有很多的东西可以讲,这里再稍微拓展一下。
5.1 Unknown number of speakers
当我们不知道输入的信号中有多少speakers的时候,Deep Clustering也许还可以尝试一下调整一下cluster的个数,但TasNet就真的失效了。那当我们不知道speaker的个数的时候,该咋办?下图提供了一种思路,就是我们train一个network,这个network每次只分离出一个人的声音,然后不断循环下去,同时这个network还要神奇地知道我分到什么时候的时候,声音中就剩下2个speakers了,它就可以停了。
5.2 Multiple microphones
当我们有多个麦克风的时候该怎么办?其实我们现在使用的大部分设备都是多个麦克风的,用传统的做法的话,有一些处理的技巧,但是用deep learning的话,就直接多输入硬train一发就结束了。
5.3 Visual information
在视频当中,我们还可以用到图像的信息。Google有给出过这样面的一个Demo,可见 Looking to Listen: Audio-Visual Speech Separation。大致的思想是在训练的时候加入了人脸的信息,这样的做法,就可以用PIT的训练方式了。这里不做太多的介绍。