建立"lang"目录

data/lang/ 目录下有很多不同文件,所以我们提供了一个脚本为你创建这个目录,你只需要提供一些相对简单的输入信息:

utils/prepare_lang.sh data/local/dict "<UNK>" data/local/lang data/lang

这里,输入目录是data/local/dict/, <UNK> 需在字典中,是标注中 所有OOV词的映射词(映射情况会写入data/lang/oov.txt 中)。data/local/lang/ 只是脚本使用的一个临时目录,data/lang/才是输出文件将会写入的地方。

作为数据准备者,你需要做的事就是创建 data/local/dict/这个目录。该 目录包含以下信息:

s5# ls data/local/dict extra_questions.txt lexicon.txt nonsilence_phones.txt optional_silence.txt silence_phones.txt

(实际上还有一些文件我们没有列出来,但那都是在创建目录时所遗留下的临时文件,可以忽略)。下面的这些命令可以让你知道这些文件中大概都有些什么:

s5# head -3 data/local/dict/nonsilence_phones.txt IY B D s5# cat data/local/dict/silence_phones.txt SIL SPN NSN LAU s5# cat data/local/dict/extra_questions.txt s5# head -5 data/local/dict/lexicon.txt !SIL SIL -'S S -'S Z -'T K UH D EN T -1K W AH N K EY

正如你看到的,本设置(Switchboard)中,这个目录下的内容都非常简单。 我们只是分别列出了“真正”的音素和“静音”音素,一个叫 extra_questions.txt 的空文件,以及一个有如下格式的lexicon.txt:

<word> <phone1> <phone2> ...

注意:lexicon.txt中,如果一个词有不同发音,则会在不同行中出现多次。如果你想使用发音概率,你需要建立 lexiconp.txt 而不是 lexicon.txt。

lexiconp.txt 中第二域就是概率值。 注意,一个通常的作法是,对发音概率进行归一化,使最大的那个概率值为1,而不是使同一个 词的所有发音概率加起来等于1。 这样可能会得到更好的结果。 如果想在顶层脚本中找一个 与发音概率相关的脚本,请在egs/wsj/s5/run.sh 目录下搜索pp。

需要注意的是,在这些输入中,没有词位信息,即没有像_B和_E这样的后缀。 这是因为脚本prepare_lang.sh添加这些后缀。

从空的extra_questions.txt文件中你会发现,可能还有些潜在的功能我们没有利用。 这其中就包括重音和语调标记。对具有不同重音和语调的同一音素,你可能会想用不同的标记去表示。 为展示如何这样做,我们看看在另外一个设置egs/wsj/s5/下的这些文件。结果如下:

s5# cat data/local/dict/silence_phones.txt SIL SPN NSN s5# head data/local/dict/nonsilence_phones.txt S UW UW0 UW1 UW2 T N K Y Z AO AO0 AO1 AO2 AY AY0 AY1 AY2 SH s5# head -6 data/local/dict/lexicon.txt !SIL SIL <SPOKEN_NOISE> SPN <UNK> SPN <NOISE> NSN !EXCLAMATION-POINT EH2 K S K L AH0 M EY1 SH AH0 N P OY2 N T "CLOSE-QUOTE K L OW1 Z K W OW1 T s5# cat data/local/dict/extra_questions.txt SIL SPN NSN S UW T N K Y Z AO AY SH W NG EY B CH OY JH D ZH G UH F V ER AA IH M DH L AH P OW AW HH AE R TH IY EH UW1 AO1 AY1 EY1 OY1 UH1 ER1 AA1 IH1 AH1 OW1 AW1 AE1 IY1 EH1 UW0 AO0 AY0 EY0 OY0 UH0 ER0 AA0 IH0 AH0 OW0 AW0 AE0 IY0 EH0 UW2 AO2 AY2 EY2 OY2 UH2 ER2 AA2 IH2 AH2 OW2 AW2 AE2 IY2 EH2 s5#

你可能已经注意到了,nonsilence_phones.txt中的某些行,一行中 有多个音素。这些是同一元音的与重音相关的不同表示。 注意,在CMU版的字典中, 每个音素有4种表示:例如,UW UW0 UW1 UW2。 基于某些原因,其中 一种表示没有数字后缀。行中音素的顺序没有关系。通常,我们建议用于将每个“真实音素” 的不同形式都组织在单独的一行中。 我们使用CMU字典中的重音标记。文件extra_questions.txt中只有一个问题 包含所有的“静音”音素(实际上这是不必要的,只是脚本 prepare_lang.sh 会添加这么一个问题),以及一个涉及不同重音标记的问题。 这些问题对利用重音标记信息来说是必要的,因为在 nonsilence_phones.txt中 每个音素的不同重音表示都在同一行,这确保了他们在 data/lang/phones/roots.txt和 data/lang/phones/sets.txt 也属同一行,这又反过来确保了它们共享同一个(决策)树 根,并且不会有决策问题弄混它们。因此,我们需要提供一个特别的问题,能为决策树的建立过程 提供一种区分音素的方法。 注意:我们在sets.txt和roots.txt中 将音素分组放在一起的原因是,这些同一音素的不同重音变体可能缺乏足够的数据去稳健地估计 一个单独的决策树,或者是产生问题集时需要的聚类信息。 像这样把它们组合在一起,我们 可以确保当数据不足以对它们分别估计决策树时,这些变体能在决策树的建立过程中“聚集在一起”(stay together)。

写到这里我们需要提一点,脚本utils/prepare_lang.sh支持很多选项。下面是该脚本 的用法,可让你们了解这些选项都有哪些:

usage: utils/prepare_lang.sh <dict-src-dir> <oov-dict-entry> <tmp-dir> <lang-dir> e.g.: utils/prepare_lang.sh data/local/dict <SPOKEN_NOISE> data/local/lang data/lang options: --num-sil-states <number of states> # default: 5, #states in silence models. --num-nonsil-states <number of states> # default: 3, #states in non-silence models. --position-dependent-phones (true|false) # default: true; if true, use _B, _E, _S & _I # markers on phones to indicate word-internal positions. --share-silence-phones (true|false) # default: false; if true, share pdfs of # all non-silence phones. --sil-prob <probability of silence> # default: 0.5 [must have 0 < silprob < 1]

一个可能的重要选项是--share-silence-phones。 该选项默认是false。 如果该选项被设为true, 所有静音音素——如静音、发生噪声、 噪声和笑声——的概率密度函数(PDF,高斯混合模型)都会共享,只有模型中的转移概率不同。 现在还不清楚为什么这样做有用,但我们发现者对IARPA的BABEL项目中的广东话数据集非常有效。 该数据集非常乱,其中有很长的未标注的部分,我们试着将其与一个特别标记的音素对齐。 我们怀疑训练数据可能没能成功正确对齐,而且基于某些不明原因,将上述选项设置为true则 改变了结果。

另外一个可能的重要选项是--sil-prob。 通常,对这些选项我们所作的实验都不同,所以 对具体如何设置也不能给出非常详细的建议。

results matching ""

    No results matching ""