---
# System prepended metadata

title: '[論文筆記] Transfer Learning from Speaker Verification to Multispeaker Text-To-Speech Synthesis（Part II）'
tags: [Voice]

---

# [論文筆記] 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
:::
