1. lattice
    在实际的语音识别系统中,最优路径不一定与实际字序列匹配,我们一般希望能够得到得分最靠前的多条候选路径,即N-best。为了紧凑地保存候选路径,我们一般采用lattice(词图)来保存识别的候选序列。lattice本质上是一个有向无环图。图上的每个节点代表一个词的结束时间点,每条边代表一个可能的词,以及该词发生的声学得分和语言模型得分。
    在这里插入图片描述
    在生成one-best结果时,只需要从最优结果处回溯,但是为了生成lattice,我们需要保留更多信息,具体就是生成每一个hist的时候保留多个候选alt,这样在回溯best hist的时候也访问alt来生成lattice。可以认为原始hist是有效信息再节点上的lattice,而上图中的lattice有效信息都在边上。在lattice上从左往右的任何一条路径,就构成一个识别结果,路径上每条边的声学得分相加,再加上路径对应的语言得分,就是整条路经的得分,通常取得分最大的前N条路径对应的词串作为识别的N-Best结果输出。上面lattice的生成用的语言模型往往不够精确,通常还需要在lattice上用更大的语言模型进行rescore。
  2. lattice剪枝
    原始的lattice可能会非常庞大,上图给出的只是一个很小的lattice,这是我们可以对lattice进行剪枝但是不影响最终的准确率。一种剪枝方法是对lattice进行前向后向打分,计算每条边的后验概率,然后删除后验概率很低的边。对上图进行剪枝后获得下图:在这里插入图片描述
    相比原图,上面的lattice简化了不少,但是最重要的信息并没有丢失。通过计算后验概率,我们可以很容易地知道每条边在整个lattice中的重要性。
    https://www.smwenku.com/a/5b83ca272b71777cb15c1388
  3. lattice操作中的函数
    latgen-faster-mapped:生成lattice
    lattice-scale:对lattice权重缩放。
    lattice-add-penalty:lattice中添加单词插入惩罚
    lattice-best-path:通过lattice生成one-best路径,转录或者对齐作为输出。
    lattice-align-words:转换lattice,使CompactLattice格式的弧与字词对应。
    lattice-align-phones:转换lattices,使CompactLattice格式的弧与音素对应。

https://pages.harryfyodor.xyz/2017/11/13/decoder-intro/
有了HCLG解码图,如何解码?
首先,假设输入的语音有T帧,我们将之构建成T+1的状态WFSA。边上的信息是上下文相关的HMM模型和相关的loglikelihood。把这一个WFSA和已经有的HCLG进行合并得到一个图。这个图叫做搜索图,而解码的过程就相当于在这个搜索图里面寻找最优路径,可以使用维特比算法加上剪枝来寻找最优路径。
在kaldi实现中,合成的搜索图的边信息需要包括图损失(graph cost)和语音损失(acoustic cost)。实际操作中,对每一个HCLG的边,计算每一帧的语音损耗,每过25ms进行一次剪枝。最后得到一个lattice,记为P。把P输入输出翻转,得到Q。翻转的目的是为了对每个词序列里的词都保留最佳的路线(此时的Q输入是单词,输出是一个一个概率分布),保留最好的分割方案。然后再编码为E。最后讲过一些优化,就可以得到最好的L。L的每一条路径都是当前语音输入的可能结果。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐