
Tacotron 2.0模型結構
Tacotron是一個端到端的從文本合成語音的模型,也是典型的encoder2decoder結構。encoder用來将文本特征轉化為中間特征(可以類比為phoneme特征吧);decoder使用自回歸的方式,使用中間特征與上一時刻的mel特征輸出去生成這一時刻的mel特征。
Encoder
Encoder主要包含Embeding層、三層的1d的卷積層、以及一層雙向的LSTM層。
Input為(Batch,L,F)L為文本長度,F為文本特征次元。
- Embeding層将字母轉換為512維詞向量。
- 卷積層:每個卷積層的輸出channel為512,kernel為5x1的卷積核,即每層卷積橫跨五個字元,後面接上bn層與relu激活函數,通過使用多層的卷積操作來對輸入的文本序列進行上下文模組化,用來獲得上下文特征關系。主要是因為實踐中rnn很難捕獲長時的依賴
雙向的LSTM層:為一層,輸出的次元為512,來生成編碼特征,編碼特征次元為(Batch,L,512)。
Decoder
Decoder是一個包含了一個兩層FC的Pre-Net、5層卷積的Post-Net以及包含的位置敏感的注意力機制子產品。在訓練時Pre-Net采用真實的Mel特征作為輸入,進行訓練。測試時,上一時刻Linear Projection的輸出作為Pre-Net的這一時刻的輸入。
- Pre-Net為兩層次元為512的全連接配接層的網絡,作為資訊瓶頸層,對學習注意力是必要的。Pre-Net的輸入為特定一幀(也可以幾幀拼接一下輸入)的Mel特征次元為(Batch,D)。D為Mel特征的次元80。輸出為(Batch,512)。
- 将這一時刻Pre-Net的輸出與注意力子產品輸出的上一時刻上下文特征進行拼接操作後,送入到兩層的由1024單元組成的LSTM層中,獲得LSTM的輸出,其特征次元為(Batch,1024)。
- 将Encoder的輸出、步驟2中的LSTM輸出、與累加的注意力權重變量(初始化為0)作為注意力機制的輸入,并輸出這一時刻的注意力權重與這一時刻的上下文特征。其中Encoder的輸出可以視為Value、LSTM的輸出視為Query、累加的注意力權重變量可以視作位置特征。注意力的具體操作為步驟四
- 對于注意力,Tacotron2使用的是位置敏感注意力(我看了它引用的那篇注意力得到論文,但是我覺得更像是結合内容與位置的混合注意力機制,并不是單純的位置注意力)下圖為解釋:(來自于一個部落格,懶得自己碼公式了)
對于tanh激活函數裡的第一項,其實就是解碼器的這一時刻的隐狀态做了一個映射(也就是LSTM的輸出做了一個映射);第二項為編碼器的隐狀态做了一個映射(也就是Encoder的輸出做了一個映射);第三項為累加的注意力權重變量做了一個映射。第一項加第二項相當于基于内容的注意力機制,第二項加第三項相當于基于位置的注意力機制。
這樣等于說“使得模型在沿着輸入序列向前移動的時候保持前後一緻,減少了解碼過程中潛在的子序列重複或遺漏”。
5.在步驟四等到注意力權重後,與Encoder的輸出做權重和,等到這一時刻的上下文特征。此時,這一時刻的上下文特征再次與步驟二中的LSTM的輸出進行拼接後,經過Linear Projection層的映射後,得到這一時刻的目标頻譜幀6
6.将這一時刻的目标頻譜幀經過5層的Post-net來預測一個殘差疊加到卷積前的頻譜幀上,用以改善頻譜重構的整個過程。post-net每層由512個5X1卷積核組成,後接批歸一化層,除了最後一層卷積,每層批歸一化都用tanh激活。
7.另外步驟五得到目标頻譜幀經過另外一個并行的Linear Projection+sigmoid層,來預測輸出序列是否已經完成的機率。
損失函數
在Anthea中損失函數共有四項,分别是步驟五與步驟六得到的目标頻譜與gt的mse loss項與L1 loss項、步驟七的交叉熵 loss項,以及注意力損失項(目的是為了使注意力排列更加單調)
但是在官方的文檔中隻有前三項,沒有第四項的注意力損失。