2010年5月20日 星期四

語音合成與研究

1. 了解語音合成過程

目前語音合成
--用LPC model vocal tract
--程式中的model vocal tract部分希望改成sine

2. 如何用HMM輔助合成

showmin的合成
--音色庫先建好
--LPC+sine是用來Model Harmonics
--HMM只是來輔助合成的

3. 目標

了解語音合成的程式碼,
將showmin之LPC model sine的方法修改或套用至語音合成,
再用HMM輔助合成,並整合到authingtool.
希望能用CUDA加速.

2010年5月19日 星期三

HMM matlab example

=======產生hmm sequence========

1. 定義transition probability和 emis probability .



trans = [0.95,0.05 ;
0.10,0.90 ] ;



emis = [1/6 1/6 1/6 1/6 1/6 1/6;
1/10 1/10 1/10 1/10 1/10 1/2 ];

2. 用定義好的probability隨機產生一個sequence.

seq 存的是在第 i 步時的symbol,
states 存的是在第 i 步時所在的 state.

[seq,states] = hmmgenerate( 8,trans,emis);

result :



3. 可對symbols 及 states 另取名稱 .

[seq,states] = hmmgenerate( 8 ,trans,emis,...
'Symbols',{'one','two','three','four','five','six'},...
'Statenames',{'fair';'loaded'})

result :



==用已知的sequence, states反推出 trans 和 emis 機率==

1. 用此matlab指令

[estimateTR,estimateE] = hmmestimate(seq,states);

result :





=======pStates========

trans, emis, seq同上,輸入matlab指令.

PSTATES = hmmdecode(seq,TRANS,EMIS);

result :

Hidden Markov Models with matlab



PSTATES = hmmdecode( o_seq, TRANS, EMIS):給定observed sequence, 用來計算conditional probabilities在state k at step i .

TRANS( i, j )
:由 state i 至 state j 的轉換機率 .

EMIS( k, sym_seq ):symbol sequence 在 state k 發生的機率.

PSTATES:是個矩陣跟 seq 的大小一樣, 第 ( i, j )th element 代表在model中 state i at jth step 的機率 .

[ PSTATES, logpseq ] = hmmdecode(...):回傳對數的 probability sequence, logseq .

[ PSTATES, logpseq, FORWARD, BACKWARD,S ] = hmmdecode(...):給定 scaled s, 回傳 forward 和 backward 的 sequence 機率 .

hmmdecode( o_seq, TRANS, EMIS ,'Symbols', SYMBOLS):定義有哪些 SYMBOLS , SYMBOLS可為陣列 .

=========================================



[seq,states] = hmmgenerate(len,TRANS,EMIS):用已知的transition probability TRANS, 與 symbol probability EMIS 並指定欲產生 sequence 的長度, 來造出一個 observed sequence with states .

hmmgenerate(...,'Symbols',SYMBOLS):定義有哪些 SYMBOLS , SYMBOLS可為陣列 .

hmmgenerate(...,'Statenames',STATENAMES):定義 states 的名稱 .

=========================================



[TRANS,EMIS] = hmmestimate( seq, states ):給定 sequence 和 states 算出 TRANS, EMIS 的maximum likelihood estimate .

hmmestimate(...,'Symbols',SYMBOLS):定義有哪些 SYMBOLS , SYMBOLS可為陣列 .

hmmestimate(...,'Statenames',STATENAMES):定義 states 的名稱 .

hmmestimate(...,'Pseudoemissions',PSEUDOE):用此參數來避免state內無symbol的機率, PSEUDOE 是個矩陣 size m-by-n , m為states數目, n為該state可能產生的symbol數.
如果在sequence中state i at k step的機率為0, 可設 PSEUDOE( i, k ) 指定在 state i at k step的機率 .

hmmestimate(...,'Pseudotransitions',PSEUDOTR):用此參數來避免state與state間的0轉換機率, PSEUDOTR 是個矩陣 size m-by-m , m為states數目 .
如果在sequence中從state i 至 state k 的機率為0, 可設 PSEUDOTR( i, j ) 指定從state i 至 state k 的機率 .

=========================================



STATES = hmmviterbi(seq,TRANS,EMIS):給定model參數TRANS, EMIS 和 observed sequence, 計算 most likely path.

=========================================



[ESTTR,ESTEMIT] = hmmtrain(seq,TRGUESS,EMITGUESS):用Baum-Welch algorithm估計transition和state emission probabilities. TRGUESS, EMITGUESS為我們猜測的transition 和 symbol probabilities matrix.
註: state emission probability為一個state可能產生的output狀態, 即為一個state所擁有的symbol數.

hmmtrain(...,'Algorithm',algorithm):定義要用哪種演算法來training data. 有 BaumWelch 和 Viterbi 兩種, 預設是 BaumWelch .

hmmtrain(...,'Tolerance',tol):定義容忍度,預設值為0.0001, 用來在估計過程中測試收斂.

hmmtrain(...,'Maxiterations',maxiter):定義在estimation過程中最大可以 iterate 的數目, 預設為 100.

hmmtrain(...,'Verbose',true):回傳status of algorithm at each iteration.

如果已知states與sequences的關係, 就用hmmestimate去估計 model 的參數.