天天看點

kaldi 源碼閱讀(二) - 代碼結構分析

源碼目錄結構分析

egs/            開放資料集合,主要目錄 wsj, rm
   |- README.txt   
src/             代碼主目錄
   |- configure     建構 kaldi.mk 檔案(c庫,編譯優化參數等)
   |- Makefile      組織整體代碼依賴相關内容
   |- ……
tools/            基礎工具包
   |- atlas            數學算法庫
   |- clpack          cl線代庫加速包
   |- srilm            語言模型生成工具
   |- openfst       權重有限狀态機(Makefile檔案中自動下載下傳并編譯)
   |- sctk             Speech Recognition Scoring Toolkit(Makefile檔案中自動下載下傳并編譯)
   |- sph2pipe     SPHERE 檔案轉換(其他音頻)工具(Makefile檔案中自動下載下傳并編譯)
   |- openblas     開源blas庫(Makefile檔案中自動下載下傳并編譯)
   |- extras          擴充工具包
           

常見檔案格式

常見内容标記說明

标記名稱 說明
utterance-id 發音編号, 可以是任意的文本字元串
speaker-id 說話人編号, 常作為發音編号的字首
record-id 和在“wav.scp”中使用的是同一個辨別字元串, 與 uttid 一樣
word 單詞清單
segment-begin/segment-end 以秒為機關。它們指明了一段發音在一段錄音中的時間偏移量

比如:

檔案名稱 内容格式
text < uttid > < word >
wav.scp < uttid > < utter_file_path >
utt2spk < uttid > < speakid >
spk2utt < speakid > < uttid >
segments <uttid> <recid> <segbegin> <segend>
feats.scp < uttid > <extended-filename-of-features>

注意:

對于 text 中不一定要保證每個單詞都必須出現在詞彙表中,若詞彙表中沒有則被映射到 lang/oov.txt 檔案中(lang/oov.int 檔案為其 SPN 的數字形式,從 words.txt 中提取)。

在每一個 feats.scp 特征檔案中儲存的都是Kaldi格式的矩陣。在這個例子中,矩陣的次元是13(譯者注:即列數;行數則 和你的檔案長度有關,标準情況下幀長20ms,幀移10ms,是以一行特征資料對應10ms的音頻資料)。比如:

s5# head -3 data/train/cmvn.scp 
// 表示 2001-A 對應的特征從 cmvn_train.ark 檔案的 7 位元組開始讀取資料
2001-A /home/xxxx/kaldi/egs/swbd/s5/mfcc/cmvn_train.ark:7
// 表示 2001-B 對應的特征從 cmvn_train.ark 檔案的 253 位元組開始讀取資料
2001-B /home/xxxx/kaldi/egs/swbd/s5/mfcc/cmvn_train.ark:253
// 表示 2005-A 對應的特征從 cmvn_train.ark 檔案的 499 位元組開始讀取資料
2005-A /home/xxxx/kaldi/egs/swbd/s5/mfcc/cmvn_train.ark:499
           

對于 phones.txt 和 words.txt 分别存放詞典, 比如:

s5$ head -3 data/lang/phones.txt
<eps> 0
SIL 1
SIL_B 2

s5$ head -3 data/lang/words.txt
<eps> 0
!SIL 1
-'S 2
           

這些為符号标 (symbol-table) 檔案,符合 OpenFst 的格式定義。

在 kaldi 中, 這些檔案被用于音素符号的文本形式和數字形式之間進行轉換。大多數情況下,隻有腳本 utils/int2sym.pl 和 utils/sym2int.pl 及 OpenFst 中 fstcompile 和 fstprint 會讀取這些檔案。

檔案 L.fst 是 FST 形式的發音詞典, 其中輸入是音素,輸出為詞彙。

檔案 L_disambig.fst 也為發音詞典,但還包含為消歧而引入的符号(比如 #1, #2 等,以及自環(self-loop) 而引入的 #0)。

lang/topo 檔案指明 HMM 模型拓撲結構

lang/G.fst 檔案中存放了語言模型(文法),FST 格式表示,解碼時使用,根據使用的語言模型的不同,生産 G.fst 的步驟會不同。比如:

# 在 rm 中使用 local/rm_data_prep.sh 檔案裡面
# 生成 G.txt 文法檔案
local/make_rm_lm.pl $RMROOT/rm1_audio1/rm1/doc/wp_gram.txt  > $tmpdir/G.txt || exit 1;
# 在 local/rm_prepare_grammar.sh 會将文本格式文法檔案轉換為二進制 G.fst 檔案
fstcompile --isymbols=data/lang/words.txt --osymbols=data/lang/words.txt --keep_isymbols=false \
    --keep_osymbols=false $tmpdir/G.txt > data/lang/G.fst
           

繼續閱讀