# [論文筆記] Transfer Learning from Speaker Verification to Multispeaker Text-To-Speech Synthesis(Part II) ###### tags: `Voice` 語音合成系統通常包含多個階段,例如 Synthesizer(TTS Frontend,Acoustic model)和 Vocoder ![](https://i.imgur.com/ykclhyd.png =680x) ## Synthesizer ## 1. 結構:非 end-to-end ![](https://i.imgur.com/34LD1CR.png =250x)![](https://i.imgur.com/snoWmwT.png =460x) ### 1.1 Concatenative Approach * 聲音 dataset:把很多聲音訊息都存在 dataset 中,要使用時就拿出來進行 Concate * 作法:合成"你好嗎" → 從 dataset 中找出 "你", "好", "嗎" 三個字的聲音,Concate 在一起.類似關鍵字搜尋 * 問題: * 合成聲音不夠豐富(無法合成語料庫中沒有的) * 語料庫(聲音 dataset)中沒有我們想要的字 * 須要在語料庫中存要合成對象的聲音 * 聽起來很不自然 → 將什麼樣的音串在一起聽起來比較順 * 因此許多研究為 "減少 Concatenation cost" ### 1.2 Parametric Approach * 最早使用的 ML 方法做語音合成系統:利用 DNN 或 HMM(馬可夫)來解這個問題 * 方法:訓練之後輸出機率最高的作為實驗結果 * 問題:每次輸出都是同一段語音 --- ## 2. 結構:encoder-decoder ### 2.1 Deep Voice 比較接近 end-to-end 的做法就是百度提出的 Deep Voice,把文字轉換成語音 因每一個 Moduel 都是分開 end-to-end 訓練的,所以整體模型嚴格意義上不算 end-to-end 訓練。 輸入:文字,輸出:語音 ![](https://i.imgur.com/hMruBkC.png =550x) 分為 4 個 Moduel * Grapheme(字母)-to-phoneme(發音==音素==) 給定 Grapheme,去猜測它的發音,將轉化成為最小的 phonem 給另外兩個 Moduel * Duration Prediction:判斷每一個音符發音的==時長== * Fundamental Frequency Prediction: * 判斷每一個發音的音高、==音調==(音符震頻) * 不需要聲帶震動就輸出【X】 * Audio Synthesis 三個 Moduel 結果合在一起(同時接收 phoneme+發音時長+音調),就是"語音合成"的結果 > **[註] phoneme 發音音素** > 1. 發音的基本單元 > 是人類語言中能夠區別意義的最小聲音單位,是音位學分析的基礎概念。 > 3. 一個字詞可由一至數個音節組成,一個音節可由一至數個「音段」(元音、輔音等)組成。 ![](https://i.imgur.com/kK5vWxA.png =400x) 在出現 Tacotron前,研究者也做了一些 End-to-end TTS 嘗試 ### 2.2 First Step Towards End-to-end Parametric TTS Synthesis * Input:phoneme * Output:聲學特徵向量(acoustic features) for STRAIGHT (vocoder) acoustic features 丟入一個特殊的 STRAIGHT Vocoder,才能輸出 Waveform(聲波)     ### 2.3 Char2wav * Input:character * Output:聲學特徵向量(acoustic features) for SampleRNN (vocoder) ### 2.4 Tacotron 模型 * Input:character * Output:Linear spectrogram(聲音頻譜),做 linear transform 就是 Waveform(聲波) * 優勢:Tacotron 的方式是最一步到位的 --- ## 3.1 Tacotron v1 架構:Seq2Seq + Attention ![](https://i.imgur.com/JfySbf5.png =450x) * Encoder:由 char embedding、Pre-net、CBHG 組成 * Attention * Decoder:由 pre-net、Attention-RNN、Decoder-RNN 組成 * 目的:生成 Mel-spectrogram frame * spectrogram:size通常是很大的,因此直接生成會非常耗時 * mel-spectrogram: * 雖然會損失一些訊息,但是相比 spectrogram 就小了很多 * 針對人耳來設計的,因此對最終生成的波形的質量不會有很多影響 * post-processing:CBHG 目的:將 Mel-spectrogram 轉換為 linear-scale spectrogram * decoder-RNN 後並沒有直接將輸出轉化為語音(音頻文件) * 而是接了 CBHG,用來在一個線性頻率範圍內預測幅度譜(spectral magnitude),通過反向傳播來修正每一 frame 的錯誤 * vocoder:使用 Griffin-Lim 算法 目的:將 linear-scale spectrogram(聲學參數)轉換 Waveform(語音聲波) 特點:不需訓練、不需要預知 Phase spectrum,而是通過 frame 之間的關係,通過迭代生成 Phase spectrum 即已知的 Amplitude spectrum,從而重建語音波形。 ### 3.1.1 Encoder ![](https://i.imgur.com/a2xDmjw.png =550x) ![](https://i.imgur.com/YlZ2run.png =450x) 目的:將 Character(字母) 轉化成為一個 phoneme 向量(發音音素),告訴接下來的 Attention,這些字符要怎麼發音 1. Input 1:Character(字母)+ 標點符號(幫助 model 學習語氣、斷句) 2. Input 2:char embedding Character 經過 Linear Transform 變成 char embedding,放入 Pre-net 進行傅立葉轉換 > Pre-net:全連接層 + dropout 組成 3. Input 3:Pre-net 輸出之結果再通過 CBHG,輸出 phoneme 向量 * CBHG(Conv1D bank+Highway layer+GRU) Max-pool:平滑化(使相鄰 feature 相似) ### 3.1.2 Decoder Input:zerp vector 經過 Pre-net、RNN、Attention 後的 phoneme,再進RNN Output:每個 time step 輸出多個 Mel-Spectrogram 向量(省時),輸出多個 Mel-Spectrogram 向量,將多個向量串起當作下一個 RNN 的輸入 ex. 如果r=3,sequence 長度變為原來的 1/3 * 原因: * 一個 phoneme 的語音對應到 spectrogram 是比較長,1秒聲音對應很多個vector * 每個 RNN 只生成一個向量,那麼 sequence 長度很長,RNN 很容易爛掉 > r = Mel-Spectrogram 向量數目 > v1:r = 3, 5 > v2:r = 1 * Teacher forcing:判斷是否已經結束 * 作法:每次產生結果都進行一次判斷 詢問模塊:Binary的classifier,根據閾值判斷是否需要 * 原因:訓練的時候若用最後一層作為下一層的輸入,直接使用正確答案使訓練與測試的結果相差較大 * 解法:Dropout 丟掉正確答案的部分內容,防止 overfitting --- ## 3.2 Tacotron v2 ![](https://i.imgur.com/Gh41qoY.png =450x) * Encoder:由 char embedding、3 Conv layer、BiLSTM 組成 * Attention:這裡是 Local Sensitive Attention,並不是我們現在用到的 Self-Attention * Decoder:auto-regressive RNN,用來預測 Mel-spectrogram * Post-processing:以上輸出還會有個 Post-Net 來精調 Mel-spectrogram * vocoder:WaveNet ### 3.2.1 Attention 類似 Deep Voice 中的 Duration Prediction: 確定每一個 Character 的 embedding(phoneme 向量)發音多少秒 ![](https://i.imgur.com/OmdHwvn.png) 輸入的文字(Character)和輸出的語音(phoneme)在**時間**上其實是有一種對應關係的 可視化展現出 model 對每個 phoneme(音素)的持續時長的建模方式 * 縱軸:每個點代表 Encoder 輸出的 embedding(phoneme 向量) * 橫軸:在做 Decoder 的時候,我們每一個 embedding(phoneme 向量)會輸出多少 Time Steps(多少秒的發音),即 Encoder 吐出的每一個 phoneme(音素),Decoder 要把它變成多長的聲音訊號。 **目標**:曲線越接近於對角線效果越好 ### 3.2.2 Decoder ![](https://i.imgur.com/S4JA0HO.png) 一次預測一個 frame 的 Spectrogram 1. 上一步預測出的 Spectrogram 首先被傳入一個 “pre-net” > pre-net(ReLU組成的雙層全連接層):作為 boottleneck,對於學習 Attention 是必要的 2. pre-net 的輸出 + Attention → 2 層 LSTM 3. 2 層 LSTM 的輸出 + Attention → 經過一個 Linear Projection 來預測目標 Spectrogram 4. 最後,預測目標 Spectrogram 進入 "post-net",預測一個 Residual Residual + prediction → 得到了最後的 Mel-spectrogram > post-net(5層CNN):精調 mel-spectrogram,改善 spectrogram 重構的整個過程 --- * 每一步的預測結果 prediction 會進入 pre-net 層,然後和 attention 的結果一起進入 LSTM 層 * LSTM 層的結果和 attention 的向量再做 concat 然後通過 linear projection 預測目標的 spectrogram * 預測的結果進入 post-net 層來預測一個殘差,加到 prediction 上,我們就得到了最後的 Mel-spectrogram * 損失函數用的MSE。 ## 參考資料 :::success ### [DLHLP 2020] Speech Synthesis (1/2) - Tacotron https://www.youtube.com/watch?v=DMxKeHW8KdM 1. Speech Synthesis(語音合成)——學習筆記1, by 弗拉基米爾 https://zhuanlan.zhihu.com/p/140439784 2. 2020 年3月新番李宏毅人類語言處理獨家筆記TTS - 14, by 除夕 https://zhuanlan.zhihu.com/p/130999249 3. 李宏毅DLHLP.13.Speech Synthesis.1/2.Tacotron, by 老毛 https://blog.csdn.net/oldmao_2001/article/details/109099576 4. Chapter4-1_Speech_Synthesis(Tacotron), by zjuPeco https://blog.csdn.net/zjuPeco/article/details/106441232?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control ### NATURAL TTS SYNTHESIS BY CONDITIONING WAVENET ON MEL SPECTROGRAM PREDICTIONS paper(Tacotron2):https://arxiv.org/pdf/1712.05884.pdf 1. 論文閱讀筆記:Tacotron和Tacotron2 https://dengbocong.blog.csdn.net/article/details/111180544?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.control 2. Tacotron2 論文+ 代碼詳解 https://blog.csdn.net/whjkm/article/details/89321954?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-9.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-9. 3. TACOTRON:端到端的語音合成 https://blog.csdn.net/Left_Think/article/details/74905928?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control :::