小白的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=T∘min(det(L∘G))
其中
∘
\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