-
语音识别系统如何引入新词,而不用修改字典
——来自《语音识别:从入门到精通- 第一期》·40浏览
如果你字典里完全没有这个词,那么你不得不在字典里加入,否则你的解码是无法识别出来这个词的。
而且你的LM也要重新训练,使得LM有新词的语言模型概率。或者你可以指定一个较高的概率给它。
确实重训语言模型和重构图都会比较消耗时间。一个大概的数字,从几十G的文本,百万条字典,来统计一个3-gram可能要十几个小时(当然取决于机子);然后重构也大概是十几小时。
当然,解码器里有动态解码器,使用on-the-fly的compostiont操作,例如把HCL和G分成两部分,等等。但是缺点在于速度要慢于完整构图的HCLG,而且路径扩展等也有一定麻烦。所以一般会选择重新构建HCLG。(如果你想动态的处理lexicon,你可以看看"Transducer composition for“on-the-fly”lexicon and language model integration")
-
语音识别系统如何加标点
——来自《语音识别:从入门到精通- 第一期》·25浏览
通常都是先获得没有标点的识别结果,然后CRF或其它模型加标点。可以搜搜之前会议的论文,会有人做标点预测。
-
1)是的
2)epsilon就是不接收/输出任何符号。2-gram不存在,回退到1-gram,这个arc只是用来乘以回退系数的,所以什么也不接受,什么也不输出。
-
1. 首先你要知道,我们使用WFST-based解码器,构建HCLG的目的是把所有hmm跳转,音素上下文,字典,语言模型的所有信息统一的构建到一张网络里。这样形成一个搜索网络后,我们只需要在这个网络上搜索跳转,除了发射概率的p(o|s)从GMM或者DNN得到,其它的我们都可以在这个网络里得到,而不依赖任何外部信息。这样快速,简便,统一。所以构建G.fst的时候,我们把所有n-gram的信息都构建到图上。G.fst等价的表示了n-gram,为什么我们还要麻烦的把回退系数单独存到一个文件呢?在视频里我解释了怎么等价的把一个n-gram信息(即arpa file存的所有信息)转化到G.fst上(即wfst的形式表示)。
2. G.fst完全等价的表示了n-gram的所有信息。显然WFST上每一条通路都相当于一组概率相乘,在WFST是⊕操作,你会发现<cay>的arch概率是一样的,显然0-3-4-2的概率更高,也就是有2-gram我们会走2-gram,没有2-gram时候我们才回退到1-gram。而且你要注意你看到G.fst是把n-gram的信息直译的结果,方便理解,后面还会确定话最小化,来适合机器进行运算跳转,你就很难看到这种路径了。(当然,你这是一个非常棒的问题,核心在于P(w2|w1)是否大于P(w1)P(w2)。所以这样转化标准的说是一个近似。在绝大多数情况下,高阶n-gram的weight会优于低阶进行backoff的结果。所以基本没有问题。当然G.fst还有其它转化方法,有兴趣你可以看"“Generalized algorithms for constructing statistical language models",这种表示更准确,但是要更多的states和transitions,所以导致图会变大。但是最终结果基本没有差异。)
-
fstaddselfloops是kaldi的binary,只要你正确安装了kaldi,在src/fstbin下面会有。你可能是分步执行的时候没有". ./path.sh",使得系统无法找到binary。
-
解码-解码图表示1-Viterbi算法
——来自《语音识别:从入门到精通- 第一期》·42浏览
不是,Viterbi算法是动态规划算法,它的动态规划原理表明,如果最优路径在t时刻经过了结点i_t,那么这一路径从结点i_t到终点i_T的部分路径,对于从i_t到i_T的所有可能的部分路径,是最优的。只是实际过程中的剪枝会造成不精确。
-
解码-解码图表示1-Viterbi算法
——来自《语音识别:从入门到精通- 第一期》·42浏览
@yafuilee 之前没明白你的意思。你说的这种近似确实是对的,viterbi算法算出的是单一 路径的概率,而forward算法算出的是all paths的概率,如果你用一个孤立词去试试,你会发现概率差的还是比较多大。但是解码中你无法使用"forward算法",在实际该过程中你往往要解决的是找到最优的word sequence而不是single word。当你找word sequence时候,假设你还是用trellis,横轴为frame(T),纵轴为所有的word的state(N),你可能认为算法复杂度是O(N^2T),但实际不是。举个例子,当两个词w1,w2都到了结尾状态,他们都要跳到w3,此时,如果你用的是"forward算法",你前向累加出来的概率是P(o|w1w3)+P(o|w2w3),依次类推,越往后你越是所有可能路径的概率和。所以你如果想用"forward算法",你要分别对都有可能的word sequence进行求解,可以说这有无数种可能,这是指数级的算法复杂度,而且你无法估测有多少词。所以你只能用"Viterbi算法"近似,这样保证算法复杂度是O(N^2T),才是可行的解法。
-
第七章中打折率的问题
——来自《语音识别:从入门到精通- 第一期》·30浏览
d_c计算不是N,你带入laplace平滑的例子就很显然,用图中c_i^*除以c_i和N,V都有关。
-
第八章WFST若干问题
——来自《语音识别:从入门到精通- 第一期》·25浏览
1.每次compose之后都会进行确定话和最小化,我在倒数第4页ppt有讲到,比如L和G进行compose之后,就要确定化,最小化。然后再和C进行后续处理。
2.transducer主要是转换,acceptor主要是接受判断。
3.看确定化定义,weight的前移和后移都没有问题,只要保证是等价的fst就可以。
4.看最小化的定义,目标是创建等价fst,并且有做少的state和arc。只要能达到这个目的,weight的前后移动并没有关系。
-
WFST上面的weight就是LM概率,transition概率等的组合,存在图上的时候是-ln域。
likelihood是贝叶斯公式里的通常叫法,还有先验prior,后验posterior。把特征帧带入GMM获得的是likelihood,把特征带入NN获得的是posterior,然后转化为likelihood给解码使用。通常是ln域的。用作cost时候取负数即可。
cost,顾名思义,就是花费代价,越大越差。-ln域的值就是这个特点,值越大,概率越低。
-
关于第八章解码的问题
——来自《语音识别:从入门到精通- 第一期》·28浏览
1.可以。
2.G中存在,你在做语言模型的时候用的也是这个字典,会因为打折算法给这些unseen event一个概率。字典中有这个word,自然L.fst中有它和音素的映射关系。
-
1.有
2.构建C的时候会需要你三音素的位置信息(宽度和中心音素位置),构建H的时候需要tree,帮你决定pdf(每个状态的发射概率密度函数)和cd-phone的对应关系。
3.不用
4.H是输入transition-id输出cd-phone-id,C是输入cd-phone-id输出phone-id,L是输入phone-id输出word-id,G是输入输出word-id。为了能进行C和L的compose,你需要让C的olabel是合理的phone-id。具体输出中心phone-id还是右边phone-id,只是不同工具的作者不同的选择。
-
1. 我在课程里说过了,三元组是旧的kaldi,现在用到四元组。可以在回去听一下H.fst那页的ppt视频。
2. 是,决策树就是决定哪些音素的哪些状态共享同一个pdf。
-
第八章的几个问题(1)
——来自《语音识别:从入门到精通- 第一期》·50浏览
1. 这是翻译Takaaki Hori的书啊,你可以在网上搜搜。原本最直接的想法是,把输入的speech信号转化成context-dependent phone(也就是图中的'x'转化成(s)s(t)这种上下文相关的phone),然后weight来表示transition概率和发射概率。但是这种无法形成,所以拆分成了图里的(a)和(b)两部分。这里很关键的一点你要注意,(a)是实际的自动机,而(b)只是decoder里面的一段代码,画出来只是帮助你理解,它类似于自动机,"实际不存在"。这里(a)类似于我们使用的H.fst,把input的状态(e.g. S4)映射到了cd phone(e.g. (s)s),然后把transition概率编码到weight上。就像课件里讲的,这里input给出状态,实际是为了找到对应pdf-id,从而计算"虚拟的"(b)中的发射概率;再加上pdf-id与HMM状态是一对多的。所以我们介绍的H.fst的input label是transition-id,然后output label是cd phone,weight编码了transition概率,类似于(a)。而(b)这部分,实际上你有了transition-id,就找到了pdf-id,就能求出发射概率,只是代码里LogLikelihood做的事情。
2. 我觉得你应该理解了。就像我视频了说的,WFST相当于从LM扩展下来的,中间以来了Lexicon,HMM topo。所以你解码是约束在wfst解码图里的,每个"组件"都有在做这种约束。
3. (更新)理解正确。每当获得新模型或者使用新LM等后都需要用utils/mkgraph.sh构图,之后才能解码。
-
第八章的几个问题(1)
——来自《语音识别:从入门到精通- 第一期》·50浏览
哦,你指的是这个,那你说的没错,。这和你每次更细模型之后都要调用utils/mkgraph.sh一个道理,你需要对新的模型执行make-h-transducer等操作,然后重新构图。
-
kaldi解码时HMM-DNN和解码图的关系
——来自《语音识别:从入门到精通- 第一期》·53浏览
1&2. 直接在HCLG上运行跳转。所有LM,转移概率都在HCLG的weight上,而每个arc的input是transition-id可以找到对应的pdf-id。
粗略的说:一帧数据来了,HCLG上要从一个状态跳转到另一个状态,他么之间有一个arc,从input label的transition-id找到对应的pdf-id,你就能算出来acoustic score, 然后arc上的weight就是graph score(相当于LM score,多音字概率,转移概率等)。这就相当于你HMM发生了一次跳转。
3.我在课程里讲H的时候有解释过transition-id的结构。pdf-id到transition-id是一对多,但是transition-id到pdf-id是一对一。
-
kaldi解码时HMM-DNN和解码图的关系
——来自《语音识别:从入门到精通- 第一期》·53浏览
神经网络的输出是posterior,通常你要减去prior,然后拿到pdf-id对应的输出结点的值才是acoustic score。
-
第七章有关打折率一个疑惑
——来自《语音识别:从入门到精通- 第一期》·29浏览
对于tri-gram,你是P(w3|w1w2),如果w1w2都不存在,w1w2w3也肯定不存在,对这个没有打折的说法了,不存在除零。你打折为了剩下 一部分概率给unseen events,即这些出现为0次的。所以你打折是在出现过的seen events上打折。
-
关于第七章ppt最后的解码流程问题.....
——来自《语音识别:从入门到精通- 第一期》·42浏览
不会,解码会限制在解码图里,由LM扩展而来,不是一个纯逆向过程,看一下第八章开始。
-
使用srilm计算ppl时的一些疑惑
——来自《语音识别:从入门到精通- 第一期》·65浏览
上面同学帮忙解答了。
1. LM训练时候字典可以是你自己指定的,不一定是train集合里提取的
2&3. thch30提供的语言模型时候从一个外部的大语料库里训练的,并且它用的字典更大。从OOV你就可以看出来,之前字典某些词是没有的。引入大字典后,概率相当于稀疏了。
工具包里实际计算N时候N=word数+sentence数-OOV数(250 sentences, 4917 words, 18oovs,表示总共250个句子,4917个词,这4917个词中有18个oov词)。一般会引入一个<unk>解决OOV。
你可以自己设计一个小一点的集合,比如一句话,来理解各个参数的用处。