基於Merlin的英文語音合成實戰
Installation
Merlin不是一個完整的TTS系統,它只是提供了TTS核心的聲學建模模塊(聲學和語音特征歸一化,神經網絡聲學模型訓練和生成)。前端文本處理(frontend)和聲碼器(vocoder)需要其他軟件輔助。
Merlin uses the following dependencies:
- numpy, scipy
- matplotlib
- bandmat
- theano
- tensorflow (optional, required if you use tensorflow models)
- sklearn, keras, h5py (optional, required if you use keras models)
1.download Merlin
2.install輔助軟件
(frontend:festival,festvox,hts,htk;vocoder:WORLD,SPTK)
merlin封裝了相關安裝腳本,在merlin/tools
文件夾下
其中htk 需要注冊登陸后才可下載,建議在web端下載到本地[HTK,HDecode,HTS PATCH]三個文件,注釋掉compile_htk.sh
中Row 3-9,25-34
cd merlin/
bash tools/compile_tools.sh #SPTK, WORLD
bash tools/compile_other_speech_tools.sh #speech tools, festival and festvox
bash tools/compile_htk.sh #HTK
此處的小坑在HTK的安裝,順利安裝就繼續, else參考最后遇見的問題。
3.模型訓練軟件
merlin默認調用theano,也支持tensorflow和keras,NN工具的安裝不贅述。
運行merlin demo
sh merlin/egs/slt_arctic/s1/run_full_voice.sh
demo使用的是CMU ARCTIC數據庫中US English女性(slt_arctic_full_data.zip) 播音員的1132條文本和語音,包含了16kHzd waveform語音,全部的labeling由festvox或hts的labeling腳本完成。
由於Merlin沒有自帶frontend,所以demo中直接使用的事先經過frontend轉換的label文件作為輸入數據。通過腳本文件01_setup.sh
在當前文件夾下創建experiments
和experiments/slt_arctic_full
,將下載解壓后的數據分別放到以下目錄,分別用於duration model和acoustic model的訓練。
experiments/slt_arctic_full/duration_model
experiments/slt_arctic_full/acoustic_model
給出兩張圖,一張是merlin的tts流程圖,另外一張是source code的代碼流程。
source code中只展示了train model流程,synthesis與之相似,只是減少了幾個part。
cfg.NORMLAB: True
cfg.DNNGEN: True
cfg.GENWAV : True
synthesis只有一下三個cfg,在duration_step生成的結果送進acoustic_step,需要注意的一點是在cfg.NORMLAB時不去除靜音直接norm。
構建自己的demo
當只有txt和對應的wav時,需要自己生成alignment label,acoustic label,用於train model. 已經能夠跑通全部流程的work demo[https://github.com/zhanxiage1994/merlin_workdemo]。
對於英文語音合成,merlin需要首先通過duration模型確定音素的發音時間,然后根據聲學模型合成完整的語音。英文語音合成分成訓練和合成階段。
訓練階段:
1.文本分析---對應frontend
2.音頻特征參數---對應vocoder
3.HMM模型聚類---對應Question file
4.NN模型訓練---對應NN model
合成階段:
1.文本分析---對應frontend
2.NN解碼---對應NN模型訓練
3.語音合成---對應vocoder
前端frontend
語音合成前端(frontend)實際上是一個文本分析器,屬於 NLP(Natural Language Processing)的研究范疇,其目的是
- 對輸入文本在語言層、語法層、語義層的分析
- 將輸入的文本轉換成層次化的語音學表征
- 包括讀音、分詞、短語邊界、輕重讀等
- 上下文特征(context feature)
1.Label的分類
在Merlin中,Label有兩種類別,分別是
- state align(使用HTK來生成,以發音狀態為單位的label文件,一個音素由幾個發音狀態組成)
- phoneme align(使用Festvox來生成,以音素為單位的label文件)
2.txt to utt
Festival 使用了英文詞典,語言規范等文件,將txt轉換成包含了文本特征(如上下文,韻律等信息)的utt文件
3.utt to label
在獲得utt的基礎上,需要對每個音素的上下文信息,韻律信息進行更為細致的整理。label文件的格式請參見:lab_format.pdf
cd merlin/misc/scripts/alignment/state_align
./setup.sh
./run_aligner.sh
#your labels ready in: label_state_align
聲碼器Vocoder
Merlin中自帶的vocoder工具有以下三類:Straight,WORLD,WORLD_v2。
這三類工具可以在Merlin的文件目錄下找到,具體的路徑如下merlin/misc/scripts/vocoder。
聲碼特征:
1.MGC特征:通過語音提取的MFCC特征由於維度太高,並不適合直接放到網絡上進行訓練,所以就出現了MGC特征,將提取到的MFCC特征降維(在這三個聲碼器中MFCC都被統一將低到60維),以這60維度的數據進行訓練就形成了我們所說的MGC特征。
2.BAP特征: Band Aperiodicity的縮寫
3.LF0:LF0是語音的基頻特征
Straight
音頻文件通過Straight聲碼器產生的是:60維的MGC特征,25維的BAP特征,以及1維的LF0特征。
通過 STRAIGHT 合成器提取的譜參數具有獨特 特征(維數較高), 所以它不能直接用於 HTS 系統中, 需要使用 SPTK 工具將其特征參數降維, 轉換為 HTS 訓練中可用的 mgc(Mel-generalized cepstral)參數, 即, 就是由 STRAIGHT 頻譜計算得到 mgc 頻譜參數, 最后 利用原 STRAIGHT 合成器進行語音合成
World
音頻文件通過World聲碼器產生的是:60維的MGC特征,可變維度的BAP特征以及1維的LF0特征,對於16kHz采樣的音頻信號,BAP的維度為1,對於48kHz采樣的音頻信號,BAP的維度為5。
World_v 2
音頻文件通過World_v2聲碼器產生的是:60維的MGC特征,5維的BAP特征以及1維的LF0特征,現World_v2版本還處在一個測試的階段,存在着轉換過程不穩定這一類的問題。
cd merlin/misc/scripts/vocoder/world
bash extract_features_for_merlin.sh <path_to_merlin_dir> <path_to_wav_dir> <path_to_feat_dir> <sampling frequency>
訓練模型——Duration和聲學模型
語音合成和語音識別是一個相反的過程, 在語音 識別中, 給定的是一個 HMM 模型和觀測序列(也就是 特征參數, 是從輸入語音中提取得到), 要計算的是這 些觀測序列對應的最有可能的音節序列, 然后根據語 法信息得到識別的文本. 而在合成系統中, 給定的是 HMM 模型和音節序列(經過文本分析得到的結果), 要計算的是這些音節序列對應的觀測序列, 也就是特征參數.
HTS的訓練部分的作用就是由最初的原始語料庫經過處理和模型訓練后得到這些訓練語料的HMM模型。建模方式的選擇首先是狀態數的選擇,因為語音的時序特性,一個模型的狀態數量將影響每個狀態持續的長短,一般根據基元確定。音素或半音節的基元,一般采用5狀態的HMM;音節的基元一般采用10個狀態。在實際的建模中,為了模型的簡化,可以將HMM中的轉移矩陣用一個時長模型(dur)替代,構成半隱馬爾可夫模型HSMM hidden semi-Markov Model。用多空間概率分布對清濁音段進行聯合建模,可以取得很好的效果。HTS的合成部分相當於訓練部分的逆過程,作用在於由已經訓練完成的HMM在輸入文本的指導下生成參數,最終生成語音波形。具體的流程是:
通過一定的語法規則、語言學的規律得到合成所需的上下文信息,標注在合成label中。
待合成的label經過訓練部分得到的決策樹決策,得到語境最相近的葉結點HMM就是模型的決策。
由決策出來的模型解算出合成的基頻、頻譜參數。根據時長的模型得到各個狀態的幀數,由基頻、頻譜模型的均值和方差算出在相應狀態的持續時長幀數內的各維參數數值,結合動態特征,最終解算出合成參數。
由解算出的參數構建源-濾波器模型,合成語音。源的選取如上文所述:對於有基頻段,用基頻對應的單一頻率脈沖序列作為激勵;對於無基頻段,用高斯白噪聲作為激勵
遇見的問題
1.HTK安裝
致命錯誤:X11/Xlib.h:沒有那個文件或目錄
按照網上所說,是缺少Libx11-dev這個庫,安裝庫文件后重試shell腳本。
不成功的話會報
致命錯誤:X11/X.h 沒有那個文件或目錄
此時需要修改腳本代碼,compile_htk.sh的Row47
./configure --prefix=$PWD/build --without-x --disable-hslab;
禁止一些啟動。
2.alignment label生成
vim merlin/egs/slt_arctic/s1/merlin_synthesis.sh
./scripts/prepare_labels_from_txt.sh $global_config_file
這一步也會生成*.lab
文件,僅僅是對txt文件做了文本分析,沒有於waveform文件做alignment,因此是不能用於train model的輸入。
Reference
http://blog.csdn.net/lujian1989/article/category/6735359
http://www.speech.zone/exercises/
https://github.com/Jackiexiao/merlin/blob/93390c382d8033dd393b8d12bf35f1abcd089c7b/manual/merlin_statistical_parametric_speech_synthesis_chinese.md#merlin的安裝與運行
https://github.com/CSTR-Edinburgh/merlin
http://blog.csdn.net/u010157717/article/details/60189132
http://ssw9.net/papers/ssw9_PS2-13_Wu.pdf
http://blog.csdn.net/lujian1989/article/details/56008786
https://github.com/Jackiexiao/merlin/blob/master/manual/Create_your_own_label_Using_Festival.md