2011年2月18日 星期五

HMM with HTK, HTS system - 仕偉

--------Synthesis Results-------

Star Variations

1. Song1
2. Song2
3. Song3
4. Song4
5. Song5
6. Song6
7. Song7
8. Song8
9. Song9
10.Song10

-------- 2011 . 2. 18之2---------

對於F0基頻設定,trace code結果後發現:

1. 445Hz要設定LOWERF0=200,UPPERF0=600,基頻的值才會正確被找到。(正確)

2. 如果設定LOWERF0=100,UPPERF0=500,基頻值會找到2百多Hz。(錯誤)

-------- 2011 . 2. 18 ------------

目前在training音檔時發現幾個問題:

1. 如果我們設定每個state要分成N個HMM model的話,那麼這個state的長度就要大於等於N*0.01(秒),最小的duration要設為N。

在HTS中每個state並不是只有一個HMM model去training,而是拆成N個HMM model,而N的大小可以設定。

之前training設的N值是5,也就是每個state長度至少要大於0.05(秒)。

我們可以設定N為3,所以在跑matlab程式時,設定state的最小長度至少要0.03(s),最好的長度是多少還要再實驗。

2. 在分state的演算法中,之前我有加入一個條件,就是找出頻率轉折點;實際跑時遇到一個例子,頻率是[ 444.75, 444.79, 444.81, 444.80, 444.78, 444.77],這段頻率人耳聽起來是沒有差異,但是依照演算法會被分成[ 444.75, 444.79, 444.81 ] , [ 444.81, 444.80, 444.78, 444.77 ]兩段,在training時應歸為同一類。此部分已修改完。

3. 再取F0部分用HTS範例的取F0程式會有問題,例如基頻是445Hz,在取F0時設定最低400Hz,最高500Hz的話會找不到基頻,猜想因為是語音所以設定的頻率較低,目前在trace code看他取基頻的程式是如何。

附上有做好的進度,紅色為未完成。
基頻目前是直接用讀程式的值,以後應該要人工修一下;還有產生state sequence的程式還沒寫好。



-------- 2010 . 12. 28 ----------

Speech Parameter Generation Algorithm
Considering Global Variance for
HMM-Based Speech Synthesis




-------- 2010 . 12. 9 ----------

我在網路上有找到已經有人用matlab來讀
htk的參數的例子,並且他也用自己的方法算出
MFCCs與htk的MFCCs作比較,如圖:



input是htk的MFCCs檔案跟原音的wave檔.

網址:http://labrosa.ee.columbia.edu/matlab/rastamat/mfccs.html


-------- 2010 . 12. 8 ----------

AN ALGORITHM FOR SPEECH PARAMETER
GENERATION FROM CONTINUOUS MIXTURE
HMMS WITH DYNAMIC FEATURES



-------- 2010 . 12. 2 ----------

上次音檔vibrato不像的原因是因為model分類沒分好,
也就是decision tree未建好.

正常來講,依前後state不同,同一state的model也應該要分類.
例如attack + vibrato_rise 跟 vibrato_fall + vibrato_rise,
兩個vibrato_rise應該要有不同的model,之前合成是只有一個model.

改進之後將上述情形分成不同的model,最後合成結果:

gen1
gen2,延長vibrato
gen3,用不同的vibrato state去合成

目前進度:用matlab將mfcc參數取出,之後要做clustering.

-------- 2010 . 11. 21 ----------

延續11月19日,新增合成音檔,
vitrato的rise和fall的state重複多遍, sample rate 44100Hz :

Synthesis D4 Vibrato2 44.1KHz

-------- 2010 . 11. 19 ----------

修改了sample rate為44100Hz,
training完後8000Hz以上頻率有找到,聽起來又更像了.

但比較有趣的是,同樣都用hts_engine但產生的音檔聽起來不一樣,應該是少打參數.

因為我得到合成的音檔有兩種方式:

1. 依照script,training完會自動執行hts_engine幫我產生音檔.

2. training完我手動將產生的model參數移到另一個資料夾,自己下指令用hts_engine合成音檔.
可能是我手動下指令少了什麼參數,所以跟自動產生的音檔不像,這點有待查明.

原音D4

1.Synthesis D4 sample rate 44.1KHz

2.可能少打參數 D4 sample rate 44.1KHz


-------- 2010 . 11. 11 ----------

問了奕欽學長關於training model時基頻有沒有限制範圍,
有!!他說有而且可以修改範圍,
找到data/Makefile內有兩行:
LOWERF0 = 110 # lower limit for f0 extraction (Hz)
UPPERF0 = 280 # upper limit for f0 extraction (Hz)
就是萃取f0時設的範圍.

所以之前音檔會有低頻雜音可能是因為
原本的聲音的基頻是300Hz,
造成程式在training時硬要是找110~280內的頻率當基頻,
所以才會有低頻的雜音.

先來實驗看看改範圍能不能解決這個問題!

//////////////////////////////////////

將範圍改成 200~500 Hz
LOWERF0 = 200 # lower limit for f0 extraction (Hz)
UPPERF0 = 500 # upper limit for f0 extraction (Hz)
雜音的問題就解決了.

//////////////////////////////////////

接著實驗vibrato :

原音D4 295Hz Vibrato

將同一音檔copy 10份去training, 並且合成 :

Synthesis D4 295Hz Vibrato1

又將vitrato的rise和fall的state重複多遍 :

Synthesis D4 295Hz Vibrato2

以上為目前結果.

-------- 2010 . 11. 08 ----------

這禮拜利用小聽給的java讀cue的程式,
寫了個GUI介面,並修改成HTK label檔的格式如下圖:

只要用程式開啟標完cue的wave檔,就可顯示cue內容,
按下save to label就可存成label檔.

此外程式也提供一般的txt格式,輸出單位為秒如下圖:

一樣只要按下save to txt就可存成txt檔.


這禮拜即利用此程式去標出上次合成出來有雜音問題的D4
(上次報告是說G1,去看頻譜才發現說錯了是D4才對),
合成出來仍有低頻的雜音參雜其中.

目前解決的辦法就是先去拆解hts_engine程式看它產生音檔的部分,
順便拆解流程.



-------- 2010 . 11. 02 ----------

Cepstral Analysis Synthesis on the Mel Frequency Scale



-------- 2010 . 10 . 25 ----------

經過修改與測試之後原來是question set的問題.
目前已有合出聲音,聽得出來像是小提琴的聲音.

下一步是用cool editor邊看頻譜邊標音,這樣可以標得比較準確,
並把其他不同的state也加入training.


-------- 2010 . 10 . 13 ----------

目前有成功產生音檔,但聽起來不像violin的聲音.

可能有問題的點是:
1. 在標音的時候就沒有標好.
2. question沒建好,問題太少.
3. state間的關係描述太少,例如語音中有分片語,短語,音節,重音等,會用這些關係建HMM model.但我在實驗中只用到音節的關係.

目前先嘗試:
用同一個音檔重複10次,然後去training,再合成出來,看出來的音是不是跟原來的一樣.


-------- 2010 . 10 . 3 -----------

6.
對HMM model作初始化用HInit和HRest,
trace code發現是指令下錯的關係.
先用HInit對要處理的phone的HMM model作uniformly segmented,
再來用HRest對同一個HMM model作Baum-Welch re-estimated.
如此反覆將所有的phone都執行上述兩個指令後,
HMM model的初始化完成.


7.
依HTK格式將所有初始化好的HMM model集合成同一個檔案:
inic.mac

8.
開始HMM training:
用HERest這個指令也是會跑Baum-Welch re-estimated,與HRest不同之處是HRest只對單一個utterence做處理,HERest在training過程則是處理全部的utterence,並統計每個utterence的means,variances等,用於完善HMM參數.
處理完得到每個phone訓練好的HMM model.

9.
有了HMM model接下來是合成部份,用的是另一個系統:HTS.
合成需要的參數要有decision tree, question set,這部份如何產生我還要再去研究and問學長,目前進度到此.


-------- 2010 . 9 . 30 ----------

1.
從小提琴的音檔分出C1,G1,D2,A2四個音,每個音準備的音檔數目如下:
C1 : 7個音檔 - 1-1.wav ~ 1-7.wav
G1 : 7個音檔 - 2-1.wav ~ 2-7.wav
D2 : 7個音檔 - 3-1.wav ~ 3-7.wav
A2 : 6個音檔 - 4-1.wav ~ 4-6.wav

2.
接下來取spectrum參數,先用語音預設的39維Mel-frequency cepstral coefficients.
由於HTK只吃16bit或8bit的wave format,因此先用cool editor將wave檔降碼.
取完可得*.fea檔案.

3.
接著是人工標音,使用HTK提供的工具,指令打"HSLab -F WAVE"才能讀入wave檔,
標音的畫面如下:



目前HMM state暫定為"音階_ADSR_status",
example: "c1_A"代表音色為c1,狀態是attack,其他命名以此類推.
將所有的音檔標示完會有相對應的*.lab檔.

4.
依HTK格式將所有lab檔案集合成1個*.mlf檔.

5.
產生HMM model的template,
指令"outMacro Plainhs DiagC 3 "1 1 1" MFCC_E_D_A "13 13 13" > template.hmm",
意思是每個model有三個state,每個state有三個stream,分別用1個、1個、1個mixture,每個stream各佔13維度。

6.
接著對HMM model作初始化用HInit和HRest,
目前這邊有錯誤,下HInit指令時會有
"ERROR [+2121] HInit: Too Few Observation Sequences [0]",
錯誤可能發生的原因有幾種:
1.樣本數太少.
2.HMM model template設的不對,無法跟*.fea檔相符.
3.取segment時人工切的frame間隔太小,導致取不到參數.

解決辦法:
問學長and直接trace code找error.

-------- 2010 . 8 . 12 ----------

執行HTS的demo檔案,網頁上有分兩種 :
Speaker dependent training demo : training 單獨一人的HMM model.
Speaker adaptation/adaptive training demo : training 不同人的HMM model; 例如要讓speaker A發出的語調要像speaker B, 或是speaker A發出的語調像speaker B+C+D.

每種語言又分兩種demo :
Normal demo : HTS 內建的方法取 spectral parameter.
STRAIGHT demo : 由另外一位學者自行改進的演算法取 spectral parameter.由於STRAIGHT demo的方法並沒有公開程式碼,需要的話要自行跟那位教授聯絡取得,因此一般都是執行Normal demo.

我跑的是Speaker dependent training demo : English : Normal,如圖紅框所示 :


跑完成約需要6~7個小時,會有HMM model的統計資料,包含f0,spectral等,之後就可以直接用這些資料透過hts_engine直接合成聲音.

目前已跑完取得統計資料,正在研究hts_engine如何使用.

參考網頁 : http://hts.sp.nitech.ac.jp/?Download

-------- 2010 . 8 . 3 ----------

HMM-based speech synthesis system(HTS)



介紹如何從音檔轉成參數再來合成語音.

-------- 2010 . 8 . 1 ----------
About HTS and HTK system.

HTK - Hidden Markov Model Toolkit
HTS - HMM-Based Speech Synthesis System

語音合成分為兩部份:training part 和 synthesis part
其中HTK就是負責training參數,HTS則是負責synthesis.

HTS內沒有加入text analyzer,如果要使用要另外下載,
Festival Speech Synthesis System就是個text analyzer.

HTS有內建hts_engine可以在不需要HTK library的情形下單獨執行,
可配合Festival或其他應用程式使用.

HTS是以patch檔的形式存在,安裝後會對HTK及HDecode作更新.
因此除了HTK外還需先裝好HDecode.

-------- 2010 . 7 . 8 ----------

viterbi algorithm

介紹如何將最小單位發音,切成我們指定的HMM state數目.


-------- 2010 . 7 . 7 ----------


接下來要做的就是去看合成的部分,

並將裡面取特徵參數的方法MFCC改為簡單的LPC,

再去合成看看看有沒有什麼問題。

下圖為HTK內建取特徵參數的方法,共有7種類型:



-------- ------------- ----------

13 則留言:

匿名 提到...

板大您好 小弟是今年將要進入該系的準大學生
偶然路過此地 雖然對該領域一概不知
卻沒想到資工也能和音樂作結合
恰巧音樂也是小弟的興趣
想請教學長您做的研究內容大概是什麼?
大一的課程有機會接觸到嗎?
謝謝

SCREAMLab 提到...

你可以先把程式學好,大約大三開始會有一些跟訊號相關的課程。專題有興趣的話可以做跟音樂相關的題目。

至於更深的東西,那要研究所了。

我會建議你看一下跟Audio與Music相關的串,但是不要被嚇住了,沒什麼,學了就會了。

喔!我是系上的蘇老師。

匿名 提到...

蘇老師您好
投影片提到 spectrum 和 excitation 分開建立 CART,但採用相同 Question Set,建的樹會不同嗎?

Wayne 提到...

hi 你好:建的樹會是一樣的,而且除了spectrum和excitation之外還有一樣叫做duration的tree.
採用相同的question set就是要找出同一個phoneme中對應的spectrum,excitation,duration的資訊,這些都是合成時會用到的參數.

ARWEN 提到...

9/30的問題解決了嗎?

可以找個時間來定一下States然後再找我討論嗎? 只用ADSR應該只是一時的。當然ADSR也是可以用的,但是例如把S增為S-up, S-down, S-soft, ....

Wayne 提到...

9/30的問題已解,目前步驟在建decision tree.
老師你說下禮拜再去找你,因為這禮拜比較忙!

SCREAMLab 提到...

哇!聽看起來結果很不錯,雖然最後音量爆了一點,不過夠棒了。

我woNDER 假如換成會滑音的吉他或古琴音會怎樣,請仕偉試一下。

另外一個問題是可以換成showmin的演算法嗎?

第三是我們可以在合成時改變一點聲音嗎?如改變一點點pitch, 音量,...等。

Wayne 提到...

1.可以換成其他聲音,我會再實驗.
2.換成showmin的演算法也可以做到只是需要時間.
3.合成時更改pitch,音量等,較類似於語音合成中adaption training of HMMs的技術,我會去找論文來看.
4.關於音檔中8KHz以上的頻率不見,可能是因為目前合成音檔的sample rate為16KHz,根據Nyquist Theorem所以只能取到8KHz以下.我會再更改sample rate並實驗看看,是否真的8KHz以下被濾掉.

87showmin 提到...

我聽起來跟觀察頻譜的感覺是:
1. 7_training_htsengine_44100.wav跟原音較像,7_htsengine.wav較不像。
2. 但7_training_htsengine_44100.wav的noise floor有點過低,原本語音的合成中會有一部份用來合成noise的不知道我們有沒有加進去。
3. vitrato的rise和fall的state重複多遍的例子,跟原音的表情有一點不太一樣,原音raise跟fall的速度其實不太一樣而且更快,我將你原音檔resampling成44.1khz後,觀察其某一段raise->fall的位置分別為18756-23025-26788,兩個區塊差約500 samples。
4. 7_2_44100.wav這個例子中,音量大小的變化好像有點大,雖然原音的vibrato中也是低音時能量略低,高音略高,相差約6-8dB,你的例子有12dB,是合成時你有故意給音量變化嗎?

SCREAMLab 提到...

我在猜,在非Attack的部分,也許noise被作掉了。因為noise不太容易被當成Feature Vector存下來,是嗎?

DNA也說vibrato不太自然,我想可能是振幅變化有點大,還有就是showmin說的。我想,要是根據上次說的,把state分細一點,是否會有助於我們對vibrato的控制呢?

SCREAMLab 提到...

你是說他的Matlab code是把HTK裡所產生的MFCC合成回Wav?
那麼HTS裡不是還有一堆前置作業來產生最後MLSA所需要的參數嗎?

Wayne 提到...

他寫的matlab code是可以從
1. htk格式讀出MFCCs
2. matlab讀wave檔產生MFCCs
但是並沒有提到合成的部分.

主要他是想強調
他用演算法算出的MFCCs跟
htk裡面方法產生的MFCCs
結果很相似.

小杜 提到...

請問一下~ 我剛碰HTK這套軟體~ 很多地方都不懂 我可以問你們嗎? 謝謝 !!

我是中興大學電機系學生 !!