語音識別算法原理文檔整理(十)

Kaldi單音素腳本
從腳本run.sh來看,單音素訓練

#monophone

steps/train_mono.sh –boost-silence 1.25 –nj $n –cmd “$train_cmd” 
data/mfcc/train data/lang exp/mono || exit 1;

#test monophone model

local/thchs-30_decode.sh –mono true –nj $n “steps/decode.sh” exp/mono 
data/mfcc &

現在來看看train_mono.sh這個執行文件

# Begin configuration section.參數設定

nj=4 #並行工作數

cmd=run.pl #採用單機計算的模式

scale_opts=”–transition-scale=1.0 –acoustic-scale=0.1 –self-loop-scale=0.1”

num_iters=40 # 訓練迭代次數

max_iter_inc=30 # Last iter to increase #Gauss on.

totgauss=1000 # Target 
#Gaussians總高斯數(可能難理解,但可以這麼解釋:比如有3狀態HMM,每個狀態用4組均值方差描述(GMM混合數是4個意思),那總共用了12個高斯,kaldi裏不用具體指定GMM個數,而指定整個系統中總共需要多少個單高斯)

careful=false

boost_silence=1.0 # Factor by which to boost silence likelihoods in alignment

realign_iters=”1 2 3 4 5 6 7 8 9 10 12 14 16 18 20 23 26 29 32 35 38”; 
#循環到這個數的時候做對齊

config= # name of config file.

stage=-4

power=0.25 # exponent to determine number of gaussians from occurrence counts

norm_vars=false # deprecated, prefer –cmvn-opts “–norm-vars=false”

cmvn_opts= # can be used to add extra options to cmvn. #Cepstral Mean and 
Variance Normalization (CMVN) 倒譜均值和方差歸一化

# End configuration section.

echo “$0 $\@” # Print the command line for logging

#- - name value 參數處理

if [ -f path.sh ]; then . ./path.sh; fi

. parse_options.sh || exit 1;

#- -name 以外的參數必須有3個,否則報錯

if [ $# != 3 ]; then

echo “Usage: steps/train_mono.sh [options] \

Kaldi單音素函數
apply-cmvn
對feats.scp做歸一化處理 ,輸入3個文件: 
–utt2spk=ark:sdata/JOB/utt2spk語料,錄音人員關聯文件scp:sdata/JOB/cmvn.scp 
說話人相關的均值和方差 ,scp:$sdata/JOB/feats.scp 訓練用特徵文件 。

gmm-init-mono
參數:

–shared-phones=E:\project\kaldi\unbtu_ftp\gmm_init\sets.int 
–train-feats=ark,s,cs:E:\project\kaldi\unbtu_ftp\gmm_init\hujianhua_raw_mfcc.ark 
E:\project\kaldi\unbtu_ftp\gmm_init\topo 39 
E:\project\kaldi\unbtu_ftp\gmm_init\1.mdl 
E:\project\kaldi\unbtu_ftp\gmm_init\tree1

作用:是mm-init-mono 構造第一個模型文件和決策樹,用少量的數據初始化對應的模型。

輸入是mfcc特徵,topo,輸出mdl,tree文件。

topo放在目錄s5/data/lang,根據topo初始化tree與mdl,feats.scp文件存放mfcc的數路徑索引

sdata/JOB/utt2spk語料和錄音人員關聯文件

$sdata/JOB/text爲每句話的解釋。

faem0_sx222 sil y uw ao l w ix z cl k ax m ah cl p w ix th cl p ae th ax l aa 
vcl jh ix cl k el ix vcl g z ae m cl p el s sil

$lang/words.txt 存音素編號,根據腳本生成\~/kaldi/egs/yesno/s5/utils/sym2int.pl 
–map-oov $oov_sym -f 2- $lang/words.txt

hmm_state表示某個音素的狀態,pdf表示所有音素的狀態,其存儲位置。

mdl文件
寫topo_結構

triples_數據,表示每一個音素的的狀態

音素,對應音素的狀態,狀態位置

log_probs_ 31個值,表示所有的狀態轉移及其概率值。

am_gmm每個狀態建立gmm,存儲了mfcc特徵值產生的變量,對應於每個狀態,裏面有每個高斯函數對應的參數,包括期望,方差等。

tree文件
ContextDependency *ctx_dep中的內容寫出。

ContextDependency 1 0 ToPdf SE 0 [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 
120 121 122 123 124 125 126 127 128 129 130 131 ]

{ SE 0 [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 
55 56 57 58 59 60 61 62 63 64 65 66 67 ]

{ SE 0 [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
28 29 30 31 32 33 34 35 ]

{ SE 0 [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ]

{ SE 0 [ 1 2 3 4 5 6 7 8 9 10 ]

{ SE 0 [ 1 2 3 4 5 ]

{ TE -1 5 ( CE 0 CE 1 CE 2 CE 3 CE 4 )

TE -1 5 ( CE 5 CE 6 CE 7 CE 8 CE 9 )

}

SE 0 [ 11 12 13 14 15 ]

{ TE -1 5 ( CE 10 CE 11 CE 12 CE 13 CE 14 )

TE -1 3 ( CE 15 CE 16 CE 17 )

}

}

SE 0 [ 20 21 22 23 24 25 26 27 ]

{ SE 0 [ 20 21 22 23 ]

{ TE -1 3 ( CE 18 CE 19 CE 20 )

TE -1 3 ( CE 21 CE 22 CE 23 )

}

有兩種情況,一種是直接接葉子節點的: 
phone=? 
SIL SIL_B SIL_E SIL_I SIL_S (條件) NO(條件) 
PdfClass=? PdfClass=? 
0,1,2,3,4(條件) 0,1,2,3,4(條件) 
s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 
對應的文件格式是: 
SE 0 [ 1 2 3 4 5 ] #條件,如果phone=[SIL SIL_B SIL_E SIL_I SIL_S ] 
{ TE -1 5 ( CE 0 CE 1 CE 2 CE 3 CE 4 ) #Yes 
TE -1 5 ( CE 5 CE 6 CE 7 CE 8 CE 9 ) # No 

其中SE表示條件吧, 
TE表示葉子結點的條件吧, -1不知道啥意思,5表示該音素有5個狀態(pdf-class) 
CE表示葉子節點的值

SE 0 [ 28 29 30 31 ]

{ TE -1 3 ( CE 24 CE 25 CE 26 )

TE -1 3 ( CE 27 CE 28 CE 29 )

}

}

sets.int表示共享的音素

compile-train-graphs
參數:

–read-disambig-syms=E:\project\kaldi\unbtu_ftp\graphs\disambig.int 
E:\project\kaldi\unbtu_ftp\graphs\tree 
E:\project\kaldi\unbtu_ftp\graphs\1.mdl 
E:\project\kaldi\unbtu_ftp\graphs\L.fst 
ark:E:\project\kaldi\unbtu_ftp\graphs\train.tra 
ark:E:\project\kaldi\unbtu_ftp\graphs\graphs.fsts

作用:在嵌入式訓練裏有說到爲每個訓練的句子建立一個完整的hmm結構。

輸入 :決策樹tree,模型1.mdl,lexsionFST, text轉ID(train.tra)這些文件,輸出 
:構造訓練用一句話對應的FST :graphs.fsts。

train.tra
transcript_reader “ark:sym2int.pl –map-oov $oov_sym -f 2- $lang/words.txt \< 
$sdata/JOB/text|” \ 的作用是生成train.tra文件,其中內容:0_0_0_0_1_1_1_1 2 2 
2 2 3 3 3 3 主要是把每句話用音素編號對應起來。2表示yes音素,3表示no

語音文件與音素對應

0_0_0_1_0_0_0_1 2 2 2 3 2 2 2 3

0_0_0_1_0_1_1_0 2 2 2 3 2 3 3 2

其中2 表示yes, 3表示no

$lang/words.txt表示音素編號:

\

L.fst 文件
L.fst是字典對於的fst表示,作用是將一串的音素(phones)轉換成單詞(words)

cur_state arc.nextstate  arc.ilabel  arc.olabel

0 1 0 0

0 1 1 0

1 1 1 1

1 1 3 2

1 2 3 2

1 1 2 3

1 2 2 3

2 2 1 0

graphs.tra文件
通過 key(句子) 
就能找到這個句子的fst網絡,value中保存的是句子中每兩個音素之間互聯的邊(Arc),例如句子轉換成音素後,標註爲:”a 
b c d e f”,那麼value中保存的其實是 a->b b->c c->d d->e e->f 
這些連接(kaldi會爲每種連接賦予一個唯一的id),後面進行 HMM 
訓練的時候是根據這些連接的id進行計數,就可以得到轉移概率。

MakeLinearAcceptor(transcripts[i], 
word_fst);主要是一句話的fst,是由每個音素組成狀態組成。

根據8個單素2 2 2 2 3 3 3 3中每一個,例如2生成下面的結構。

然後丟到下面的word_fst結果中,但是是丟到cur_state中。也即把一句話(8個音素)組成一個fst結構。ofst->AddArc(cur_state, 
arc);

最後把共31句話放到word_fsts隊列中。word_fsts[i] = word_fst;

例由8個狀態(音素組成)2 2 2 2 3 3 3 3

然後加入單素狀態以及ctx狀態,同時記錄了狀態變化(音素是由狀態組成)

TableCompose(*lex_fst_, *(word_fsts[i]), &phone2word_fst, \&lex_cache_);

ComposeContextFst(*cfst, phone2word_fst, \&ctx2word_fst);

每句話生成一個

Word_fst = 
9 添加了狀態0\~8,這樣有9個狀態,然後0-7放下面的值,把輸入音素賦給ilabel,olabel

在8狀態ofst->SetFinal(cur_state, Weight::One());

生成的狀態個數ctx2word_fst = 18

生成的狀態個數trans2word_fst = 70 

對於state爲0,有2,3,4, 26,然後跑到下狀態,一共70個狀態,每一個都有一個next_state

每一個state都可能有幾個num_arcs,例如如下表:num_arcs = 4

size_t num_arcs = ifst.NumArcs(s)

0_0_0_0_1_1_1_1

0 70 2 0 0.693359

0 71 3 0 0.693359

0 72 4 0 0.693359

0 4 26 2 0.693359

執行完自循環後AddSelfLoops裏面有一個函數MakePrecedingInputSymbolsSameClass增加了108個狀態。

轉移狀態trans2word_fst = 178 這裏面存在是TransitionId,在這裏還可能轉成state

Yesno包括31個文件,因此其大小爲31

寫出key:表示文件名

得到是一句話的狀態例如66個狀態。這裏還沒有做對齊。

AddSelfLoops(trans_model_,

disambig,

opts_.self_loop_scale,

opts_.reorder,

\&trans2word_fst);

Yesno包括31個文件,每次寫一個文件及對應的178個狀態。每個狀態都可能有幾種選擇,如下所示:

fst_writer.Write(keys[i], *(fsts[i]));

0_0_0_0_1_1_1_1

arc .s arc.nextstate arc.ilabel arc.olabel

0 70 2 0 0.693359

0 71 3 0 0.693359

0 72 4 0 0.693359

0 4 26 2 0.693359

S表示當前狀態,nextstate表示跳轉到下一狀態。

這裏的arc.ilabel表示轉換id, arc.olabel表示音素。

align-equal-compiled
參數:

ark:E:\project\kaldi\unbtu_ftp\align-equal-compiled\graphs.fsts 
ark:E:\project\kaldi\unbtu_ftp\align-equal-compiled\hujianhua_raw_mfcc.ark 
ark,t:E:\project\kaldi\unbtu_ftp\align-equal-compiled\equal.ali

作用:主要是根據生成一句話的fst結構,然後根據結構與mfcc特徵值做對齊。輸入一句話的fst結構,輸出對齊的fst結構。訓練時需要將標註跟每一幀特徵進行對齊。這裏採用簡單對齊操作。

std::string key = fst_reader.Key(); 從fst文件中獲得被形文件名

再根據key到mfcc 文件中hujianhua_raw_mfcc.ark讀取mfcc特徵,如下圖

因爲在轉移狀態,有可能是循環或者轉移到下一個狀態兩個種情況。對於靜態轉移可能更多轉移情況。因此通過音素得到路徑可能有不同的路徑,那麼這裏隨機出來一條路徑。例:

原始的state = 0,然後得到當前的num_arcs = 
4。然後隨機一個值出來。例如arc_offset = 3

取得狀態state = 0的arc_offset = 3的const Arc &arc = aiter.Value();

其對應arc.nextstate = 4,如下:

0 4 26 2 0.693359

path.push_back(arc.nextstate);

再一次再循環state = arc.nextstate,取4處的值,再隨機一個值,arc_offset = 
1,取得結果

4 5 28 0

直到結束。

if (arc.ilabel != 0) num_ilabels++; 這裏的arc.ilabel表示轉換id, 
arc.olabel表示音素。這裏

根據fst狀態網絡求得num_ilabels標籤數爲66,實際mfcc幀數爲633幀

計算出num_self_loops也爲66

需要的自循環個數num_extra= 633-66=567

min_num_loops = num_extra / num_self_loops=(633-66)/66 = 8

那麼如果遇到是loops狀態時,那麼會插入8個狀態,最終把66個狀態擴展到633個狀態。

生成文件equal.ali例:

0_0_0_0_1_1_1_1 26 25 25 25 25 25 25 25 25 25 28 27 27 27 27 27 27 27 27 27 30 
29 29 29 29 29 29 29 29 29 3……

26表示轉移狀態,這裏一共有31個轉移狀態。連續的25表示在當前狀態進行自循環。

26通過pdf_id = trans_model.TransitionIdToPdf(tid); 可以查詢pdf_id=8

gmm-align-compiled
參數:

E:\project\kaldi\unbtu_ftp\gmm-align-compiled\1.mdl 
ark:E:\project\kaldi\unbtu_ftp\gmm-align-compiled\graphs.fsts 
ark:E:\project\kaldi\unbtu_ftp\gmm-align-compiled\hujianhua_raw_mfcc.ark 
ark,t:E:\project\kaldi\unbtu_ftp\gmm-align-compiled\equal.ali

作用:通過viterbit算法進行對齊。通過當前的模型的計算出最好的一條路徑(每幀計算一次)。這樣就得到當前的所有幀的一條對齊的路徑。

gmm-acc-stats-ali
參數:

–binary=true E:\project\kaldi\unbtu_ftp\gmm-acc-stats-ali\1.mdl 
ark:E:\project\kaldi\unbtu_ftp\gmm-acc-stats-ali\hujianhua_raw_mfcc.ark 
ark:E:\project\kaldi\unbtu_ftp\gmm-acc-stats-ali\equal.ali 
E:\project\kaldi\unbtu_ftp\gmm-acc-stats-ali\1.acc

作用:對對齊後的數據進行訓練,獲得中間統計量,每個任務輸出到一個acc文件。

輸入是當前的模型,特徵值,對齊特徵值的狀態數據,輸出HMM 和GMM 訓練相關的統計量。

acc中記錄輸出文件由兩部分組成:HMM 和GMM 訓練相關的統計量:

HMM 相關的統計量:根據對齊的網絡(equal.ali)進行統計輸出,

transition_accs 
對於轉移概率的統計,每出現對應的轉移狀態trans_id加1,最終寫31個轉移概率的數目。

GMM 相關的統計量:每個pdf-id 對應的特徵累計值和特徵平方累計值。

對於每一幀,都會有個對齊後的標註,可以得到對應的pdf-id。

每個pdf-id 
對應的GMM可能由多個單高斯Component組成,會先計算在每個單高斯Component對應的分佈下這一幀特徵的似然概率(log-likes),稱爲posterior。

對於gmm的mfcc統計是通過當前mfcc數據data(39 
維),去對應的gmm查詢得到log_like相似度。如果高斯函有兩個AB,分別計算AB,那麼出來的log_like是二維的。所有參數輸入也是二維的。

由tid得到pdf-id,也就是找到對應該pdf-id的DiagGmm對象,更新與該DiagGmm對象相關的AccumDiagGmm的參數,也就是計算得到三個GMM參數更新公式的分子部分(包括每一混合分量的後驗(occupancy_中保存∑njγ\^jk)、每一分量的後驗乘以當前幀的特徵(mean_accumulator_中保存∑njγ\^jkyj 
MxD維)、每一分量的後驗乘以 
當前幀的特徵每一維的平方(variance_accumulator_中保存∑njγ\^jky2j MxD MxD維))

然後:

(1)把每個單高斯Component的posterior加到每個高斯Component的occupancy(佔有率)計數器上,用於表徵特徵對於高斯的貢獻度,如果特徵一直落在某個高斯的分佈區間內,那對應的這個值就比較大;相反,如果一直落在區間外,則表示該高斯作用不大。

gmm-est中可以設置一個閾值,如果某個高斯的這個值低於閾值,則不更新其對應的高斯。

另外這個值(向量)其實跟後面GMM更新時候的高斯權重weight的計算相關。

(2)把這一幀數據乘以每個單高斯Component的posterior再加到每個高斯的均值累計值上;這個值(向量)跟後面GMM的均值更新相關。

(3)把這一幀數據的平方值乘以posterior再加到每個單高斯Component的平方累計值上;

這個值(向量)跟後面GMM的方差更新相關。

最後將均值累計值和平方累計值寫入到文件中。輸出11個狀態(高斯函數)的對應的均值與方差。

DiagGmm
保存一個GMM的參數,包括分量權值weights_、均值、方差、每一分量高斯分佈裏的常量部分取log後的數值gconsts_。注意均值和方差爲了方便計算,保存的並不是原原本本的均值、方差,而是方差每一元素求倒數後的inv_vars_、均值乘以inv_vars_後的means_invvars_。

gmm-sum-accs
這個用來合併acc文件。

gmm-est
gmm-est –min-gaussian-occupancy=3 –mix-up=$numgauss –power=$power \

$dir/0.mdl “gmm-sum-accs - $dir/0.*.acc|” $dir/1.mdl 2> 
$dir/log/update.0.log || exit 1;

作用:根據前面計算的數據,得到新的gmm與hmm參數。

參數:

E:\project\kaldi\unbtu_ftp\gmm_est\1.mdl 
E:\project\kaldi\unbtu_ftp\gmm_est\1.acc 
E:\project\kaldi\unbtu_ftp\gmm_est\2.mdl

means_ 對應acc裏的mean_accumulator/occ 
其中occ表示幀數 這裏2286,這裏表示均值。

vars_ 對應acc裏的variance_accumulator/occ - means_的平方即方差

一共有11個pdf狀態。那每一個狀態都有轉移狀態,轉移狀態有31個。

對應一個pdf轉移狀態每個的新的概率new_probs(tidx) = transition_accs (tidx) / 
tstate_tot; 轉移狀態的統計數/當前狀態轉移到所有可能狀態總數。來自於accs

gmm-latgen-faster
解碼

steps/decode.sh –nj 1 –cmd “$decode_cmd” \

exp/mono0a/graph_tgpr data/test_yesno exp/mono0a/decode_test_yesno

參數:

–max-active=7000 –beam=13.0 –lattice-beam=6.0 –acoustic-scale=0.083333 
–allow-partial=true 
–word-symbol-table=E:\project\kaldi\unbtu_ftp\gmm-latgen-faster\words.txt 
E:\project\kaldi\unbtu_ftp\gmm-latgen-faster\final.mdl 
E:\project\kaldi\unbtu_ftp\gmm-latgen-faster\HCLG.fst 
ark,s,cs:E:\project\kaldi\unbtu_ftp\gmm-latgen-faster\feat-cmvn_delta.ark 
ark:lat.ark ark:w.ark ark:a.ark

–max-active=7000 –beam=13.0 –lattice-beam=6.0 –acoustic-scale=0.083333 
–allow-partial=true 
–word-symbol-table=E:\project\kaldi\unbtu_ftp\gmm-latgen-faster\liming\words.txt 
E:\project\kaldi\unbtu_ftp\gmm-latgen-faster\liming\final.mdl 
E:\project\kaldi\unbtu_ftp\gmm-latgen-faster\liming\HCLG.fst 
ark,s,cs:E:\project\kaldi\unbtu_ftp\gmm-latgen-faster\liming\feat-cmvn_delta.ark 
ark:E:\project\kaldi\unbtu_ftp\gmm-latgen-faster\liming\latgen.ark

輸入:目錄graph下面的words.txt標籤,final.mdl模型,HCLG.fst,以及特徵值。

輸出結果:latgen.ark

final.mdl模型包括以下:

trans_model

HCLG.fst
根據HCLG.fst 生成LatticeFasterDecoder解碼器。

構圖過程 G -> L -> C -> H

1.G: 作爲 acceptor (輸入 symbol 與輸出相同),用於對grammar 或者 language 
model 進行編碼

L:Lexicon, 其輸出 symbol 是 words, 輸入 symbol 是 phones
3.C:context-dependency 其輸出 symbol 是 phones, 其輸入 symbol 
爲表示context-dependency phones

如: vector\

三音素訓練
steps/decode.sh

決策樹
爲什麼需要決策樹
我們進行語音識別模型訓練的過程中,首先進行的是單音素、單個高斯的模型訓練。拋開單個高斯不說,單音素模型本身有很大缺點:沒有考慮到本音素前後音素的發音對本音素的影響。比如,同樣是一個音素iy,如果它前面的音素分別是h和p,那麼iy這個音素在這兩種情況下的發音會有所不同,那麼模型參數也就會受到其影響,此時,如果用同一個模型來描述音素iy,那麼就會不合理。

爲了解決這個問題,採用三音素(triphones)模型,典型的三音素模型如下 
[t-iy+n],這表示iy音素前一個音素是t,後一個因素是n,模型[t-iy+n] 
用來表示這種情況下的音素iy模型,那麼此時,這個三音素模型和 [t-iy+ng] 
不再表示同一個模型了,雖然他們都是表示音素 
iy的模型,但是因爲中心音素(此處爲iy)的上下文音素不同了,所以此時它們其實是兩個不同的模型。

如此以來,模型的數量會劇增。單因素模型時,假如我們只有40個音素需要建模,每個音素有3個HMM狀態。但是在三因素模型中,最壞的情況是需要給40×40×40 
個模型進行建模,當然這其中有很多是不可能或者不會在訓練數據中出現的。但是相對於單音素模型來說,這個數目已經增加了很多倍,這就導致了一個問題:訓練數據不足!那麼如何解決因爲模型數量增加而導致訓練數據不足的問題呢?HTK使用了模型狀態綁定的方法。所謂的模型狀態綁定,就是讓一些具有某些相似特徵的模型的一些狀態來共享一組模型參數,這樣就能夠有效的減少模型參數的數量從而解決訓練數據不足的問題。

如何使用決策樹進行模型的狀態綁定
在進行狀態綁定時,我們首先要做的就是使用決策樹進行聚類。具有相同類別的模型,他們的某一個狀態可以共享一組參數。例如:對於音素iy,如果它的前一個音素分別是m和n,由於m和n發音比較像,所以模型[m-iy+*]和[n-iy+*]的第一個狀態的參數就應該比較相似,那麼我們就把這兩個模型的第一個狀態的參數進行綁定,也就是說這兩個模型的第一個狀態參數是相同的。那麼到底如何確定那些模型的哪些狀態可以共用一組參數也就是可以進行綁定參數?這就用到了決策樹進行聚類,具有相同類別的狀態就可以共用一組參數。

在這裏,一定要注意,我們在建立決策樹時,是對每個音素的每個狀態都建立一個決策樹,而不是隻對某一個音素來建立。這裏,我們以音素ih的首狀態爲例,詳細說明決策樹的建立過程。

在上圖中的每一個類中,A、B……E,每一個類中的第一個狀態都被綁定在一起,如此進行,把所有的音素的所有狀態都進行決策樹的建立,就能完成參數的綁定。

決策樹中的問題集 
在上圖中,我們看到一些問題集,類似與“左邊是清音嗎?”等等,這些問題集都是根據聲學和語音學特徵提出來的

特徵使用LDA和MLLT進行變換
steps/decode.sh

說話人自適應訓練(sat)
steps/decode_fmllr.sh

語音識別深度學習
1.標註對齊:訓練CNN模型需要對每一幀進行標註,由於數據中僅對某段時間內的數據內容進行標註,因此我們需要用一個前面已經通過run.sh訓練過的HMM-GMM模型進行數據對齊。DNN使用gmm-hmm的結果,對DNN的影響很大。一個壞gmm-hmm會給你壞的對齊。使用差的gmm-hmm的結果,會嚴重影響你的訓練效果。 
2. 
數據準備:從網絡上看到的是由7幀(從中間幀到左右幀都是3幀)組成的一個幀窗。由於神經網絡很難從相關輸入的數據中學習,因此以 
40*7 維特徵作爲一個不相關的固定變換形式,通過 step/nnet2/get_lda.sh 
完成該工作,實際中並非使用準確的 LDA,而是用 non-dimension-reducing 形式的 
LDA,然後減少輸出特徵方差的維度。

3. 
CNN模型訓練:應用kaldi提供的核心訓練代碼,向訓練腳本中傳遞相關的訓練參數:網絡的結構,learning 
rate,運行環境,任務數等。下文將會展開腳本對各個參數進行解析。

CNN模型測試:對訓練所得的模型進行測試,與HMM-GMM模型,DNN模型進行比較。

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

原文:https://blog.csdn.net/bvngh3247/article/details/81026856 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章