[轉載]kaldi學習筆記:run.sh(egs/timit/s5)詳細分析:從數據準備到特徵提取

from:http://blog.csdn.net/xingxingdeyuanwang6/article/details/47401875

  1. 首先看一下前三行:
. ./cmd.sh 
[ -f path.sh ] && . ./path.sh
set -e
  • 1
  • 2
  • 3

(1)cmd.sh腳本文件包含三部分內容:

# "queue.pl" uses qsub.  The options to it are
# options to qsub.  If you have GridEngine installed,
# change this to a queue you have access to.
# Otherwise, use "run.pl", which will run jobs locally
# (make sure your --num-jobs options are no more than
# the number of cpus on your machine.

#a) JHU cluster options
#export train_cmd="queue.pl -l arch=*64"
#export decode_cmd="queue.pl -l arch=*64,mem_free=2G,ram_free=2G"
#export mkgraph_cmd="queue.pl -l arch=*64,ram_free=4G,mem_free=4G"
#export cuda_cmd=run.pl

#if [[ $(hostname -f) == *.clsp.jhu.edu ]]; then
#  export train_cmd="queue.pl -l arch=*64*"
#  export decode_cmd="queue.pl -l arch=*64* --mem 3G"
#  export mkgraph_cmd="queue.pl -l arch=*64* --mem 4G"
#  export cuda_cmd="queue.pl -l gpu=1"
#elif [[ $(hostname -f) == *.fit.vutbr.cz ]]; then
#  #b) BUT cluster options
#  queue="all.q@@blade,all.q@@speech,all.q@dellgpu*,all.q@supergpu*"
#  export train_cmd="queue.pl -q $queue -l ram_free=2500M,mem_free=2500M,matylda5=0.5"
#  export decode_cmd="queue.pl -q $queue -l ram_free=3000M,mem_free=3000M,matylda5=0.1"
#  export mkgraph_cmd="queue.pl -q $queue -l ram_free=4G,mem_free=4G,matylda5=3"
#  export cuda_cmd="queue.pl -q long.q@pcspeech-gpu,long.q@dellgpu1,long.q@pcgpu*,long.q@supergpu1 -l gpu=1" 
#else
#  echo "$0: you need to define options for your cluster."
#  exit 1;
#fi
#c) run locally...
export train_cmd=run.pl
export decode_cmd=run.pl
export cuda_cmd=run.pl
export mkgraph_cmd=run.pl
  • 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

其中a)和b)都是在集羣上運行,而c)是在本地運行,因此c)是我們需要的,將a)和b)註釋掉,只保留c)。

(2) 若path.sh是常規文件就運行之:-f 判斷path.sh是否常規文件,另,常見文件判斷命令如下: 
-e filename 如果 filename存在,則爲真 
-d filename 如果 filename爲目錄,則爲真 
-f filename 如果 filename爲常規文件,則爲真 
-L filename 如果 filename爲符號鏈接,則爲真 
-r filename 如果 filename可讀,則爲真 
-w filename 如果 filename可寫,則爲真 
-x filename 如果 filename可執行,則爲真 
-s filename 如果文件長度不爲0,則爲真 
-h filename 如果文件是軟鏈接,則爲真 
filename1 -nt filename2 如果 filename1比 filename2新,則爲真。 
filename1 -ot filename2 如果 filename1比 filename2舊,則爲真。 
-eq 等於 
-ne 不等於 
-gt 大於 
-ge 大於等於 
-lt 小於 
-le 小於等於 
!非 
path.sh內容爲: 
修改前:

  1 export KALDI_ROOT=`pwd`/../../..
  2 export PATH=$PWD/utils/:$KALDI_ROOT/src/bin:$KALDI_ROOT/tools/openf
    st/bin:$KALDI_ROOT/tools/irstlm/bin/:$KALDI_ROOT/src/fstbin/:$KALDI
    _ROOT/src/gmmbin/:$KALDI_ROOT/src/featbin/:$KALDI_ROOT/src/lm/:$KAL
    DI_ROOT/src/sgmmbin/:$KALDI_ROOT/src/sgmm2bin/:$KALDI_ROOT/src/fgmm
    bin/:$KALDI_ROOT/src/latbin/:$KALDI_ROOT/src/nnetbin:$KALDI_ROOT/sr
    c/nnet2bin/:$KALDI_ROOT/src/kwsbin:$PWD:$PATH
  3 export LC_ALL=C
  4 export IRSTLM=$KALDI_ROOT/tools/irstlm
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

只修改第一行:(注意,有一些不需要修改也能成功運行)

  1 export KALDI_ROOT=/home/wangyongqing/dev/kaldi-git
  2 export PATH=$PWD/utils/:$KALDI_ROOT/src/bin:$KALDI_ROOT/tools/openf
    st/bin:$KALDI_ROOT/tools/irstlm/bin/:$KALDI_ROOT/src/fstbin/:$KALDI
    _ROOT/src/gmmbin/:$KALDI_ROOT/src/featbin/:$KALDI_ROOT/src/lm/:$KAL
    DI_ROOT/src/sgmmbin/:$KALDI_ROOT/src/sgmm2bin/:$KALDI_ROOT/src/fgmm
    bin/:$KALDI_ROOT/src/latbin/:$KALDI_ROOT/src/nnetbin:$KALDI_ROOT/sr
    c/nnet2bin/:$KALDI_ROOT/src/kwsbin:$PWD:$PATH
  3 export LC_ALL=C
  4 export IRSTLM=$KALDI_ROOT/tools/irstlm
  5 export LD_LIBRARY_PATH=$KALDI_ROOT/tools/openfst/lib:$LD_LIBRARY_PATH
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

修改爲kaldi安裝目錄;

將各種目錄設置爲環境變量;

LC_ALL它是一個宏,如果該值設置了,則該值會覆蓋所有LC_*的設置值。注意,LANG的值不受該宏影響。”C” 這是標準的C Locale。”POSIX”是”C”的別名。它所指定的屬性和行爲由ISO C標準所指定。

irstlm爲開源的語言模型工具包。。

將openfst設爲 LD_LIBRARY_PATH 動態庫環境變量

(3) set -e 表示告訴bash如果任何語句的執行結果不是true(返回值非零)則應該退出。寫每個腳本都應該在開頭加上set -e, 這樣的好處是防止錯誤像雪球一樣越滾越大。ps: 用set -o errexit也是一樣的效果. 
2. 然後是聲學模型參數設置

 #Acoustic model parameters
export LD_LIBRARY_PATH=/home/wyq/dev/kaldi-git/tools/openfst/lib:$LD_LIBRARY_PATH
numLeavesTri1=2500
numGaussTri1=15000
numLeavesMLLT=2500
numGaussMLLT=15000
numLeavesSAT=2500
numGaussSAT=15000
numGaussUBM=400
numLeavesSGMM=7000
numGaussSGMM=9000

feats_nj=10
train_nj=30
decode_nj=5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

這部分基本默認不改,除非自己訓練自己的數據庫。nj指運行的jobs數目,一般不超過CPU的數量。

3.數據準備

timit=/home/wyq/dev/kaldi-git/egs/timit/s5/timitdata/timit # @BUT
local/timit_data_prep.sh $timit || exit 1
local/timit_prepare_dict.sh
# Caution below: we remove optional silence by setting "--sil-prob 0.0",
# in TIMIT the silence appears also as a word in the dictionary and is scored.
utils/prepare_lang.sh --sil-prob 0.0 --position-dependent-phones false --num-sil-states 3 data/local/dict "sil" data/local/lang_tmp data/lang
local/timit_format_data.sh
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(1) 首先timit數據庫原始的wav文件目錄賦值給timit,然後運行local目錄下的timit_data_prep.sh 腳本,此腳本爲數據準備腳本,輸入爲timit wav文件,輸出爲data/目錄下的: 
這裏寫圖片描述 
其中關於特徵提取的文件夾爲dev,test和train,每個文件夾內容都具有相同文件名的文件,如下圖所示 
這裏寫圖片描述 
其中四個爲必要:wav.scp,text,spk2utt,utt2spk ,這四個文件將作爲下一步特徵提取的輸入。

注: 數據準備詳細解析,見博客 (kaldi學習筆記:data_prep.sh詳細分析)

4.特徵提取

# Now make MFCC features.
mfccdir=mfcc
for x in train dev test; do
  steps/make_mfcc.sh --cmd "$train_cmd" --nj $feats_nj data/$x exp/make_mfcc/$x $mfccdir
  steps/compute_cmvn_stats.sh data/$x exp/make_mfcc/$x $mfccdir
done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(1)mfccdir=mfcc:將mfcc字符串賦值給變量mfccdir

(2)然後運行steps/下的特徵提取腳本make_mfcc.sh,其中–cmd traincmdcmd.shrun.plnjfeats_nj 爲運行job數目; data/x(data/train,data/dev,data/test)exp/makemfcc/x 爲中間生成的.log文件。$mfccdir 爲目標目錄mfcc文件夾,裏面的文件機位提取得分mfcc; 
(3)compute_cmvn_stats.sh 是爲了計算提取特徵的CMVN,即爲倒譜方差均值歸一化!

注: 
MFCC特徵提取詳細解析,見博客 (kaldi學習筆記:make_mfcc.sh詳細分析)

CMVN詳細解析,見博客 (kaldi學習筆記:compute_cmvn_stats.sh 詳細分析)

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