当前位置:   article > 正文

kaldi源码分析(二)-数据准备_kaldi数据准备

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
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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
  • 1
  • 2
  • 3
  • 4
  • 5

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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

之后使用脚本转换为将dict转化为L.fst

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

通过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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
文件文件内容
L.fst & L_disambig.fstFST形式的发音字典
words.txt为训练数据和测试数据分词之后,和起来的所有去重之后的词
phones.txt根据lexicon生成的所有的音素集合
topo文件指明 HMM 模型拓扑结构
oov.txt映射词汇表之外的词为一个“垃圾音素”,该音素会与口语噪声对齐。SIL静音 SPN口语噪声 NSN非口语噪声 LAU笑声
oov.intSPN的数字形式(从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 
  • 1
  • 2

上述的语言工具基于第三方工具,为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
  • 1
  • 2
  • 3

之后再使用 arpa2fst 装换为fst

lang=data/lang_new 
arpa2fst --disambig-symbol=#0  --read-symbol-table=$lang/words.txt \
                              $local/tmp/lm.arpa $lang/G.fst
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/275419
推荐阅读
相关标签
  

闽ICP备14008679号