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