这个模型的输入和输出都是声波信息。一开始输入的维度信息为1。
分为三块:
1. Encoder:声音讯号通过 Encoder后变成 Feture map
2. Separator:Encode的输出给 Separator后产生两个Mask
3. Decoder:将这两个Mask分别乘上 Encode的输出上,将这两个结果给 Decoder后就会产生分离后的两段声音讯号。
4.PIT:TasNet在训练的时候是需要PIT的
解码和编码/Encoder&Decoder
编码其实就是一个线性的转换(在线性代数中,我们知道任何的线性变化都可以表示成为矩阵相乘的形式,所以这里的编码器的内部其实就是一个,Matrix矩阵)
这里有两个关键点:
1.每一次取的都是非常小的一端声音讯号(下面以500ms为例子),在这段讯号中取16个采样点,经过Encoder后便可以得到16*512维的矩阵向量信息(这也是线性代数的知识,进行矩阵之间的运算)
2.看上去来说,Encoder和Decoder其实应该是完全相反的,毕竟如何编码就应该如何解码,但是实际问题上是有区别的,不可以如何编码就如何解码,这样的效果会变得比较差,需要对Encoder和Decoder分贝进行训练,但是实际上,训练出来的图像结果是大致一样的,下面是他们的训练出来的权重向量的结果:
如上图所示,很明显,它们在匹配不同的频率 frequency的讯号(|FFT|频率图上图的黑色框),有 encode高频的、有 encode比较低频的,低频的特别多,因为人的发音也是低频的更多。
而这一切都是 network自动学到的。
Seperation:分离阶段
Encoder输出的是一堆黄色的向量,Separator会全部放进去,然后产生两个mask。(后面的东西就是和之前的掩模一致 了)
具体流程:
有很多层CNN,每一个层都是把两个vector变成一个vector,然后进入到下一层,直到最后只剩下一个vector的时候,乘上两个不同的transform(?),并且通过sigmoid激活函数(比较low的那种),得到了两个mask,然后再输出。
真正的模型如下:
值得一提的是,这里不通过LSTM,而用了最基本的CNN?
因为对于一般的LSTM而言,输入的开始往往就是讯息的起始点,但声音片段的输入往往不是声音的起始,有人做过实验,发现LSTM的稳定性很差。(结果如下图)
位置数量的声源分离:
有一个想法便是每一次是分开出一个声源的信息,然后在剩下的声源分离,至于总共要分离多少次也是要模型训练才可以掌控的。