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