日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Chapter4-2_Speech_Synthesis(More than Tacotron)

發(fā)布時間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Chapter4-2_Speech_Synthesis(More than Tacotron) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 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,若有侵權(quán),必定刪除。

文章索引:

上篇 - 4-1 Tacotron

下篇 - 5 Speaker Verification

總目錄

1 Mispronunciation

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

所以,有一種辦法就是,構(gòu)建一個把單詞轉(zhuǎn)化為發(fā)音單元的lexicon,然后輸入發(fā)音單元就可以了。不過這種辦法的問題在于,lexicon沒法包含所有的詞匯,比如下圖中的"nCoV"這樣沒在lexicon中的單詞出現(xiàn)了的話,模型就沒辦法了。不過這個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對應(yīng)位置的attention都在對角線上,所有有一種很直接的做法就是,劃出一塊禁止有attention的區(qū)域,如果下圖中紅色位置的區(qū)域有attention的話,就對模型進行懲罰。這個就叫做Guided Attention。

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

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

4 Fast Speech and DurIAN

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

那么,這個模型該怎么訓(xùn)練,用end-to-end的方法去硬train的話,是不work的,因為Durantion到Add length這里是不可微分的。雖然可以用強化學(xué)習(xí)去硬train,但是文章采取了另一種方法。那就是給Duration這里一個ground truth,同時也把ground truth直接喂給Add length,這樣用多個loss去train。這里的Duration的ground truth是用類似Tacotron這樣的模型跑出來的。

最終的結(jié)果,作者選了50個難念的句子試了一下,發(fā)現(xiàn)比Tacotron 2和其他模型要好很多。

5 Dual Learning

Automated Speech Recognition(ASR)和Text to Speech(TTS)是兩個可以相互學(xué)習(xí)的模型。前者是輸入語音,輸出文字;后者是輸入文字,輸出語音。兩者可以構(gòu)成一個Speech Chain來相互學(xué)習(xí),相互提升。

如何去相互學(xué)習(xí)呢?有兩種方法。一種是我們只有語音,沒有對應(yīng)的文字的情況,這個時候,我們就可以把ASR當做encoder輸出文字,TTS當做decoder輸出語音,然后希望TTS輸出的語音和輸入的語音越接近越好。其實本質(zhì)上就是一個auto-encoder的過程。另一用就是我們只有文字,沒有語音的情況,做法和前者類似。這里的ASR和TTS都是需要pretrain過的。

然后經(jīng)過實驗,這樣train下來,對兩者都有提升。

5 Controllable TTS

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

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

“誰在說”和“怎么說”可以用類似Voice Conversion的做法去實現(xiàn),就是加入一段reference audio,讓模型去學(xué)得和這段聲音的說話方式類似。在這種情況下,TTS的訓(xùn)練方式也是和VC非常類似的。

具體的訓(xùn)練方法是,比如我們有一段"hello"的text輸入,然后又有一個“hello”的語音輸入,我們希望最終輸出的語音和我們輸入的語音越接近越好。但是這樣很可能會讓模型偷懶,就是模型可能會無視輸入的文字,直接把輸入的語音輸出了。最終的結(jié)果就是,在inference的時候,我們輸入文字"hello"和語音"I love you",輸出就直接是輸入的"I love you"。所以,我們要讓模型知道,要從輸入的文字去獲取內(nèi)容信息,從輸入的語音去獲取語者的信息。

Speaker Embedding

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

GST-Tacotron

除了speaker embedding之外,GST-Tacotron也可以把輸入的reference audio的內(nèi)容信息過濾掉,只提取語者的特征。文字部分,還是會通過一個Encoder輸出對應(yīng)的sequence feature,不過reference audio這里,會經(jīng)過一個參與訓(xùn)練的feature extractor,然后這個feature extractor只輸出一個vector,這個vector會復(fù)制成一個和encoder輸出序列長度一樣的序列,然后把這兩個序列concat或者直接相加即可。這個結(jié)果再那去做attention,剩下的部分就可Tacotron一樣了。

為什么這么做可以把reference audio中的內(nèi)容信息過濾掉?這得益于feature extractor的獨特設(shè)計。feature extractor的內(nèi)部如下圖右半部分所示。reference audio會經(jīng)過一個encoder輸出一系列的weights,然后這些weights會和一些Style Tokens去做相乘求和,最終得到一個vector的輸出。這些Style Tokens也是學(xué)出來的,神奇的是,當訓(xùn)練完成之后,發(fā)現(xiàn)每一個token就會對應(yīng)一種聲音的特征,只要調(diào)整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輸出的文字和輸入的文字一致。這里有一個訓(xùn)練attention的技巧,就是,居然輸入的某個字符的attention對應(yīng)這某段語音,那么我們也可以讓這段語音的attention對應(yīng)著某個位置的字符。這樣做train起來會容易一些。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的Chapter4-2_Speech_Synthesis(More than Tacotron)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。