语音识别笔记(6)-解码器和WFST
解码任务
给定声学观测,找到最可能的词序列,这一过程称为解码,即把观测到的声音信号,转换为对应的文字的过程。
解码公式
式中,是解码的结果,$ P\left(O | W \right)P\left(W\right)$使用语言模型来刻画。
维特比算法根据观测的声学特征,确定概率最大的HMM状态序列,有了状态序列,就能恢复词序列。但是,当词的规模很大时,只使用状态序列去生成词序列会有很大误差,需要通过加入语言模型,去约束词序列的生成,获得更准确的结果。
解码器
为了在实际任务中进行高效、准确的解码,需要设计实现解码器,通过一系列的优化,加快解码速度。
常见的优化策略
- 剪枝(Pruning):
- Beam Search:每帧只保留Best Path以及与Best Path距离小于beam-threshold的tokens
- Histogram Pruning:每帧只处理前Top N个tokens
-
多阶段解码(Multi-stage decoding)
-
A* 解码(A* decoding)
-
树状字典(Tree structured lexicons)
-
语言模型超前使用(Language model Look-ahead)
解码工具
WFST
WFST介绍
概述
WFST是Weighted Finite-state Transducer的缩写,即“加权有限状态转换器”。如图所示,每个转换器定义了一个从起始状态到终止状态的转换规则,对于满足规则的一个输入序列,转换器将其转换为一个输出序列,并赋予一个权重。

要定义一个WFST,除了要定义状态及转换规则外,还需要确定一个“半环”,这个“半环”定义了WFST上权重的计算法则,用于计算转换序列的总权重。此外,“半环”的性质对WFST的转换和操作,起着至关重要的作用。
半环
概念
半环是一种代数结构,一个半环定义在某个元素集合上,包含两种基本操作:⊕(加操作)和⨂ (乘操作),此外,还定义了两个特殊元素:零元 和幺元。
一个半环需要满足以下计算规则:
- 加操作有交换律,结合律,与零元相加为本身
- 乘操作有结合律,于幺元乘为本身
- 分配律:
- 任意数与零元乘操作为零元
常用的半环
常用的半环有:
| Name | Set | ⊕(Plus) | ⊗(Times) | 0(Zero) | 1(One) |
|---|---|---|---|---|---|
| Boolean | {0, 1} | ∨ | ∧ | 0 | 1 |
| Real | [0, ∞] | + | * | 0 | 1 |
| Log | [-∞, ∞] | + | ∞ | 0 | |
| Tropical | [-∞, ∞] | min | + | ∞ | 0 |
半环上的运算
如下图所示,半环上的常用运算主要有“组合”和“优化”两类,其中“优化”包括:空串移除、确定化、权重前移、最小化等。

组合(Composition)
定义:如果一个转换器A将序列x映射到序列y伴随着权重a,并且转换器B将序列y映射到序列z伴随着权重b,那么组合的转换器将序列x映射到序列z,权重为a ⨂ 𝑏。

空串移除(Epsilon-Removal)
定义:移除WFST中所有的弧,从而精简WFST的结构,提高效率。

确定化(Determinization)
定义:创建等价的FST,使任意一个状态都没有两个相同input label的出弧
条件:这个FST是functional的,即每一个输入序列可以转换成独一无二的输出序列

权重前移(Weight Pushing)
定义:在不改变WFST的前提下,尽可能将弧的权重转移到初始状态上。
前移的目的是使解码过程中能尽早确定转换序列的权重,从而快速剪枝,避免不必要的搜索。

最小化(Minimization)
定义:创建等价的FST,拥有最少的状态数和弧数

其他操作
- 弧排序(ArcSort):根据input label或者output label排序每个state的arcs。
- 链接(Connect):剪枝FST,去掉所有不在成功路径(从初始状态到终止状态)的state和arcs。
- 相等(Equal): 确定两个FST(A和B)有相同数量和顺序的state,arcs。
- 等价(Equivalent):确定两个不含epsilon的确定化状态机(A和B)等价,即对于相同的输入,有相同输出和权重。
HCLG
从音频信号到词的识别过程,可以分解为4个阶段,依次是:HMM状态->三音素->单音素->词,分别对应4个WFST模型,他们的名称和各自的输入输出如下表所示:
| 名称 | Input | Output |
|---|---|---|
| H (HMM) | HMM状态(transition-id kaldi) | 上下文相关音素 |
| C (Context-Dependency) | 上下文相关音素 | 音素 |
| L (Lexicon) | 音素 | 词 |
| G (grammar/language model,acceptor) | 词 | 词 |
将这4个WFST进行合并,获得一个HCLG解码图。在HCLG中,每个arc的ilabel=transition-id, olabel=word-id, weight
获得HCLG这个WFST之后,解码操作就是在图上的搜索
Lattice
根据官网的定义:lattice是一个有限状态转换器,他的输入和输出可以是任何FST的label(通常是transition-ids 和 words),其权重包含声学模型、语言模型、转换的权重。
与HCLG的关系
在Kaldi中,HCLG和Lattice在数据结构上,都是FST。在用途上,HCLG是完整的解码图,而Lattice是某条特定的语音在完整的解码图HCLG上匹配到的最优的N条路径(把到达终点的
tokens走过路径的信息绘制在一张图里),相比只给出一条最优路径,给出多条路径和各自权重能够方便进行后处理,如重打分等。

在Kaldi里有Lattice和CompactLattice,是一个事物的两种存储形式,可以相互转化,在外观上都和HCLG相似,由state和arc组成, 从中可以知道概率分数和时间。
Lattice的arc:ilabel=transition-id, olabel=word-id, weight=(graph_cost, acoustic_cost)
CompactLattice的arc:ilabel=olabel=word-id, weight=(graph_cost, acoustic_cost, transition-id
sequence)



