Timit 腳本理解

數據準備 

local/timit_data_prep.sh



生成的內容放在data/local/data中。
對於train、test和dev,分別生成相應的_sph.flist、_sph.scp、.uttids、.trans、.text、_wav.scp、.utt2spk、.spk2utt、.spk2gender、.stm和.glm文件。
NOTE:
.wav files are not really .wav, they are .sph. Use tools/sph2pipe_v2.5/sph2pipe to convert.




一大堆檢查

檢查參數數目是否正確

檢查sph2pipe程序是否可用
檢查conf/test_spk.list和conf/dev_spk.list是否存在
檢查train和test目錄是否存在
檢查目錄名是大寫的還是小寫的(TRAIN或者train) 




創建臨時文件

用trap命令設置收到EXIT信號時刪除臨時文件

轉換大小寫,將dev_spk.list和test_spk.list分別寫到\$tmpdir/dev_spk和\$tmpdir/test_spk中,用ls和sed生成$tmpdir/train_spk,也就是訓練集中的說話人名字列表

在目錄data/local/data下,未註明路徑的文件都是生成在該路徑下





for x in train dev test; do

生成與x相關的.WAV路徑列表,放在${x}_sph.flist中

根據\${x}_sph.flist中的人名和句子名,生成utt-id(人名_句子名),放在\$tmpdir/\${x}_sph.uttids中

將.uttids和_sph.flist中的同一行粘在一起,根據第一列的uttids進行排序後放在${x}_sph.scp中,每一行的格式爲:utt-id 對應的.WAV路徑

根據\${x}_sph.scp的第一列生成${x}.uttids

生成與x相關的.PHN路徑列表,放在\$tmpdir/\${x}_phn.flist中(.PHN文件中存放的是音素抄本)

根據_phn.flist中的人名和句子名,生成utt-id(人名_句子名),放在\$tmpdir/\${x}_phn.uttids中

將存放在.PHN文件中的抄本轉換爲kaldi使用的格式保存在\$tmpdir/\${x}_phn.trans中(.PHN中,一個音素一行,將這些音素放在一行)

將.uttids和.trans中的同一行粘在一起,根據第一列的uttids進行排序後放在${x}.trans中,每一行的格式爲:utt-id 對應的抄本

調用local/timit_norm_trans.pl對\${x}.trans進行normalization,將h#替換成sil,生成$x.text

創建${x}_wav.scp,每一行的格式爲:utt-id extendedfilename

生成$x.utt2spk,調用utils/utt2spk_to_spk2utt.pl生成$x.spk2utt

生成性別映射$x.spk2gender

爲sclite準備stm文件:調用程序wav-to-duration生成${x}_dur.ark,用awk生成stm文件

創建假glm文件


local/timit_prepare_dict.sh

生成的文件放在data/local/dict、data/local/lm_tmp和data/local/nist_lm中。




(1)準備字典


以下數據的默認路徑是data/local/dict

將sil寫到silence_phones.txt和optional_silence.txt中

根據train.text生成phones.txt

根據phones.txt生成lexicon.txt(將phones.txt的一列複製成兩列)

根據silence_phones.txt和phones.txt生成nonsilence_phones.txt


根據silence_phones.txt和nonsilence_phones.txt生成extra_questions.txt





(2)創建音素bigram LM




給data/train.text的每一句抄本句首加<s>,句尾加</s>,放在data/lm_train.text中

調用irstlm/bin/build-lm.sh生成音素語言模型,即lm_tmp/lm_phone_bg.ilm.gz

調用irstlm/bin/compile-lm對上一步生成的LM進行處理,輸出爲nist_lm/lm_phone_bg.arpa.gz

utils/prepare_lang.sh

生成的文件放在data/lang和data/local/lang_tmp中,需要用到data/local/dict中的文件。
針對timit run.sh中的參數而言,部分if分支的解釋略去。

tmpdir=data/local/lang_tmp

調用utils/validate_dict_dir.pl檢驗data/local/dict下的除phones.txt外的所有文件

如果沒有dict/lexiconp.txt,根據dict/lexicon.txt生成之,其格式爲:音素 1.0 音素。

經過幾個if,將dict/lexiconp.txt複製到$tmpdir/lexiconp.txt

根據dict下的silence_phones.txt和nonsilence_phones.txt生成$tmpdir/phones,將此phones的一列複製成兩列生成$tmpdir/phone_map.txt

調用utils/apply_map.pl生成lang/phones/sets.txt

根據sets.txt生成lang/phones/roots.txt,其中每一行的開頭爲shared split

根據dict中的silence_phones.txt、nonsilence_phones.txt、optional_silence.txt生成lang/phones下的silence.txt、nonsilence.txt、optional_silence.txt

根據lang/phones下的silence.txt生成lang/phones/context_indep.txt

根據dict中的extra_questions.txt生成lang/phones/extra_questions.txt

生成$tmpdir/lexiconp_disambig.txt

生成$tmpdir/lex_ndisambig

根據整數變量ndisambig(此處爲1)的大小,生成phones/disambig.txt

生成音素符號表lang/phones.txt。將<eps>和phones/{silence,non_silence,disambig}.txt合在一起生成phones.txt,每一行的格式爲:音素 編號。

生成phones/word_boundary.txt,本參數下不生成該文件

創建單詞符號表lang/words.txt,根據$tmpdir/lexiconp.txt生成之,每一行的格式爲:音素 編號。附加有<eps>、#0、<s>和</s>

將\$tmpdir/lexiconp.txt的第一列第三列提取出來生成$tmpdir/align_lexicon.txt;並將<eps> sil補加到\$tmpdir/align_lexicon.txt

根據\$tmpdir/align_lexicon.txt生成phones/align_lexicon.txt

根據align_lexicon.txt、phones.txt和words.txt生成phones/lexicon.int

調用utils/make_lexicon_fst.pl生成lang/L.fst

生成lang/oov.txt和lang/oov.int,int映射是根據words.txt生成的

將#0寫到phones/wdisambig.txt中,根據phones.txt將wdisambig.txt映射爲phones/wdisambig_phone.int,根據words.txt將wdisambig.txt映射爲phones/wdisambig_words.int

根據phones.txt的映射,生成silence、nonsilence、optional_silence、disambig和context_indep的int和csl版本,生成sets和extra_question的int版本,生成roots的int版本

調用utils/gen_topo.pl,根據silence.csl和nonsilence.csl生成lang/topo

調用utils/make_lexicon_fst.pl生成lang/L_disambig.fst




驗證lang整個目錄下的文件



local/timit_format_data.sh

準備train、dev和test數據。創建data下創建train、dev和test目錄,將data/local/data中的相應數據分別複製到data目錄下相應的目錄中

爲測試準備語言模型。創建data/lang_test_bg目錄,將data/lang下的所有文件複製到該目錄。根據data/local/nist_lm下的音素二元語言模型lm_phone_bg.arpa.gz生成G.fst

驗證lang_test_bg下文件,刪除data/local/lm_tmp目錄




特徵提取



對data下的train、dev和test數據分別調用下面兩個腳本


steps/make_mfcc.sh


特徵存在feats.scp中,存儲的特徵是每一幀13維,當用到mfcc特徵的時候才計算deltas和deltas-deltas,轉爲39維。
腳本主要爲下面幾行


  $cmd JOB=1:$nj $logdir/make_mfcc_${name}.JOB.log \
    compute-mfcc-feats  $vtln_opts --verbose=2 --config=$mfcc_config \
     scp,p:$logdir/wav_${name}.JOB.scp ark:- \| \
      copy-feats --compress=$compress ark:- \
      ark,scp:$mfccdir/raw_mfcc_$name.JOB.ark,$mfccdir/raw_mfcc_$name.JOB.scp \

      || exit 1;


其中\$cmd爲run.pl
以data/train爲例
檢查。檢查一些文件是否存在等
根據變量\$nj的大小,將data/train/wav.scp平分爲\$nj份
調用run.pl,提取特徵。一個JOB處理一份wav.scp,共\$nj個JOB。用到程序compute-mfcc-feats和copy-feats,生成mfcc/raw_mfcc_train.JOB.ark和對應的mfcc/raw_mfcc_train.JOB.scp文件,JOB爲1到\$nj的數字。
將\$nj個mfcc/raw_mfcc_train.JOB.scp文件合成一個data/train/feats.scp文件
檢查。檢查是否正確提取所有文件
steps/compute_cmvn_stats.sh


對每個說話人計算cmvn(cepstral mean and variance normalization)。
對每個說話人,對每一維(共13維)分別計算count/sum/sum-squared三組statistics,分別爲1維、13維、13維。count代表該說話人所有音頻文件的總幀數,sum代表所有幀裏每一維的和,sum-square代表所有幀裏每一維的平方的和。然後根據這三組statistics,計算均值和方差。
可用copy-matrixs程序查看cmvn.scp或cmvn.ark文件,對每一個說話人,有一個28維的矩陣,前十三維是sum,然後是count,接着十三維是sum-squared,最後一個0。
該腳本有三個選項:--fake、--two-channel、--fake-dims
調用compute-cmvn-stats生成mfcc/cmvn_train.ark和mfcc/cmvn_train.scp,然後將後者複製到data/train/cmvn.scp
單因素訓練和解碼


steps/train_mono.sh


主要輸出爲:final.mdl和tree
創建sdatadata/train/split$nj(\$nj爲作業數,此處爲30),將data/train分爲$nj份
57   調用程序apply-cmvn和add-deltas生成39維特徵(原始的mfcc只有13維)
65-75   run.pl調用程序gmm-init-mono初始化單音素模型,在exp/mono/下生成0.mdl和tree
80-86   編譯訓練圖(compiling traning graphs),調用程序compile-train-graphs,生成exp/mono/fsts.JOB.gz(共有\$nj個JOB);對每句話,編譯FST;
88-94   等價對齊數據(Aligning data equally),調用程序align-equal-compiled(Write an equally spaced alignment (for getting training started))和gmm-acc-stats-ali(Accumulate stats for GMM training.),生成exp/mono/0.JOB.acc
99-103   調用gmm-est對0.mdl進行重新估計,該程序對基於GMM的聲學模型進行最大似然重新估計。刪除exp/mono/0.*.acc,生成exp/mono/1.mdl
109-134   開始迭代更新參數。用到程序gmm-align-compiled(Align features given [GMM-based] models. Viterbi alignment)、gmm-acc-stats-ali和gmm-est
變量$stage的妙用:設置這個變量值,可以從中斷的地方重新開始訓練,不至於從頭開始。比如設置該值爲10,則接着第10次迭代,直接開始第11次迭代,而不用從頭開始。(個人想法)
對於每個程序的用法,可以直接在命令行輸入程序名查看其使用信息。
utils/mkgraph.sh


該腳本創建一個完全擴展的解碼圖(HCLG),該解碼圖表示語言模型、發音字典、上下文相關性和HMM結構。輸出是一個FST。
$lang=data/lang_test_bg
required="$lang/L.fst $lang/G.fst $lang/phones.txt $lang/words.txt $lang/phones/silence.csl $lang/phones/disambig.int $model $tree"
由L_disambig.fst(lexicon,發音字典)和G.fst(語言模型)生成最新的$lang/tmp/LG.fst
生成最新的$lang/tmp/CLG_1_0.fst 和 ilabels_1_0 和 disambig_ilabels_1_0.int,需要LG.fst和disambig.int
生成最新的exp/mono/graph/Ha.fst,需要文件$tree和$model
生成最新的exp/mono/graph/HCLGa.fst
生成最新的exp/mono/graph/HCLG.fst,調用程序add-self-loops
檢查HCLG.fst是否爲空
將$lang下的一些文件複製到exp/mono/graph下
steps/decode.sh


Usage: steps/decode.sh [options] <graph-dir> <data-dir> <decode-dir>
調用gmm-latgen-faster或gmm-latgen-faster-parallel進行解碼,生成lat.JOB.gz
如果設置變量skip_scoring爲false,則調用local/score.sh進行打分。
三音素:deltas + delta-deltas 訓練和解碼


steps/align_si.sh


usage: steps/align_si.sh <data-dir> <lang-dir> <src-dir> <align-dir>
作用:使用src-dir中的模型對data-dir中的數據進行對齊,將結果放在align-dir中
用到的文件:
data/train/text  data/lang/oov.in exp/mono/tree exp/mono/final.mdl exp/mono/final.occs
輸出:
exp/mono_ali/ali.JOB.gz
先調用compile-train-graphs對每句話生成FST
再調用gmm-align-compiled對數據進行對齊,結果放在exp/mono_ali/ali.JOB.gz
調用steps/diagnostic/analyze_alignments.sh對對齊結果進行分析
steps/train_deltas.sh


Usage: steps/train_deltas.sh <num-leaves> <tot-gauss> <data-dir> <lang-dir> <alignment-dir> <exp-dir>
一段理論:
訓練單音素系統(或者之前建立的三音素系統)是爲了得到數據的時間對齊結果;對每一個在數據裏看到的三音素,accumulate sufficent statistics to train a single Gaussian per HMM state.
stats是statistics的縮寫,sufficient statistics for Gaussian are (count, sum, sum-squared),每個狀態所擁有的個數分別爲(1,39,39)。
“pdf-class” which is
normally synonymous with HMM-state.

decision tree leaves are integers, call these pdf-ids(zero-based, but transition-ids are one-based)


gmm-init-model把兩個對象寫到模型文件中(x.mdl):TransitionModel和AmDiagGmm。TransitionModel存儲HMM transition probabilities,追蹤HMM topologies(包含HmmTopology對象)。
traisiton-ids:對應轉移概率的一個索引
流程:
accumulating tree statistics,用到程序acc-tree-stats和sum-tree-stats
避免使用手工製作的語音問題集,對音素進行聚類得到問題集;一個問題只是一個音素集;用到程序cluster-phones
compiling the questions
build-tree
初始化模型gmm-init-model
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章