Chapter4-2_Speech_Synthesis(More than Tacotron)
文章目錄
- 1 Mispronunciation
- 2 More information for Encoder
- 3 Attention
- 4 Fast Speech and DurIAN
- 5 Dual Learning
- 5 Controllable TTS
- Speaker Embedding
- GST-Tacotron
- Two-stage Training
本文為李弘毅老師【Speech Synthesis - More than Tacotron】的課程筆記,課程視頻youtube地址,點這里👈(需翻墻)。
下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權,必定刪除。
文章索引:
上篇 - 4-1 Tacotron
下篇 - 5 Speaker Verification
總目錄
1 Mispronunciation
當打分者在給Tacotron打分的時候,打分者認為Tacotron比ground truth分數低的原因是,Tacotron有時會拼錯音,這有點讓人感到突兀。而這也是因為Tacotron訓練時用到的數據集包含的詞匯量太少了。如下圖所示,最大的LibrTTS dataset,其中的詞匯量也就只有七八萬的樣子,差不多時英文詞匯量的十分之一,更關鍵的是,不斷會有新的英文詞匯在生活中涌現出來,面對這些新的詞匯,Tacotron只能猜一猜了。
所以,有一種辦法就是,構建一個把單詞轉化為發音單元的lexicon,然后輸入發音單元就可以了。不過這種辦法的問題在于,lexicon沒法包含所有的詞匯,比如下圖中的"nCoV"這樣沒在lexicon中的單詞出現了的話,模型就沒辦法了。不過這個lexicon可以一直更新。
2 More information for Encoder
(1)Syntactic information
加入文法的信息是對模型輸出語音的停頓是有幫助的,所謂文法的信息就是下圖所示的這樣,表示了哪些單詞可以組成一個短語,在句子中的成分是什么等等。可參見Exploiting Syntactic Features in a Parsed Tree to Improve End-to-End TTS。
(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。
除此之外,還有很多很多其他的Attention,比如在charpeter 1-2中講過的Location aware。這些attention對模型最終的效果有著很大的影響,具體可參見Location-Relative Attention Mechanisms For Robust Long-Form Speech Synthesis。該文指出,如果只用數據集中長度較短的數據去訓練,然后用各種長度的數據來Inference,就會發現,一個好的attention的表現一直很好,但是有些attention面對比較長的數據就壞掉了。下圖中的GMMv2b和DCA就是表現比較好的。
百度也提出過一種attention,這種attention有兩個特點。其一是說,它在inference的時候,加了一個mask,把非對角線上的attention給直接置0了。其二是說它在query和keys輸入時,都加入了position encoding,然后這個position encoding是根據speaker embedding直接學出來的。這大概是因為不同的人說話的語速是不同的吧。speaker embedding在下面會講。
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,也就是我們的語音。
那么,這個模型該怎么訓練,用end-to-end的方法去硬train的話,是不work的,因為Durantion到Add length這里是不可微分的。雖然可以用強化學習去硬train,但是文章采取了另一種方法。那就是給Duration這里一個ground truth,同時也把ground truth直接喂給Add length,這樣用多個loss去train。這里的Duration的ground truth是用類似Tacotron這樣的模型跑出來的。
最終的結果,作者選了50個難念的句子試了一下,發現比Tacotron 2和其他模型要好很多。
5 Dual Learning
Automated Speech Recognition(ASR)和Text to Speech(TTS)是兩個可以相互學習的模型。前者是輸入語音,輸出文字;后者是輸入文字,輸出語音。兩者可以構成一個Speech Chain來相互學習,相互提升。
如何去相互學習呢?有兩種方法。一種是我們只有語音,沒有對應的文字的情況,這個時候,我們就可以把ASR當做encoder輸出文字,TTS當做decoder輸出語音,然后希望TTS輸出的語音和輸入的語音越接近越好。其實本質上就是一個auto-encoder的過程。另一用就是我們只有文字,沒有語音的情況,做法和前者類似。這里的ASR和TTS都是需要pretrain過的。
然后經過實驗,這樣train下來,對兩者都有提升。
5 Controllable TTS
最后再來說一下如果去控制TTS。控制的方面主要分為三個方向:
- 說什么
這一塊是通過我們輸入的文字去控制的。 - 誰在說
誰在說的話可以通過收集某個人的大量語音資料,然后讓模型去學習來做到。不過也有其他的方法。 - 怎么說
怎么說指的是說話的語調、重音和音律之類的。這個很難說清楚,英文叫做Prosody,翻譯過來可以叫做抑揚頓挫。
“誰在說”和“怎么說”可以用類似Voice Conversion的做法去實現,就是加入一段reference audio,讓模型去學得和這段聲音的說話方式類似。在這種情況下,TTS的訓練方式也是和VC非常類似的。
具體的訓練方法是,比如我們有一段"hello"的text輸入,然后又有一個“hello”的語音輸入,我們希望最終輸出的語音和我們輸入的語音越接近越好。但是這樣很可能會讓模型偷懶,就是模型可能會無視輸入的文字,直接把輸入的語音輸出了。最終的結果就是,在inference的時候,我們輸入文字"hello"和語音"I love you",輸出就直接是輸入的"I love you"。所以,我們要讓模型知道,要從輸入的文字去獲取內容信息,從輸入的語音去獲取語者的信息。
Speaker Embedding
所以,一種非常直觀的做法,就是我找一個預訓練好的只抽取語者特征的feature extractor來,固定住weights,不參與訓練。然后把這個feature extractor輸出的speaker embedding當做輸入,這樣一來,模型就只能夠從輸入的文字當中去獲取輸出內容的信息。這種方法,只需要少量的某個語者的語音數據,就可以train出一個該特定語者的TTS。
GST-Tacotron
除了speaker embedding之外,GST-Tacotron也可以把輸入的reference audio的內容信息過濾掉,只提取語者的特征。文字部分,還是會通過一個Encoder輸出對應的sequence feature,不過reference audio這里,會經過一個參與訓練的feature extractor,然后這個feature extractor只輸出一個vector,這個vector會復制成一個和encoder輸出序列長度一樣的序列,然后把這兩個序列concat或者直接相加即可。這個結果再那去做attention,剩下的部分就可Tacotron一樣了。
為什么這么做可以把reference audio中的內容信息過濾掉?這得益于feature extractor的獨特設計。feature extractor的內部如下圖右半部分所示。reference audio會經過一個encoder輸出一系列的weights,然后這些weights會和一些Style Tokens去做相乘求和,最終得到一個vector的輸出。這些Style Tokens也是學出來的,神奇的是,當訓練完成之后,發現每一個token就會對應一種聲音的特征,只要調整attention的weights就可以輸出不同的聲音。比如有的token代表低音,有的token代表語速等等。
Two-stage Training
最后再介紹一種two-stage training的方法來提取reference audio中的語者信息。這是一種非常直觀的做法,既然我們的輸入語音和目標語音一樣會讓模型直接copy輸入語音的話,那么我們讓輸入語音和目標語音不一樣就可以了。比如我們輸入文字"good bye"和語音"I love you",模型輸出語音"good bye"。但這樣一來,我們的ground truth去哪里找?
于是,我們這里用到了和上文中提到的dual learning類似的方法。我們會把TTS輸出的語音,再放到一個ASR當中去,然后希望ASR輸出的文字和輸入的文字一致。這里有一個訓練attention的技巧,就是,居然輸入的某個字符的attention對應這某段語音,那么我們也可以讓這段語音的attention對應著某個位置的字符。這樣做train起來會容易一些。
總結
以上是生活随笔為你收集整理的Chapter4-2_Speech_Synthesis(More than Tacotron)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HiveQL:查询
- 下一篇: LeetCode 1984. 学生分数的