G&L(griffin-lim)算法是一種已知幅度譜,未知相位譜,通過迭代生成相位譜,並用已知的幅度譜和計算得出的相位譜,重建語音波形的方法。
griffin-lim是一種聲碼器,常用於語音合成,用於將語音合成系統生成的聲學參數轉換成語音波形,這種聲碼器不需要訓練,不需要預知相位譜,而是通過幀與幀之間的關係估計相位信息,從未重建語音波形。
聲碼器(vocoder)
聲碼器是一種將聲學參數轉換成語音波形的工具。griffin-lim是一種較爲經典的聲碼器,算法簡單,高效。
另外加多使用的vocoder有: WORLD, STRAIGHT及其變種; WaveNet,一種可訓練的基於深度神經網絡的聲碼器,可生成高質量的語音波形,但是爲了擴展其感受野,速度慢且複雜度高;WaveRNN, 另一種可訓練的基於深度神經網絡的聲碼器,可生成高質量高保真的語音波形, 速度相較於WaveNet有提升,在使用摺疊並且硬件較充足的條件下,合成速度較快;LPCNet, 是一種新提出的可使用CPU即可實現重建波形的vocoder,主要思想是,語音是線性信號和非線性信號的有機組合,而DSP(數字信號處理)技術足以勝任其中的線性信號運算,非線性信號的處理可以交給神經網絡學習得到,這種聲碼器速度得到了極大的提升,有望於應用於移動端。
聲學模型
語音合成一般需要進行前端處理,時長模型訓練,聲學模型訓練,最後輸出聲學參數。對於端到端的語音合成系統而言,一般將大部分前端、時長模型和聲學模型整合成了一個模型,直接建立輸入文本與輸出聲學參數之間的映射關係。
聲學參數的提取
語音合成的數據準備第一步,一般都是語音參數的提取。用於語音合成中的語音參數(聲學參數)一般有MEL譜, MFCC, F0(基頻), pitch, voice/unvoice, BAP(一種非週期型特徵?)等等。端到端的語音合成系統較多的使用MEL譜。
MEL 譜爲例
一般的提取過程爲:
- 語音信號預處理:預加重、分幀、加窗
- 對語音信號按幀使用短時傅里葉變換STFT, 得到短時幅度譜
- 生成MEL濾波器組,使用濾波器組對短時幅度譜濾波得到MEL譜
使用MEL譜訓練聲學模型
使用 <text, audio>對訓練聲學模型。對於漢語,text一般指的是帶聲調的拼音文本,audio一般指的是使用上述步驟得到的MEL譜。
聲碼器重建語音
MEL 譜爲例
- MEL譜轉換成幅度譜
- 幅度譜使用G&L算法重建波形
- 去加重
griffin-lim 算法
算法思想:
griffin-lim重建語音信號需要使用到幅度譜和相位譜。而MEL譜當中是不含相位信息的,因此griffin-lim在重建語音博形的 時候只有MEL譜可以利用,但是通過一些運算,我們可以利用幀與幀之間的關係估計出相位信息,從而重建語音波形。
這裏的MEL譜可以看做是實部,而相位信息可以看做是虛部,通過對實部和虛部的運算,得到最終的結果。
算法步驟:
- 隨機初始化一個相位譜
- 用這個相位譜與已知的幅度譜(來自MEL譜)經過ISTFT(逆傅里葉變換)合成新的語音波形
- 用合成語音做STFT, 得到新的幅度譜和新的相位譜
- 丟棄新的幅度譜,用已知幅度譜與新的相位譜合成新的語音
- 重複2,3,4多次,直至合成的語音達到滿意的效果或者迭代次數達到設定的上限
算法解釋:
- 創建一個複數矩陣,將已知的幅度譜作爲實層,用噪聲隨機初始化虛層。(至此, 已有振幅信息, 但是沒有相位信息)
- 對複數矩陣進行ISTFT。(至此,僅依靠幅度譜得到一個初步的時域信號)
- 對上一步得到的時域信號進行STFT,得到一個複數矩陣。(獲取小部分的,不準確的相位信息)
- 上一步得到的複數矩陣,是從一不準確的時域信號,得到了一個振幅與相位。用已知的振幅替換該矩陣的實部。(至此,有了已知振幅和初步準確的相位)
- 重複2,3,4
- 迭代至一個滿意的效果或者迭代次數到達指定的上限