语音识别中graph和lattice模块用到WFST。

1.WFST基本概念

FST和WFST的区别是后者转移路径上附有权重。
WFST和WFSA(加权有限状态接收器)的区别是前者的状态转移上的label既有输入又有输出,而后者只有label。
用WFST来表征ASR中的模型(HCLG),可以更方便的对这些模型进行融合优化,作为ASR解码器。
定义半环结构来表征一个WFST:
在这里插入图片描述

2.WFST三大算法:Composition(组合构图)、Determinization(确定化操作)、Minimization(最小化操作)

WFST中的优化操作,包括空转移去除(epsilon removal)、确定化操作(determinization),权重推移(weight pushing)和最小化操作(minimization)。
1)Composition:
Composition是将两个不同级的WFST进行组合。
例如:语音识别中发音词典的WFST即L.fst是音素对词的映射,语言模型的WFST即G.fst是词对受语法约束的词的映射,将L.fst和G.fst进行Compostion就可以得到音素对受语法约束的词的映射。语音识别的解码器就是HCLG四个不同级的WFST依次进行Composition最后形成HMM的状态对受语法约束的词的映射。
下图是a.fst和b.fst 进行Composition得到c.fst.
Composition操作实际就是找出满足下面这个条件的转移:
第一个WFST的某个转移上的输出标签等于第二个WFST的某个转移上的输入标签,然后把这些转移上的label和weight分别进行操作。
伪代码流程图:需要注意的是,这是一个epsilon-free的算法。即第一个WFST的任何一个转移上的输出label不能为空(epsilon)且第二个WFST的任意转移上的输入label也不能为空(epsilon).
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
伪代码流程图:需要注意的是,这是一个epsilon-free的算法。即第一个WFST的任何一个转移上的输出label不能为空(epsilon)且第二个WFST的任意转移上的输入label也不能为空(epsilon).
该算法使用一个队列S,队列特点是先进先出:
对两个WFST T1和T2
1-2是把两个WFST的初始状态赋给Q和S,Q用来统计出现过的所有状态对的集合,S用来记录此时的状态对能达到的所有状态对的集合;
3是如果S不为空,则执行下面的4-16行:
4-5行是把队列S的头元素赋给状态对(q1,q2),删除该元素,刚开始肯定是初始状态对,所以一定会执行6-8行。
6-11行是为了判断一下是否为初始状态和结束状态。
12-16行是状态更新核心部分:
找出所有T1中离开状态q1的所有转移和T2中离开状态q2的所有转移,并且对比T1的这些转移的输出label是否等于T2的这些转移的输入label,即lo[e1]=i[e2].
如果等于的话则判断他们的目的状态是否在Q中(Q是统计所有出现过的状态,此时判断是否出现了新状态)。
如果是新状态的话则将它加入到Q和S的集合中。
16行完成Compostion操作,状态对(q1,q2)到状态(n[e1],n[e2])的转移,转移上的输入标签是i[e1],输出标签是o[e2],权重是w[e1]Xw[e2]。如果是Tropical半环(语音识别中一般用这个)的话即为权重值相加。
对于更一般的情况即包括epsilon的情况,需要进行特殊处理。
即把T1中转移上输出标签为epsilon的符号统一换为epsilon0并且把每个状态加上一个自循环(self-loop),转移路径上的标签为epsilon:epsiloni;把T2转移上输入标签为epsilon的符号统一换为epsiloni,并且统一地把每个状态加上一个自循环(self-loop),转移路径上的标签为epsilon0:epsilon,如下图所示:

在这里插入图片描述
我们把epsiloni,epsilon0看作是常规的符号,就可以进行composition操作了,但这样会产生冗余的路径(redundant paths),引入filter的概念解决冗余问题,即设计一个名为filter的WFST——F,然后先把WFST T1和F进行Composition,接着把生成的结果和T2进行Composition,如下图所示:

在这里插入图片描述
2状态的filter和3状态的filter的选择是根据我们的需求来的:如果我们想要空转移的数目和原来相同的话我们就选择2状态,如果我们想要一个更简化的WFST的话就选择3状态的。
2)epsilon removal
epsilon removal是用来去除空转移的操作(WFST中输入标签和输出标签都为空时才算),如果不进行这一步直接进行determinization也是可以的,可以把空符号当作一个regular的符号,但这样的结果也不是确定的。
伪代码如下所示:
在这里插入图片描述
首先定义一个状态集合叫epsilon closure,它是当前状态通过若干空转移(epsilon:epsilon)可以到达的状态集合,如上图(a)的初始状态0的epsilon closure就是{1,2}.
然后找出每个状态的epsilon closure。
然后找出epsilon closure中的每个状态转移到另一个状态不为空的路径,记录它的所有信息。
最后添加新的转移,从源状态到不为空的那个状态所到达的状态,输入输出信息不变,权重相X,然后把空转移去除掉。
效果图:
在这里插入图片描述
结合上图的例子,0状态的epsilon closure是{1,2},源状态就是0,对于1状态,它到3状态的转移为c不为空,则新生成的转移就是从0状态到3状态,标签为c,权重为0到1和1到3的权重相加(对tropical半环);同样对2状态来说,它到4状态的转移为a不为空,到5状态的转移为b也不为空,则可以新生成两条转移,分别是0状态到4状态标签为a和0状态到5状态标签为b,权重也是累加。
3)determinization
determinization是最重要的优化操作,可以大大地加快运行的时间,尤其对语音识别这样的庞大系统,是必不可少的。
determinization的功能其实就是当离开某个状态的转移上的输入标签相同时,采取某种机制只保留其中的一条而不影响整个系统的结果,这样离开某个状态的转移就是确定的了,因为每输入一个标签,它都会到达唯一一个确定的状态。
下面是一个简单的例子(对于WFSA来说,转移上只有输入标签而没有输出标签,而WFST要复杂一些):
在这里插入图片描述
图(a)是一个基于tropical半环的WFSA,很明显它是不确定的,因为当输入0时既可以到达1状态有可以到达2状态;于是我们需要对它采取确定化操作,输入a时只保留一条转移,算法中采用了+操作,对于tropical半环就是取min值,所以这里保留权重为1的转移。到达状态是一个带残余权重(residual weight)的状态集合,如这里的(1,0)和(2,1),分别代表残余权重为0的状态1和残余权重为1的状态2,这个残余权重是必要的,因为它记录了之前被删除的那条权重为2的转移的信息,而且在后面的操作中还要继续传递,如后面的d/7转移(原来是d/6).

下面是更复杂的WFST的情况,与前面的WFSA不同的是,WFST的每个状态转移上还有输出标签,因此我们不但要有残余权重来记录权重信息,还要有“残余”输出来记录输出信息。算法中每个状态我们用三元组集合来表征:{(p,z,v)|p->Q,z->B,v->K},其中p代表该状态,z代表残余输出(leftover output label),v代表残余权重(residual weight).
下面是determinization算法的伪代码:
在这里插入图片描述
这里和composition类似,也用了Q来统计出现过的所有三元组,用队列S来记录新的三元组并作循环条件。
第1-3行是初始化操作。
第8-11行是核心操作,用来生成新的转移,连接了当前状态和目的状态。
第8行是输出标签的操作,/\是string半环里的操作,取共同的元素,如果没有
则设为空,如X/\Y=epsilon。
第9行是权重的操作,如果tropical是半环,则是取权重值小的那条转移;
第10行是新生成的到达状态,即三元组的集合,里面复杂的那一串操作就是计算“残余”输出和残余权重的过程。
第14-16行是对结束状态的操作,需要赋一个结束权重值。
下面是一个效果图:
在这里插入图片描述
从上图我们可以看出首先初始化,对初始状态生成一个权重为0.2的三元组{(0,epsilon,0.2)},然后发现它的两条转移的输入都为a标签,则权重值为小的那个(tropical半环)0.5,输出标签为A/\Y=epsilon,所以转移写为a:epsilon/0.5,到达状态为{(1,X,0),(2,Y,1.2-0.5=0.7)},这就实现了状态1和状态2的融合;再看新生成的这个状态有两条转移的输入标签都为b,则就需要用户用同样的方式把状态4和状态6进行融合;其它部分和上面类似,这样就生成了图(b).
但是需要注意的是,这还不算完。。。
determinization之后我们还需要把所有状态renumber一下并且添加一个真正的结束状态,我们令转移上的输入为空,结果如下图所示:
在这里插入图片描述
4)weight pushing

5)minimization

3.WFST在语音识别中的应用,即HCLG操作

Logo

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

更多推荐