Chapter4-2_Speech_Synthesis(More than Tacotron)

本文爲李弘毅老師【Speech Synthesis - More than Tacotron】的課程筆記,課程視頻youtube地址,點這裏👈(需翻牆)。

下文中用到的圖片均來自於李宏毅老師的PPT,若有侵權,必定刪除。

文章索引:

上篇 - 4-1 Tacotron

下篇 - 5 Speaker Verification

總目錄

1 Mispronunciation

當打分者在給Tacotron打分的時候,打分者認爲Tacotron比ground truth分數低的原因是,Tacotron有時會拼錯音,這有點讓人感到突兀。而這也是因爲Tacotron訓練時用到的數據集包含的詞彙量太少了。如下圖所示,最大的LibrTTS dataset,其中的詞彙量也就只有七八萬的樣子,差不多時英文詞彙量的十分之一,更關鍵的是,不斷會有新的英文詞彙在生活中湧現出來,面對這些新的詞彙,Tacotron只能猜一猜了。
ch4-2-1

所以,有一種辦法就是,構建一個把單詞轉化爲發音單元的lexicon,然後輸入發音單元就可以了。不過這種辦法的問題在於,lexicon沒法包含所有的詞彙,比如下圖中的"nCoV"這樣沒在lexicon中的單詞出現了的話,模型就沒辦法了。不過這個lexicon可以一直更新。
ch4-2-2

2 More information for Encoder

(1)Syntactic information
加入文法的信息是對模型輸出語音的停頓是有幫助的,所謂文法的信息就是下圖所示的這樣,表示了哪些單詞可以組成一個短語,在句子中的成分是什麼等等。可參見Exploiting Syntactic Features in a Parsed Tree to Improve End-to-End TTS
ch4-2-3
(2)BERT embedding as input
有人也試過把文本embedding之後的信息作爲輸入,這也是有一定幫助的。可參見Pre-trained Text Embeddings for Enhanced Text-to-Speech Synthesis

3 Attention

上篇中,我們有提到過,希望Encoder steps和Decoder steps對應位置的attention都在對角線上,所有有一種很直接的做法就是,劃出一塊禁止有attention的區域,如果下圖中紅色位置的區域有attention的話,就對模型進行懲罰。這個就叫做Guided Attention
ch4-2-4

除此之外,還有很多很多其他的Attention,比如在charpeter 1-2中講過的Location aware。這些attention對模型最終的效果有着很大的影響,具體可參見Location-Relative Attention Mechanisms For Robust Long-Form Speech Synthesis。該文指出,如果只用數據集中長度較短的數據去訓練,然後用各種長度的數據來Inference,就會發現,一個好的attention的表現一直很好,但是有些attention面對比較長的數據就壞掉了。下圖中的GMMv2b和DCA就是表現比較好的。
ch4-2-5

百度也提出過一種attention,這種attention有兩個特點。其一是說,它在inference的時候,加了一個mask,把非對角線上的attention給直接置0了。其二是說它在query和keys輸入時,都加入了position encoding,然後這個position encoding是根據speaker embedding直接學出來的。這大概是因爲不同的人說話的語速是不同的吧。speaker embedding在下面會講。
ch4-2-6

4 Fast Speech and DurIAN

除了Tacotron之外,還有其他的一些效果比較好的Text to Speech(TTS)的模型。比如下圖中的Fast Speech和DurIAN。這兩個模型是由兩個團隊在相近的時間提出的,然後思路也基本是一致的。他們的做法是說,先把文字輸入到一個encoder當中去抽出一個等長的sequence feature,然後把這個feature放到一個叫做Duration的模塊當中去,去預測每個feature需要重複的長度。這裏的長度也就是我們最終輸出的語音念每個詞的長度。結合這個給定的長度和encoder產生的feature,輸出一個與最終輸出長度相符的sequence feature,再把這個sequence feature放到一個decoder當中去,得到最終的Mel-spectrogram,也就是我們的語音。
ch4-2-7

那麼,這個模型該怎麼訓練,用end-to-end的方法去硬train的話,是不work的,因爲Durantion到Add length這裏是不可微分的。雖然可以用強化學習去硬train,但是文章採取了另一種方法。那就是給Duration這裏一個ground truth,同時也把ground truth直接餵給Add length,這樣用多個loss去train。這裏的Duration的ground truth是用類似Tacotron這樣的模型跑出來的。
4-2-8

最終的結果,作者選了50個難唸的句子試了一下,發現比Tacotron 2和其他模型要好很多。
4-2-9

5 Dual Learning

Automated Speech Recognition(ASR)和Text to Speech(TTS)是兩個可以相互學習的模型。前者是輸入語音,輸出文字;後者是輸入文字,輸出語音。兩者可以構成一個Speech Chain來相互學習,相互提升。
ch4-2-10

如何去相互學習呢?有兩種方法。一種是我們只有語音,沒有對應的文字的情況,這個時候,我們就可以把ASR當做encoder輸出文字,TTS當做decoder輸出語音,然後希望TTS輸出的語音和輸入的語音越接近越好。其實本質上就是一個auto-encoder的過程。另一用就是我們只有文字,沒有語音的情況,做法和前者類似。這裏的ASR和TTS都是需要pretrain過的。
ch4-2-11
然後經過實驗,這樣train下來,對兩者都有提升。
ch4-2-12

5 Controllable TTS

最後再來說一下如果去控制TTS。控制的方面主要分爲三個方向:

  • 說什麼
    這一塊是通過我們輸入的文字去控制的。
  • 誰在說
    誰在說的話可以通過收集某個人的大量語音資料,然後讓模型去學習來做到。不過也有其他的方法。
  • 怎麼說
    怎麼說指的是說話的語調、重音和音律之類的。這個很難說清楚,英文叫做Prosody,翻譯過來可以叫做抑揚頓挫。

“誰在說”和“怎麼說”可以用類似Voice Conversion的做法去實現,就是加入一段reference audio,讓模型去學得和這段聲音的說話方式類似。在這種情況下,TTS的訓練方式也是和VC非常類似的。
4-2-13
具體的訓練方法是,比如我們有一段"hello"的text輸入,然後又有一個“hello”的語音輸入,我們希望最終輸出的語音和我們輸入的語音越接近越好。但是這樣很可能會讓模型偷懶,就是模型可能會無視輸入的文字,直接把輸入的語音輸出了。最終的結果就是,在inference的時候,我們輸入文字"hello"和語音"I love you",輸出就直接是輸入的"I love you"。所以,我們要讓模型知道,要從輸入的文字去獲取內容信息,從輸入的語音去獲取語者的信息。
ch4-2-14

Speaker Embedding

所以,一種非常直觀的做法,就是我找一個預訓練好的只抽取語者特徵的feature extractor來,固定住weights,不參與訓練。然後把這個feature extractor輸出的speaker embedding當做輸入,這樣一來,模型就只能夠從輸入的文字當中去獲取輸出內容的信息。這種方法,只需要少量的某個語者的語音數據,就可以train出一個該特定語者的TTS。
ch4-2-15

GST-Tacotron

除了speaker embedding之外,GST-Tacotron也可以把輸入的reference audio的內容信息過濾掉,只提取語者的特徵。文字部分,還是會通過一個Encoder輸出對應的sequence feature,不過reference audio這裏,會經過一個參與訓練的feature extractor,然後這個feature extractor只輸出一個vector,這個vector會複製成一個和encoder輸出序列長度一樣的序列,然後把這兩個序列concat或者直接相加即可。這個結果再那去做attention,剩下的部分就可Tacotron一樣了。
ch4-2-16

爲什麼這麼做可以把reference audio中的內容信息過濾掉?這得益於feature extractor的獨特設計。feature extractor的內部如下圖右半部分所示。reference audio會經過一個encoder輸出一系列的weights,然後這些weights會和一些Style Tokens去做相乘求和,最終得到一個vector的輸出。這些Style Tokens也是學出來的,神奇的是,當訓練完成之後,發現每一個token就會對應一種聲音的特徵,只要調整attention的weights就可以輸出不同的聲音。比如有的token代表低音,有的token代表語速等等。
ch4-2-17

Two-stage Training

最後再介紹一種two-stage training的方法來提取reference audio中的語者信息。這是一種非常直觀的做法,既然我們的輸入語音和目標語音一樣會讓模型直接copy輸入語音的話,那麼我們讓輸入語音和目標語音不一樣就可以了。比如我們輸入文字"good bye"和語音"I love you",模型輸出語音"good bye"。但這樣一來,我們的ground truth去哪裏找?
ch4-2-18

於是,我們這裏用到了和上文中提到的dual learning類似的方法。我們會把TTS輸出的語音,再放到一個ASR當中去,然後希望ASR輸出的文字和輸入的文字一致。這裏有一個訓練attention的技巧,就是,居然輸入的某個字符的attention對應這某段語音,那麼我們也可以讓這段語音的attention對應着某個位置的字符。這樣做train起來會容易一些。
ch4-2-19

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