Kaldi-Timit腳本

數(shù)據(jù)準(zhǔn)備

local/timit_data_prep.sh

生成的內(nèi)容放在data/local/data中。
對(duì)于train、test和dev,分別生成相應(yīng)的_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.

  • 一大堆檢查

    • 檢查參數(shù)數(shù)目是否正確
    • 檢查sph2pipe程序是否可用
    • 檢查conf/test_spk.list和conf/dev_spk.list是否存在
    • 檢查train和test目錄是否存在
    • 檢查目錄名是大寫的還是小寫的(TRAIN或者train)
  • 創(chuàng)建臨時(shí)文件

  • 用trap命令設(shè)置收到EXIT信號(hào)時(shí)刪除臨時(shí)文件

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

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

  • for x in train dev test; do
    • 生成與x相關(guān)的.WAV路徑列表,放在${x}_sph.flist
    • 根據(jù)${x}_sph.flist中的人名和句子名,生成utt-id(人名_句子名),放在$tmpdir/${x}_sph.uttids中
    • 將.uttids和_sph.flist中的同一行粘在一起,根據(jù)第一列的uttids進(jìn)行排序后放在${x}_sph.scp中,每一行的格式為:utt-id 對(duì)應(yīng)的.WAV路徑
    • 根據(jù)${x}_sph.scp的第一列生成${x}.uttids
    • 生成與x相關(guān)的.PHN路徑列表,放在$tmpdir/${x}_phn.flist中(.PHN文件中存放的是音素抄本)
    • 根據(jù)_phn.flist中的人名和句子名,生成utt-id(人名_句子名),放在$tmpdir/${x}_phn.uttids中
    • 將存放在.PHN文件中的抄本轉(zhuǎn)換為kaldi使用的格式保存在$tmpdir/${x}_phn.trans中(.PHN中,一個(gè)音素一行,將這些音素放在一行)
    • 將.uttids和.trans中的同一行粘在一起,根據(jù)第一列的uttids進(jìn)行排序后放在${x}.trans中,每一行的格式為:utt-id 對(duì)應(yīng)的抄本
    • 調(diào)用local/timit_norm_trans.pl對(duì)${x}.trans進(jìn)行normalization,將h#替換成sil,生成$x.text
    • 創(chuàng)建${x}_wav.scp,每一行的格式為:utt-id extendedfilename
    • 生成$x.utt2spk,調(diào)用utils/utt2spk_to_spk2utt.pl生成$x.spk2utt
    • 生成性別映射$x.spk2gender
    • 為sclite準(zhǔn)備stm文件:調(diào)用程序wav-to-duration生成${x}_dur.ark,用awk生成stm文件
    • 創(chuàng)建假glm文件

local/timit_prepare_dict.sh

生成的文件放在data/local/dictdata/local/lm_tmpdata/local/nist_lm中。

(1)準(zhǔn)備字典
以下數(shù)據(jù)的默認(rèn)路徑是data/local/dict

  • 將sil寫到silence_phones.txtoptional_silence.txt
  • 根據(jù)train.text生成phones.txt
  • 根據(jù)phones.txt生成lexicon.txt(將phones.txt的一列復(fù)制成兩列)
  • 根據(jù)silence_phones.txt和phones.txt生成nonsilence_phones.txt
  • 根據(jù)silence_phones.txt和nonsilence_phones.txt生成extra_questions.txt

(2)創(chuàng)建音素bigram LM

  • 給data/train.text的每一句抄本句首加<s>,句尾加</s>,放在data/lm_train.text
  • 調(diào)用irstlm/bin/build-lm.sh生成音素語言模型,即lm_tmp/lm_phone_bg.ilm.gz
  • 調(diào)用irstlm/bin/compile-lm對(duì)上一步生成的LM進(jìn)行處理,輸出為nist_lm/lm_phone_bg.arpa.gz

utils/prepare_lang.sh

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

tmpdir=data/local/lang_tmp

  • 調(diào)用utils/validate_dict_dir.pl檢驗(yàn)data/local/dict下的除phones.txt外的所有文件
  • 如果沒有dict/lexiconp.txt,根據(jù)dict/lexicon.txt生成之,其格式為:音素 1.0 音素。
  • 經(jīng)過幾個(gè)if,將dict/lexiconp.txt復(fù)制到$tmpdir/lexiconp.txt
  • 根據(jù)dict下的silence_phones.txt和nonsilence_phones.txt生成$tmpdir/phones,將此phones的一列復(fù)制成兩列生成$tmpdir/phone_map.txt
  • 調(diào)用utils/apply_map.pl生成lang/phones/sets.txt
  • 根據(jù)sets.txt生成lang/phones/roots.txt,其中每一行的開頭為shared split
  • 根據(jù)dict中的silence_phones.txt、nonsilence_phones.txt、optional_silence.txt生成lang/phones下的silence.txtnonsilence.txtoptional_silence.txt
  • 根據(jù)lang/phones下的silence.txt生成lang/phones/context_indep.txt
  • 根據(jù)dict中的extra_questions.txt生成lang/phones/extra_questions.txt
  • 生成$tmpdir/lexiconp_disambig.txt
  • 生成$tmpdir/lex_ndisambig
  • 根據(jù)整數(shù)變量ndisambig(此處為1)的大小,生成phones/disambig.txt
  • 生成音素符號(hào)表lang/phones.txt。將<eps>和phones/{silence,non_silence,disambig}.txt合在一起生成phones.txt,每一行的格式為:音素 編號(hào)。
  • 生成phones/word_boundary.txt,本參數(shù)下不生成該文件
  • 創(chuàng)建單詞符號(hào)表lang/words.txt,根據(jù)$tmpdir/lexiconp.txt生成之,每一行的格式為:音素 編號(hào)。附加有<eps>、#0、<s>和</s>
  • 將$tmpdir/lexiconp.txt的第一列第三列提取出來生成$tmpdir/align_lexicon.txt;并將<eps> sil補(bǔ)加到$tmpdir/align_lexicon.txt
  • 根據(jù)$tmpdir/align_lexicon.txt生成phones/align_lexicon.txt
  • 根據(jù)align_lexicon.txt、phones.txt和words.txt生成phones/lexicon.int
  • 調(diào)用utils/make_lexicon_fst.pl生成lang/L.fst
  • 生成lang/oov.txtlang/oov.int,int映射是根據(jù)words.txt生成的
  • 將#0寫到phones/wdisambig.txt中,根據(jù)phones.txt將wdisambig.txt映射為phones/wdisambig_phone.int,根據(jù)words.txt將wdisambig.txt映射為phones/wdisambig_words.int
  • 根據(jù)phones.txt的映射,生成silence、nonsilence、optional_silence、disambig和context_indep的int和csl版本,生成sets和extra_question的int版本,生成roots的int版本
  • 調(diào)用utils/gen_topo.pl,根據(jù)silence.csl和nonsilence.csl生成lang/topo
  • 調(diào)用utils/make_lexicon_fst.pl生成lang/L_disambig.fst
  • 驗(yàn)證lang整個(gè)目錄下的文件

local/timit_format_data.sh

  • 準(zhǔn)備train、dev和test數(shù)據(jù)。創(chuàng)建data下創(chuàng)建train、dev和test目錄,將data/local/data中的相應(yīng)數(shù)據(jù)分別復(fù)制到data目錄下相應(yīng)的目錄中
  • 為測(cè)試準(zhǔn)備語言模型。創(chuàng)建data/lang_test_bg目錄,將data/lang下的所有文件復(fù)制到該目錄。根據(jù)data/local/nist_lm下的音素二元語言模型lm_phone_bg.arpa.gz生成G.fst
  • 驗(yàn)證lang_test_bg下文件,刪除data/local/lm_tmp目錄

特征提取

對(duì)data下的train、dev和test數(shù)據(jù)分別調(diào)用下面兩個(gè)腳本

steps/make_mfcc.sh

特征存在feats.scp中,存儲(chǔ)的特征是每一幀13維,當(dāng)用到mfcc特征的時(shí)候才計(jì)算deltas和deltas-deltas,轉(zhuǎn)為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為例

  • 檢查。檢查一些文件是否存在等
  • 根據(jù)變量$nj的大小,將data/train/wav.scp平分為$nj份
  • 調(diào)用run.pl,提取特征。一個(gè)JOB處理一份wav.scp,共$nj個(gè)JOB。用到程序compute-mfcc-featscopy-feats,生成mfcc/raw_mfcc_train.JOB.ark和對(duì)應(yīng)的mfcc/raw_mfcc_train.JOB.scp文件,JOB為1到$nj的數(shù)字。
  • 將$nj個(gè)mfcc/raw_mfcc_train.JOB.scp文件合成一個(gè)data/train/feats.scp文件
  • 檢查。檢查是否正確提取所有文件

steps/compute_cmvn_stats.sh

  • 對(duì)每個(gè)說話人計(jì)算cmvn(cepstral mean and variance normalization)。
  • 對(duì)每個(gè)說話人,對(duì)每一維(共13維)分別計(jì)算count/sum/sum-squared三組statistics,分別為1維、13維、13維。count代表該說話人所有音頻文件的總幀數(shù),sum代表所有幀里每一維的和,sum-square代表所有幀里每一維的平方的和。然后根據(jù)這三組statistics,計(jì)算均值和方差。
  • 可用copy-matrixs程序查看cmvn.scp或cmvn.ark文件,對(duì)每一個(gè)說話人,有一個(gè)28維的矩陣,前十三維是sum,然后是count,接著十三維是sum-squared,最后一個(gè)0。
  • 該腳本有三個(gè)選項(xiàng):--fake--two-channel--fake-dims
    調(diào)用compute-cmvn-stats生成mfcc/cmvn_train.arkmfcc/cmvn_train.scp,然后將后者復(fù)制到data/train/cmvn.scp

單因素訓(xùn)練和解碼

steps/train_mono.sh

主要輸出為:final.mdltree

  • 創(chuàng)建sdatadata/train/split$nj($nj為作業(yè)數(shù),此處為30),將data/train分為$nj
  • 57 調(diào)用程序apply-cmvnadd-deltas生成39維特征(原始的mfcc只有13維)
  • 65-75 run.pl調(diào)用程序gmm-init-mono初始化單音素模型,在exp/mono/下生成0.mdltree
  • 80-86 編譯訓(xùn)練圖(compiling traning graphs),調(diào)用程序compile-train-graphs,生成exp/mono/fsts.JOB.gz(共有$nj個(gè)JOB);對(duì)每句話,編譯FST;
  • 88-94 等價(jià)對(duì)齊數(shù)據(jù)(Aligning data equally),調(diào)用程序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 調(diào)用gmm-est對(duì)0.mdl進(jìn)行重新估計(jì),該程序?qū)贕MM的聲學(xué)模型進(jìn)行最大似然重新估計(jì)。刪除exp/mono/0.*.acc,生成exp/mono/1.mdl
  • 109-134 開始迭代更新參數(shù)。用到程序gmm-align-compiled(Align features given [GMM-based] models. Viterbi alignment)、gmm-acc-stats-aligmm-est

變量$stage的妙用:設(shè)置這個(gè)變量值,可以從中斷的地方重新開始訓(xùn)練,不至于從頭開始。比如設(shè)置該值為10,則接著第10次迭代,直接開始第11次迭代,而不用從頭開始。(個(gè)人想法)
對(duì)于每個(gè)程序的用法,可以直接在命令行輸入程序名查看其使用信息。

utils/mkgraph.sh

該腳本創(chuàng)建一個(gè)完全擴(kuò)展的解碼圖(HCLG),該解碼圖表示語言模型、發(fā)音字典、上下文相關(guān)性和HMM結(jié)構(gòu)。輸出是一個(gè)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,發(fā)音字典)和G.fst(語言模型)生成最新的$lang/tmp/LG.fst
  • 生成最新的$lang/tmp/CLG_1_0.fst 和 ilabels_1_0 和 disambig_ilabels_1_0.int,需要LG.fstdisambig.int
  • 生成最新的exp/mono/graph/Ha.fst,需要文件$tree$model
  • 生成最新的exp/mono/graph/HCLGa.fst
  • 生成最新的exp/mono/graph/HCLG.fst,調(diào)用程序add-self-loops
  • 檢查HCLG.fst是否為空
  • $lang下的一些文件復(fù)制到exp/mono/graph

steps/decode.sh

Usage: steps/decode.sh [options] <graph-dir> <data-dir> <decode-dir>
  • 調(diào)用gmm-latgen-fastergmm-latgen-faster-parallel進(jìn)行解碼,生成lat.JOB.gz
  • 如果設(shè)置變量skip_scoring為false,則調(diào)用local/score.sh進(jìn)行打分。

三音素:deltas + delta-deltas 訓(xùn)練和解碼

steps/align_si.sh

usage: steps/align_si.sh <data-dir> <lang-dir> <src-dir> <align-dir>
作用:使用src-dir中的模型對(duì)data-dir中的數(shù)據(jù)進(jìn)行對(duì)齊,將結(jié)果放在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

  • 先調(diào)用compile-train-graphs對(duì)每句話生成FST
  • 再調(diào)用gmm-align-compiled對(duì)數(shù)據(jù)進(jìn)行對(duì)齊,結(jié)果放在exp/mono_ali/ali.JOB.gz
  • 調(diào)用steps/diagnostic/analyze_alignments.sh對(duì)對(duì)齊結(jié)果進(jìn)行分析

steps/train_deltas.sh

Usage: steps/train_deltas.sh <num-leaves> <tot-gauss> <data-dir> <lang-dir> <alignment-dir> <exp-dir>

一段理論:

  • 訓(xùn)練單音素系統(tǒng)(或者之前建立的三音素系統(tǒng))是為了得到數(shù)據(jù)的時(shí)間對(duì)齊結(jié)果;對(duì)每一個(gè)在數(shù)據(jù)里看到的三音素,accumulate sufficent statistics to train a single Gaussian per HMM state.
  • statsstatistics的縮寫,sufficient statistics for Gaussian are (count, sum, sum-squared),每個(gè)狀態(tài)所擁有的個(gè)數(shù)分別為(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把兩個(gè)對(duì)象寫到模型文件中(x.mdl):TransitionModelAmDiagGmmTransitionModel存儲(chǔ)HMM transition probabilities,追蹤HMM topologies(包含HmmTopology對(duì)象)。
  • traisiton-ids:對(duì)應(yīng)轉(zhuǎn)移概率的一個(gè)索引

流程:

  • accumulating tree statistics,用到程序acc-tree-statssum-tree-stats
  • 避免使用手工制作的語音問題集,對(duì)音素進(jìn)行聚類得到問題集;一個(gè)問題只是一個(gè)音素集;用到程序cluster-phones
  • compiling the questions
  • build-tree
  • 初始化模型gmm-init-model
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 剛剛拿到一個(gè)簡(jiǎn)單語料庫練手,發(fā)現(xiàn)只有語音和對(duì)應(yīng)文字, 這篇文章記錄了從數(shù)據(jù)預(yù)處理到kaldi對(duì)數(shù)據(jù)進(jìn)行訓(xùn)練和測(cè)試的...
    zqh_zy閱讀 12,089評(píng)論 11 20
  • 承接前面的《淺談機(jī)器學(xué)習(xí)基礎(chǔ)》、《淺談深度學(xué)習(xí)基礎(chǔ)》和《淺談自然語言處理基礎(chǔ)》,主要參考了《解析深度學(xué)習(xí):語音識(shí)別...
    我偏笑_NSNirvana閱讀 23,643評(píng)論 6 67
  • 對(duì)于文字的把握,每個(gè)人都有自身的見解,獨(dú)于自我而言,閱讀量到底該怎么解讀。文字是個(gè)很神奇的事物,因?yàn)榕帕蟹绞降牟煌?..
    雨微水閱讀 412評(píng)論 0 1
  • (一) 2006年,我轉(zhuǎn)學(xué)來到了這個(gè)初中,初識(shí)時(shí),只是通過同桌見過她。印象極...
    baby小姐閱讀 505評(píng)論 1 2
  • 我是從福州路走到外灘的,那里離外灘很近。期間經(jīng)過一家全家便利店和中山東一路。 走到外白渡橋的時(shí)候,正是黃昏,看到景...
    黑麥的光影部落閱讀 352評(píng)論 0 2