语音识别算法原理文档整理(九)

数据文件内容简介

数据准备阶段的输出包含两部分。一部分与―数据相关(保存在诸如data/train/之类的目录下),另一部分则与语言相关(保存在诸如data/lang/之类的目录下)。 数据部分与数据集的录音相关,而―语言部分则与语言本身更相关的内容,例如发音字典、音素集合以及其他Kaldi需要的关于音素的额外信息。如果你想用已有的识别系统和语言模型对你的数据进行解码,那么你只需要重写―数据部分。接下来看看data/lang/目录下的有关内容。

“lang” 目录

现在我们关注一下数据准备的“lang”语言数据这个目录。
s5# ls data/lang
L.fst L_disambig.fst oov.int oov.txt phones phones.txt topo words.txt
1)首先是有文件phones.txt 和 words.txt。这些都是符号表(symbol-table)文件,符合 OpenFst 的格式定义。其中每一行首先是一个文本项,接着是一个数字项:
s5# head -3 data/lang/phones.txt
0
sil 1
a1 2
s5# head -3 data/lang/words.txt
0

1

2
在 Kaldi 中,这些文件被用于在这些音素符号的文本形式和数字形式之间进行转换。大多数情况下,只有脚本 utils/int2sym.pl、 utils/sym2int.pl 和 OpenFst 中的程序fstcompile 和 fstprint 会读取这些文件。
2)文件L.fst是FST形式的发音字典。其中,输入是音素,输出是词。
3)文件L_disambig.fst也是发音字典,但是还包含了为消歧而引入的符号,诸如#1、#2之类,以及为自环(self-loop) 而引入的#0。#0能让消岐符号“通过”(pass through)整个语法,这些都不用手动添加这些符号。
4)文件 data/lang/oov.txt 仅仅只有一行:
s5# cat data/lang/oov.txt

在训练过程中,所有词汇表以外的词都会被映射为这个词(UNK 即unknown)。“” 本身并没有特殊的地方,也不一定非要用这个词。重要的是需要保证这个词的发音只包含一个被指定为“垃圾音素”(garbage phone)的音素。该音素会与各种口语噪声对齐。在我们的这个特别设置中,该音素被称为,就是“spoken noise” 的缩写:
s5# grep -w UNK data/local/dict/lexicon.txt
SPN
5)文件 oov.int 包含的整数形式(从 words.txt 中提取的)
6)文件/lang/topo 则含有如下数据:
这里写图片描述
你不用手动创建data/lang/topo。这个文件指明了我们所用 HMM 模型的拓扑结构。在这个例子中,一个“真正”的音素内含 3 个发射状态,呈标准的三状态从左到右拓扑结构——即“Bakis” 模型。(发射状态即能“发射”特征矢量的状态,与之对应的就是那些“假”的仅用于连接其他状态的非发射状态)。
7) phones目录下有许多关于音素集的信息, 幸运的是,作为一个 Kaldi 用户,你没有必要去一一手动创建所有这些文件,因为我们有一个脚本“utils/prepare_lang.sh”能够根据更简单的输入为你创建所有这些文件。
s5# ls data/lang/phones
context_indep.csl disambig.txt nonsilence.txt roots.txt silence.txt context_indep.int extra_questions.int optional_silence.csl sets.int word_boundary.int context_indep.txt extra_questions.txt optional_silence.int sets.txt word_boundary.txt disambig.csl nonsilence.csl optional_silence.txt silence.csl
这些文件大多数有三个不同版本:一个“.txt”形式,如:
s5# head -3 data/lang/phones/context_indep.txt
sil
一个“.int” 形式,如:
s5# head -3 data/lang/phones/context_indep.int
1
以及一个“.csl” 形式,如:
s5# cat data/lang/phones/context_indep.csl
1
三种形式的文件包含的是相同的信息,所以我们只关注人们更易阅读的“.txt”形式。”context_indep.txt”包含一个音素列表,用于建立文本无关的模型。也就是说,对这些音素,我们不会建立需要参考左右音素的上下文决策树。实际上,我们建立的是更小的决策树,只参考中心音素和 HMM 状态。这依赖于“roots.txt”。
Phones文件夹里:
a) silence.txt 和 nonsilence.txt 分别包含静音音素列表和非静音音素列表。这两个集合是互斥的,且如果合并在一起,应该是音素的总集。在本例中,silence.txt与 context_indep.txt 的内容完全一致。我们说“非静音”音素,是指我们将要估计各种线性变换的音素。所谓线性变换是指全局变换,如 LDA 和 MLLT,以及说话人自适应变换,如 fMLLR。根据之前的实验,我们相信,加入静音对这些变换没有影响。
s5# head -3 data/lang/phones/silence.txt
SIL
s5# head -3 data/lang/phones/nonsilence.txt
a1
a2
a3
b) disambig.txt 包含一个“消岐符号” 列表 (见 Disambiguation symbols):
s5# head -3 data/lang/phones/disambig.txt
1
#1
#2

这些符号会出现在 phones.txt 中,被当做音素使用。
c) optional_silence.txt 只含有一个音素。该音素可在需要的时候出现在词之间:
s5# cat data/lang/phones/optional_silence.txt
SIL
(可选静音列表中的)音素出现在词之间的机制是,在发音字典的 FST 中,可选地让该音素出现在每个词的词尾(以及每段发音的段首)。该音素必须在phones/中指明而不是仅仅出现在 L.fst 中。
d) sets.txt包含一系列的音素集,在聚类音素时被分组(被当做同一个音素),以便建立文本相关问题集(在Kaldi 中,建立决策树时使用自动生成的问题集,而不是具有语言语义的问题集)。本设置中,sets.txt 将每个音素的所有不同词位的变体组合为一行:
s5# head -3 data/lang/phones/sets.txt
sil
a1
a2
e) extra_questions.txt 包含那些自动产生的问题集之外的一些问题:
s5# cat data/lang/phones/extra_questions.txt
sil
a1 ai1 an1 ang1 ao1 e1 ei1 en1 eng1 i1 ia1 ian1 iang1 iao1 ie1 in1 ing1 iong1 iu1 ix1 iy1 o1 ong1 ou1 u1 ua1 uai1 uan1 uang1 ueng1 ui1 un1 uo1 v1 van1 ve1 vn1
a2 ai2 an2 ang2 ao2 e2 ei2 en2 eng2 er2 i2 ia2 ian2 iang2 iao2 ie2 in2 ing2 iong2 iu2 ix2 iy2 o2 ong2 ou2 u2 ua2 uai2 uan2 uang2 ui2 un2 uo2 v2 van2 ve2 vn2
你可以看到,所谓一个问题就是一组音素。第一个问题是关于“静音音素”的,被作为发音字典中可选的静音词的表示,即不会出现在某个词中,而是单独成词,后面则是关于普通音素的词位信息。在具有语调和语气的设置中,extra_questions.txt 可以包含与之相关的问题集。
f) roots.txt 文件包含如何建立音素上下文决策树的信息:
head data/lang/phones/roots.txt
shared split sil
shared split a1
shared split a2
shared split a3
shared split a4
shared split a5
shared split aa
shared split ai1
shared split ai2
shared split ai3
暂时你可以忽略“shared”和“split”——这些与我们建立决策树时的具体选项有关。
一个HMM 中的 3 个状态(对静音来说有 5 个状态)共享一个根,且决策树的建立过程需要知道状态(的共享情况)。HMM 状态间共享决策树根节点,这就是 roots文件中“shared” 代表的意思。

Prepare _lang.sh脚本解读

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/bvngh3247/article/details/80787169
今日推荐