Chapter3-2_Speech Separation(TasNet)

本文爲李弘毅老師【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。
ch3-2-1

2 Encoder和Decoder

TasNet的Encoder和Decoder都是linear transformer,可以看成是兩個矩陣。Encoder的輸入是一個16維的向量,吐出的是一個512維的向量,Decoder的輸入是一個512維的向量,吐出的是一個16維的向量。我們可能會很直覺的認爲Encoder裏的線性變換和Decoder裏的線性變換應該是inverse的,但實際情況是,做了這樣的限制之後,模型的效果並不好。對於Encoder而言,如果這個Encoder就是Fourier Transformer的話,那它的輸出應該都是正的。但是做了這樣的限制,效果也不好。

所以,就是不用做這些限制,直接train就行。
ch3-2-2

3 Separator

這個Separator是很多層dilated convolution的堆疊。它喫的是Encoder的輸出,會把這個輸出經過多個dilation不斷成倍增長的dilated convolution。最後對得到的結果做一個transform和sigmoid得到兩個mask。這個sigmoid可以不加,mask 1和mask 2中對應位置的元素之和也不需要是1。
ch3-2-3

實際情況下,這個dilated convolution是有很多層的,最後一層的dilation=128,也就是說有8層(27=1282^7=128)。然後,這個過程一般會重複3次,這個repeat的次數是可以調整的超參數。這麼做的目的就是,當Separator在輸出某個mask值的時候,看過足夠長的語音信號。比如下圖的這種結構,模型單個mask值的輸出會考慮1.53s長度的語音。由於用到的cnn太多了,其中還用到了Depthwise Separable Convolution的技術來輕量化模型。
ch3-2-4

在最初的時候,其實Separator用的是LSTM,但是爲什麼變成了CNN呢?原因就是訓練的時候,我們都是從句子的開頭開始放進LSTM去train的,這樣一來LSTM就沒法適應一句話從中間截斷送進來的情況,也就是說LSTM很傲嬌,剛開始看到的不是句子的開頭,就壞掉了。而CNN是time invariant的,它無所謂句子的開頭在哪裏。從下圖中不難看出,總體的表現也是CNN更好。
ch3-2-5

4 TasNet回顧

我們再來回顧一下TasNet的整個架構。如下圖所示,圖中用的是一個真實的例子畫出來的圖像,紅色和藍色分別代表不同的speaker,可見TasNet學到的mask可以很好地把兩個speaker的聲音給分開來。對了,TasNet在train的時候要用上篇中提到的PIT的技巧。
ch3-2-6

最後再來看一下TasNet的效果究竟如何。下圖是Wavesplit這篇文章中對不同方法在WSJ0-2mix上結果的對比。不難看出TasNet比Deep Clustering要好很多。但是,在實際情況下,Deep Clustering的泛化能力會比TasNet要好。比如WSJ0-2mix是一個英文的數據集,TasNet在這個數據集上train了之後,給它說中文,它就搞不懂,但是Deep Clustering在這個數據集上train了之後可以把中文給Seperate了。這也是比較奇怪的地方。
ch3-2-7

5 More

上一篇,以及這篇講的只是Speech Separation中的滄海一粟,還有很多的東西可以講,這裏再稍微拓展一下。

5.1 Unknown number of speakers

當我們不知道輸入的信號中有多少speakers的時候,Deep Clustering也許還可以嘗試一下調整一下cluster的個數,但TasNet就真的失效了。那當我們不知道speaker的個數的時候,該咋辦?下圖提供了一種思路,就是我們train一個network,這個network每次只分離出一個人的聲音,然後不斷循環下去,同時這個network還要神奇地知道我分到什麼時候的時候,聲音中就剩下2個speakers了,它就可以停了。
ch3-2-8

5.2 Multiple microphones

當我們有多個麥克風的時候該怎麼辦?其實我們現在使用的大部分設備都是多個麥克風的,用傳統的做法的話,有一些處理的技巧,但是用deep learning的話,就直接多輸入硬train一發就結束了。
ch3-2-9

5.3 Visual information

在視頻當中,我們還可以用到圖像的信息。Google有給出過這樣面的一個Demo,可見 Looking to Listen: Audio-Visual Speech Separation。大致的思想是在訓練的時候加入了人臉的信息,這樣的做法,就可以用PIT的訓練方式了。這裏不做太多的介紹。
ch3-2-10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章