lattice

lattice

解释

词格,用topN中的路径重新生成一个图,这个图就叫lattice,就是在hclg进行解码,然后根据topN的解码结果,取出在hclg具体走的路径,构成的图,可以理解成从hclg只保留所需要的值,大部分无用的信息舍弃,最后是topN的word序列构成的fst;

语音识别中的lattice与confusion network

kaldi理解WFST,HCLG,lattice

生成lattice

在生成one best结果时,只需要从最优结果处回溯,但是为了生成lattice,我们需要保留更多信息。具体就是在生成每一个hist的时候保留多个候选alt,这样在回溯best hist的时候也访问alt来生成lattice。

在lattice上从左向右的任何一条路径,就构成一个识别结果,路径上每条边的声学得分相加,再加上路径对应的语言得分,就是整条路径的得分,通常取得分最大的前 N 条路径对应的词串作为识别的 N-Best 结果输出。上面lattice的生成用的语言模型往往不够精确,通常还需要在lattice上用更大的语言模型进rescore。

lattice含义

在实际的语音识别系统中,最优路径不一定与实际字序列匹配,我们一般希望能够得到得分最靠前的多条候选路径,即N-best。为了紧凑地保存候选路径,防止占用过多内存空间,我们一般采用lattice(又叫词图)来保存识别的候选序列。lattice本质上是一个有向无环(directed acyclic graph)图。图上的每个节点代表一个词的结束时间点,每条边代表一个可能的词,以及该词发生的声学得分和语言模型得分。
img

Lattice结构

FST的形式,weight包括两部分(graph cost和acoustic cost),输入是transition-ids,输出是words。
其中weight的graph cost包含LM+transition+pronunciation三部分。

CompactLattice结构

和lattice相似,区别在于它是接收机FSA,输入和输出一样(都是words),weight包含两部分(权重和transition-ids),相比于Lattice,CompactLattice把输入的transition-ids转移到weight上面。

lattice保证每一个word-sequence只对应lattice中的一条路径。

lattice剪枝

原始lattice可能会非常庞大,这时我们可以对lattice进行剪枝但是不影响最终的准确率。一种剪枝方法是对lattice进行前后向打分,计算每条边的后验概率,然后删除后验概率很低的边。

confusion network

混淆网络是一种特殊的lattice,由原始lattice经过变换生成。它要求lattice中的每条路径都必须经过所有的节点。如下图所示:

img

简单描述一个近似于srilm中采用的混淆网络生成算法:首先进行前后向概率打分计算每条边的后验概率;其次根据后验概率对lattice进行剪枝;再次从原始lattice中选择一条得分最高的路径当作初始混淆网络(路径中的节点即为混淆网络中的节点);最后就开始逐步将其他的边对齐添加到上述初始混淆网络中。特别地,如果在添加某条边到某节点中时发现已经有边指向该边并且也添加到该节点之后,则创建一个新的节点,让之前的边都指向新节点,要添加的边则从新节点指向之前的老节点。
相比于lattice,我们可以很容易从混淆网络中获取one best结果,只需要从每一段中选择后验概率最大的边即可。混淆网络作为lattice的简化版,会引入原始lattice中不存在的路径。但是通常情况下,用混淆网络获取的one best结果要好于原始的one best。混淆网络还有一个好处,我们可以很容易获取每个时刻相互竞争的词有哪些,怀疑苹果自带的输入法即采用了混淆网络来修改候选词。

kaldi

生成 lattice 的唯一解码器是定义在 decoder/lattice-simple-decoder.h 中的类 LatticeSimpleDecoder,它被 gmm-latgen-simple.cc中调用。