參考文檔:http://www.cnblogs.com/welen/p/7485151.html
寫在前面,本文雖然對大多數腳本進行了解釋,但只是初學者的理解,如果你認為讀起來不知所雲,建議從 kaldi 官方文檔 讀起,兩邊配合理解,可以解決很多看起來好像很難理解的東西。(官方文檔地址: http://www.kaldi-asr.org/doc/data_prep.html )
今天為止,/rgs/yesno/ 實例的數據准備階段的腳本終於基本看完了,你我很忙,“知識不慌張”。學習總是一件很有成就感的事情。再次提醒,當你閱讀中文文檔和博客感到抓狂的時候,不防看看 kaldi 官方文檔,可能需要一些時間去學會怎樣尋找自己需要的東西,但是學習不就是一個從無到有的過程嗎,向來如此。
run.sh 是整個實例的頂層調用腳本,可以看到清晰的處理脈絡。上一篇(http://www.cnblogs.com/gstblog/p/8933797.html)當中,主要是對腳本的prepare_data進行了學習,包含了腳本文件中涉及到的其他腳本文件,今天繼續往下學習
local/prepare_dict.sh utils/prepare_lang.sh --position-dependent-phones false data/local/dict "<SIL>" data/local/lang data/lang
路徑: kaldi-trunk/egs/yesno/s5
運行: ./run.sh
目前代碼:
#!/bin/bash train_cmd="utils/run.pl" decode_cmd="utils/run.pl" if [ ! -d waves_yesno ]; then wget http://www.openslr.org/resources/1/waves_yesno.tar.gz || exit 1; # was: # wget http://sourceforge.net/projects/kaldi/files/waves_yesno.tar.gz || exit 1; tar -xvzf waves_yesno.tar.gz || exit 1; fi train_yesno=train_yesno test_base_name=test_yesno rm -rf data exp mfcc # Data preparation local/prepare_data.sh waves_yesno local/prepare_dict.sh utils/prepare_lang.sh --position-dependent-phones false data/local/dict "<SIL>" data/local/lang data/lang local/prepare_lm.sh
1. local/prepare_dict.sh
prepare_dict 用於數據准備階段的字典准備,創建了 data/local/dict 目錄,並創建了里面必要的文件。字典主要是為了羅列出 單詞和發音的對應關系,方便后面訓練模型和測試數據使用,里面的文件各司其職,有的負責對應單詞和發音,有的負責存儲非語言學發音(靜音,噪聲,笑聲等,但是這個例子里面只有 SIL(silence))。
data/local/dict 里面的文件包括:
其中,各個文件解釋如下
lexicon.txt: 發音字典文件,里面內容形式是 <word> - <utterance>, 左邊一列是單詞,右邊一列是對應的發音 。這里發音用 Y , N ,SIL 表示
lexiconp.txt: 也是發音字典文件,只不過它添加了對應的發音概率。在這里為了方便處理,這里其實把所有的發音概率都設為了1,而不是左右的概率加起來等於1。第二列就是概率。
其他的文件則專門分別記錄的單詞的發音,靜音,非靜音等等信息
prepare_dict.sh 代碼如下:
#!/bin/bash #==== # create directory saving dict files #==== mkdir -p data/local/dict #==== # copy some files form input # SIL means silence # lexicon.txt, 完整的詞位-發音對 # lexiconp.txt, 完整的詞位-發音概率-發音 # lexicon_words.txt, 單詞-發音對 # silence_phones.txt, 非語言學發音(靜音,噪音,笑聲等) # nonsilence_phones.txt, 語言學發音 # optional_silence.txt , 備選非語言發音 #==== #==== # grep: 查找指令 ,-v選項表示反向查找, # 第三行代碼意思是,查找phones.txt的內容, 凡是不含 SIL 的行,會被重定向輸出 ( > )到 nonsilence_phones.txt #==== cp input/lexicon_nosil.txt data/local/dict/lexicon_words.txt cp input/lexicon.txt data/local/dict/lexicon.txt cat input/phones.txt | grep -v SIL > data/local/dict/nonsilence_phones.txt echo "SIL" > data/local/dict/silence_phones.txt echo "SIL" > data/local/dict/optional_silence.txt echo "Dictionary preparation succeeded"
2. utils/prepare_lang.sh --position-dependent-phones false data/local/dict "<SIL>" data/local/lang data/lang
上面是一條帶有命令行參數的指令,--position-dependent-phones 是命令選項,這里賦值為false,后面四項是prepare_lang.sh 的四個參數。參數解釋如下:
utils/prepare_lang.sh <input_dir> <oov> <temperary_dir> <output_dir>
oov: 數據集之外的單詞,會映射到這里;
<temperary_dir>:僅僅就是一個臨時文件,不需要過多關注;
<output_dir>: 這個目錄是真正的數據的輸出目錄
命令選項 --position-dependent-phones 與詞位信息有關,默認值是 true,這時候會使用詞位信息 _B _E _I _S ,表示開始,結束,詞中,單個詞。
具體的可以在 yesno/s5/utils/prepare_lang.sh中找到。還有一些其它選項也在這個文件里面。
在這個例子當中,預料信息很少,全部都是孤立詞,所以把這個選項設為false。
在上一條指令 ./local/prepare_dict 中,我們搞定了一些詞典信息,但是kaldi處理數據需要專門的數據結構 fst(Finite Satte Transducers,有窮狀態轉換器),具體可以參考網上資料,以及官方文檔。而這一條指令,就是創建 /dict/lang 目錄,保存這些信息。
3. /data/lang 里面有什么
剛剛說了 prepare_lang.sh 創建了 /data/lang 目錄,完成了從普通數據結構(人能夠讀懂的數據結構)到特定格式(fst格式)的轉換,那么這個目錄里到底有什么?這些文件有什么內容呢?所謂的特定的格式是什么樣的?分析一下。
3.1 有什么?
看一下里面打底有哪些文件,還有一個phone目錄,也一並展示
3.2 是什么內容
先看看 /dict/lang 下面的幾個文件
3.2.1 phone.txt 和 words.txt
這兩個文件分別存儲了 音素與整數的映射,單詞與整數的映射,從這里就可以看出 數據准備階段一開始數據結構與FST格式的不同。
3.2.2 L.fst
這是一個 fst 格式的發音詞典,輸入是音素,而輸出是詞。
3.2.3 L_disambig.fst
這也是一個 fst 格式的發音詞典,只是在這個文件當中,添加了消除歧義的符號,比如#1,#2,以及自循環符號 #0。
3.2.4 oov.txt
這個文件里面存儲了一些符號,所有ooV詞(詞表之外的詞,out of vocabulary)都會被映射為這個符號。
3.2.5 topo
這個文件里面存儲了我們后將要用到的 HMM 模型的拓撲模型,可以看到有兩部分,第一部分 <ForPhones></ForPhones> 之間的數字是 2,3 ,是發音的編號指的是 YES, NO ,這個可以從 phones.txt 找到,自然 下面一部分 的數字 1 指的是SIL。 YES,NO 公有3種狀態,SIL有五種狀態,它們各自狀態之間的轉移以及轉移概率則是每一行<Transition> state probability 指定。
3.2.6 phones/*
phones 目錄下的文件很明顯有一個特點,每一個文件都有3個,但是他們的后綴名都不一樣,同名不同后綴的文件,其實有着完全一樣的內容,只是他們各自存儲信息的格式是不同的。這里用 nonsilence.* 舉例子
這里,context_indep.* 存儲了上下文無關的信息。nonsilence.* silence.* optional_silence.*存儲了音素信息。extra_question.*存儲的是一些額外的信息,主要是和音調和重音之類的信息有關。disambig.* 則存儲了一些消除歧義使用的符號,在前面已經見過,比如#0, #1等等。roots.# 可以提供建立上下文決策樹的信息。set.* 包含了一系列的因素集,一般是將同一個音素(有時候會包含詞位信息 _B _E)存儲在同一行,聚類使用。