小白的WFST之路


小白一枚,最近才开始接触WFST,理论知识和代码能力都较为欠缺,这篇博客主要是自己写的一些记录,有错误之处,请大力斧正。

理论知识

基础知识

在这里插入图片描述

WFST八元组

定义在数据集 K K K上的WFST用八元组来表示:
T = ( Σ , Δ , Q , I , F , E , λ , ρ ) T=(\Sigma, \Delta, Q, I, F, E, \lambda, \rho) T=(Σ,Δ,Q,I,F,E,λ,ρ)
以上面的图 ( c ) (c) (c)为例,

符号含义图例
Σ \Sigma Σ有限的输入集 { a , b , c } \{a,b,c\} {a,b,c}
Δ \Delta Δ有限的输出集 { x , y , z } \{x,y,z\} {x,y,z}
I I I初始状态集 { 0 } \{0\} {0}
F F F结束状态集 { 2 } \{2\} {2}
E E E状态转移集 { ( 0 , a , x , 0.3 , 1 ) , ( 1 , b , y , 0.4 , 2 ) , ( 2 , c , z , 0.6 , 2 ) } \{(0,a,x,0.3,1),(1,b,y,0.4,2),(2,c,z,0.6,2)\} {(0,a,x,0.3,1),(1,b,y,0.4,2),(2,c,z,0.6,2)}
λ \lambda λ初始状态权重 0.1 0.1 0.1
ρ \rho ρ结束状态权重 0.7 0.7 0.7
WFST半环及操作

在这里插入图片描述

WFST三大算法
1.(Composition)合并

如果一个转换器A将序列x映射到序列y伴随着权重a,并且转换器B将序列y映
射到序列z伴随着权重b,那么组合的转换器将序列x映射到序列z,权重为a ⨂ b
在这里插入图片描述

2.(Determization)确定化

创建等价的FST,任意一个状态都没有两个相同input label的出弧(arc).
在这里插入图片描述

3.(Minimization)最小化

创建等价的FST,拥有最小的状态数和弧数
在这里插入图片描述

TLG构建

TLG的概念是Yajie Miao第一次提出来的,本文主要参考Yajie Miao的论文。

-输入输出
T(token)帧级别的CTC标签序列建模单元
L(lexicon)建模单元
G(grammer)

Grammar: A grammar WFST denoted as G encodes the permissible word sequences in a language (word-level language model).
在这里插入图片描述
Lexicon: A lexicon WFST denoted as L encodes the mapping from sequences of lexicon units(chinese characters) to words. 对于端到端声学模型而言,lexicon WFST其实就是把lexicon unit(character) 拼成word(词)。
在这里插入图片描述

Token: A token WFST denoted as T maps a sequence of frame-level CTC labels to a single lexicon unit. 举个栗子,有这么几个标签序列"A A A A A",“ ϕ \phi ϕ ϕ \phi ϕ A A ϕ \phi ϕ ”,“ ϕ \phi ϕ A A A ϕ \phi ϕ ”,token WFST将这几个序列映射到单个lexicon unit,即"A"。
搜索图 S S S可以表示为:
S = T ∘ min ⁡ ( det ⁡ ( L ∘ G ) ) S=T \circ \operatorname{min} (\operatorname{det}(L \circ G)) S=Tmin(det(LG))
其中 ∘ \circ 表示合并, min ⁡ \operatorname{min} min表示最小化, det ⁡ \operatorname{det} det表示确定化。搜索图的输入是帧级别的CTC标签序列,输出是词序列。

工程实现

我们以AISHELL-1数据集为例来介绍,主要有以下几个步骤

1.准备词典(lexicon)

这一步主要是对AISHELL-1中自带的lexicon.txt进行处理,主要两个步骤:
1.去掉lexicon.txt中包含OOV建模单元的词;
2.将过滤后的词拆成建模单元。
这一步产生的lexicon.txt内容如下:
在这里插入图片描述
lexicon.txt在产生L.fst时会用到。

2.准备N-gram语言模型

这一步需要借助工具包,最常用的是SRILM,我们以SRILM为例来介绍,

3.构建解码的TLG

1.产生T.fst和L.fst文件;
2.将L和G合并得到LG.fst,再将T和LG合并得到TLG.fst。

4.解码

5.文件转换与绘图

1.文件转换:
将T.fst和L.fst转换成txt文件,代码如下:

fstprint --isymbols=tokens.txt --osymbols=tokens.txt T.fst T.txt
fstprint --isymbols=tokens.txt --osymbols=words.txt L.fst L.txt

2.绘图
首先安装graphviz,ubuntu系统可通过如下命令安装:

sudo apt-get install graphviz

将fst文件转换成dot文件:

fstdraw --isymbols=tokens.txt --osymbols=words.txt L.fst L.dot
fstdraw --isymbols=tokens.txt --osymbols=tokens.txt T.fst T.dot

将dot文件转换成png格式:

dot -Tpng L.dot L.png
dot -Tpng T.dot T.png
  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值