kaldi源碼分析(二)-數據準備

kaldi數據準備

在本次記錄中主要記錄的是發音詞典以及聲學模型的數據準備,語言模型僅僅簡單介紹。

發音詞典數據準備

發音詞典數據準備的階段主要目的是生成L.fst,在此之前首先進行準備發音詞典
發音詞典一般包含以下6個文件
在文件中,SIL靜音 SPN口語噪聲 NSN非口語噪聲 LAU笑聲

文件 內容
lexicon.txt 包含概率的字典文件(詞語 音素1 音素2 …)
silence_phones.txt 默認靜音音素
optional_silence.txt 默認靜音音素
nonsilence_phones.txt 靜音/非靜音 音素,每行代表相同的base phone, 但是會用不同的音調,例如 a a1 a2 a3 a4
extra_questions.txt 構建決策樹的問題集(可以爲空)
lexiconp.txt 字典文件(詞語 音素1 音素2 …)

lexicon.txt 文件的部分內容如下,其中的內容包含了所有的內容包括 假音素。

龢	p_h p_e_2 
龣	p_j p_iao_3 
龤	p_x p_ie_2 
龥	p_y p_v_4
<UNK>	spn

silence_phones.txt:默認靜音音素 sil

echo sil > $dict_dir/optional_silence.txt


optional_silence.txt 默認靜音音素
echo sil > $dict_dir/optional_silence.txt


nonsilence_phones.txt:靜音/非靜音 音素,每行代表相同的base phone, 但是會用不同的音調,例如 a a1 a2 a3 a4

l
m
n
o
p
p_a_1 p_a_2 p_a_3 p_a_4 p_a_5
p_ai_1 p_ai_2 p_ai_3 p_ai_4 p_ai_5
p_an_1 p_an_2 p_an_3 p_an_4 p_an_5

lexiconp.txt

嗀	1.0	p_g p_u_3
嗀	1.0	p_h p_u_4
礼	1.0	p_l p_i_3
﨨	1.0	p_x p_ing_4
<UNK>	1.0	spn

extra_questions 構建決策樹的問題集

   sil
   ' . a b c w x y spn z
   p_a_4 p_ai_4
   p_a_1 p_ai_1
   p_a_3 p_ai_3
   p_a_2 p_ai_2 
   p_a_5 p_ai_5 

之後使用腳本轉換爲將dict轉化爲L.fst

  utils/prepare_lang.sh --position-dependent-phones false \
               data/dict "<UNK>" data/local/lang data/lang

通過utils/prepare_lang.sh將詞典生成爲L.fst。文件 L.fst 是 FST 形式的發音詞典, 其中輸入是音素,輸出爲詞

以下樹形結構爲使用 utils/prepare_lang.sh生成的文件結構。

Usage: utils/prepare_lang.sh \<dict-src-dir> \<oov-dict-entry> \<tmp-dir> \<lang-dir>

data/lang
	├── L_disambig.fst
	├── L.fst
	├── oov.int
	├── oov.txt
	├── phones.txt
	├── topo
	├── words.txt
	└── phones
	    ├── align_lexicon.int
	    ├── align_lexicon.txt
	    ├── context_indep.csl
	    ├── context_indep.int
	    ├── context_indep.txt
	    ├── disambig.csl
	    ├── disambig.int
	    ├── disambig.txt
	    ├── extra_questions.int
	    ├── extra_questions.txt
	    ├── nonsilence.csl
	    ├── nonsilence.int
	    ├── nonsilence.txt
	    ├── optional_silence.csl
	    ├── optional_silence.int
	    ├── optional_silence.txt
	    ├── roots.int
	    ├── roots.txt
	    ├── sets.int
	    ├── sets.txt
	    ├── silence.csl
	    ├── silence.int
	    ├── silence.txt
	    ├── wdisambig_phones.int
	    ├── wdisambig.txt
	    └── wdisambig_words.int
文件 文件內容
L.fst & L_disambig.fst FST形式的發音字典
words.txt 爲訓練數據和測試數據分詞之後,和起來的所有去重之後的詞
phones.txt 根據lexicon生成的所有的音素集合
topo 文件指明 HMM 模型拓撲結構
oov.txt 映射詞彙表之外的詞爲一個“垃圾音素”,該音素會與口語噪聲對齊。SIL靜音 SPN口語噪聲 NSN非口語噪聲 LAU笑聲
oov.int SPN的數字形式(從words.txt中提取)

phones目錄下的文件內容

文件 文件內容
phones.txt&words.txt 符號表文件,音素符號的文本形式和數字形式
phones 包含音素集合的各種信息,分別爲三個版本(.txt .int數字 .csl列表)
phones/align_lexion.txt
phones/context_indep.txt 包含所有音素的一個列表,用於建立文本無關的模型
phones/disambig.txt 包含所有用於消除歧義的符號的列表
phones/extra_questions.txt 包含那些自動產生的問題集之外的一些問題
phones/nonsilence.txt 包含非靜音音素列表
phones/optional_silence.txt 含有一個音素,在需要的時候出現在詞之前
phones/sets.txt 包含一系列的音素集,在聚類音素時被分組(被當做同一個音素),以便建立文本相關問題集
phones/silence.txt 包含靜音音素列表
phones/word_boundary.txt 解釋音素與詞位的關聯情況

聲學模型數據準備

詞彙表中不一定包含text中出現的詞彙,詞彙表中沒有的詞彙被寫入lang/oov.txt 文件中(lang/oov.int 文件爲其 SPN 的數字形式,從 words.txt 中提取)。

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

上文中標記說明:

標記名稱 說明
utterance-id 發音編號, 可以是任意的文本字符串,唯一性
speaker-id 說話人編號, 常作爲發音編號的前綴
record-id 和在“wav.scp”中使用的是同一個標識字符串, 與 uttid 一樣
word.txt 單詞列表
segment-begin/segment-end 以秒爲單位。它們指明瞭一段發音在一段錄音中的時間偏移量

語言模型數據準備

語言模型的數據準備由於我之前僅僅簡單使用ngram進行訓練語言模型,因此在此不進行記錄。訓練工具可以通過kaldi/tools 下面 install_srilm.sh進行安裝。
使用以下腳本進行訓練語言模型。

ngram-count -order $lm_order  -wbdiscount \
                          -text $local/corpus.txt -lm $local/tmp/lm.arpa 

上述的語言工具基於第三方工具,爲ARPA-format,腳本的作業是將其轉換爲fst,方便與之前的字典fst(L.fst)結合,發揮fst的優勢。腳本最後會檢測G.fst中是否存在沒有單詞的空迴環,如果存在會報錯,因爲這會導致後續HLG determinization的出現錯誤,因此使用腳本去進行檢測。

腳本utils/format_lm.sh解決把ARPA格式的語言模型轉換成OpenFST格式類型。腳本用法如下:
Usage: utils/format_lm.sh <lang_dir> <arpa-LM> <lexicon> <out_dir>
E.g.: utils/format_lm.sh data/lang data/local/lm/foo.kn.gz data/local/dict/lexicon.txt data/lang_test

之後再使用 arpa2fst 裝換爲fst

lang=data/lang_new 
arpa2fst --disambig-symbol=#0  --read-symbol-table=$lang/words.txt \
                              $local/tmp/lm.arpa $lang/G.fst
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章