解码任务

给定声学观测O=o1,o2,,oTO = o_1, o_2, … , o_T,找到最可能的词序列W=w1,w2,,wNW = w_1, w_2, … , w_N,这一过程称为解码,即把观测到的声音信号,转换为对应的文字的过程。

解码公式

W^=argmaxwP(WO)=argmaxwP(OW)P(W)\hat { W }=\underset{w}{\arg \max } P\left(W | O \right) \\ = \underset{w}{\arg \max } P\left(O | W \right) * P\left(W\right)

式中,W^\hat { W }是解码的结果,$ P\left(O | W \right)使用声学模型来刻画,使用声学模型来刻画,P\left(W\right)$使用语言模型来刻画。

维特比算法根据观测的声学特征,确定概率最大的HMM状态序列,有了状态序列,就能恢复词序列。但是,当词的规模很大时,只使用状态序列去生成词序列会有很大误差,需要通过加入语言模型,去约束词序列的生成,获得更准确的结果。

解码器

为了在实际任务中进行高效、准确的解码,需要设计实现解码器,通过一系列的优化,加快解码速度。

常见的优化策略

  1. 剪枝(Pruning):
  • Beam Search:每帧只保留Best Path以及与Best Path距离小于beam-threshold的tokens
  • Histogram Pruning:每帧只处理前Top N个tokens
  1. 多阶段解码(Multi-stage decoding)

  2. A* 解码(A* decoding)

  3. 树状字典(Tree structured lexicons)

  4. 语言模型超前使用(Language model Look-ahead)

解码工具

WFST

WFST介绍

概述

WFST是Weighted Finite-state Transducer的缩写,即“加权有限状态转换器”。如图所示,每个转换器定义了一个从起始状态到终止状态的转换规则,对于满足规则的一个输入序列,转换器将其转换为一个输出序列,并赋予一个权重。

要定义一个WFST,除了要定义状态及转换规则外,还需要确定一个“半环”,这个“半环”定义了WFST上权重的计算法则,用于计算转换序列的总权重。此外,“半环”的性质对WFST的转换和操作,起着至关重要的作用。

半环

概念

半环是一种代数结构,一个半环定义在某个元素集合上,包含两种基本操作:⊕(加操作)和⨂ (乘操作),此外,还定义了两个特殊元素:0ˉ\bar 0零元 和1ˉ\bar 1幺元

一个半环需要满足以下计算规则:

  • 加操作有交换律,结合律,与零元相加为本身
  • 乘操作有结合律,于幺元乘为本身
  • 分配律:w1(w2w3)=(w1w3)(w1w2))w_1⨂ (w_2⨁w_3) = (w_1⨂w_3)⨁(w_1⨂w_2))
  • 任意数与零元乘操作为零元

常用的半环

常用的半环有:

Name Set ⊕(Plus) ⊗(Times) 0(Zero) 1(One)
Boolean {0, 1} 0 1
Real [0, ∞] + * 0 1
Log [-∞, ∞] log(ex+ey)-log(e^{-x} + e^{-y}) + 0
Tropical [-∞, ∞] min + 0

半环上的运算

如下图所示,半环上的常用运算主要有“组合”和“优化”两类,其中“优化”包括:空串移除、确定化、权重前移、最小化等。

组合(Composition)

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

空串移除(Epsilon-Removal)

定义:移除WFST中所有的ϵ:ϵ\epsilon:\epsilon弧,从而精简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)