# [論文筆記] Transfer Learning from Speaker Verification to Multispeaker Text-To-Speech Synthesis(Part II) ###### tags: `Voice` 語音合成系統通常包含多個階段,例如 Synthesizer(TTS Frontend,Acoustic model)和 Vocoder  ## Synthesizer ## 1. 結構:非 end-to-end  ### 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 訓練。 輸入:文字,輸出:語音  分為 4 個 Moduel * Grapheme(字母)-to-phoneme(發音==音素==) 給定 Grapheme,去猜測它的發音,將轉化成為最小的 phonem 給另外兩個 Moduel * Duration Prediction:判斷每一個音符發音的==時長== * Fundamental Frequency Prediction: * 判斷每一個發音的音高、==音調==(音符震頻) * 不需要聲帶震動就輸出【X】 * Audio Synthesis 三個 Moduel 結果合在一起(同時接收 phoneme+發音時長+音調),就是"語音合成"的結果 > **[註] phoneme 發音音素** > 1. 發音的基本單元 > 是人類語言中能夠區別意義的最小聲音單位,是音位學分析的基礎概念。 > 3. 一個字詞可由一至數個音節組成,一個音節可由一至數個「音段」(元音、輔音等)組成。  在出現 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  * 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   目的:將 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  * 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 向量)發音多少秒  輸入的文字(Character)和輸出的語音(phoneme)在**時間**上其實是有一種對應關係的 可視化展現出 model 對每個 phoneme(音素)的持續時長的建模方式 * 縱軸:每個點代表 Encoder 輸出的 embedding(phoneme 向量) * 橫軸:在做 Decoder 的時候,我們每一個 embedding(phoneme 向量)會輸出多少 Time Steps(多少秒的發音),即 Encoder 吐出的每一個 phoneme(音素),Decoder 要把它變成多長的聲音訊號。 **目標**:曲線越接近於對角線效果越好 ### 3.2.2 Decoder  一次預測一個 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 :::
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.