学习Kaldi首先需要了解OpenFST,之后才能够深入的学习Kaldi,很多概念都是和OpenFSTaging相关的,而且如果要调整模型的准确率和速度也离不开OpenFST。那OpenFST究竟是什么呢?
这里有个OpenFST在Kaldi上的介绍:Kaldi: Kaldi tutorial: Overview of the distribution (20 minutes),不过不是很太详细,可以参考OpenFST的网站:FstQuickTour < FST < TWiki
通俗的讲OpenFST就是FST(Finite State Transducer,有限自动机)的一个实现,在Kaldi里面这个文件被用做一个库,放在tools文件夹下。我们以OpenFST官网上的例子介绍一下,了解一个概览。
下面的图表示了一个优先状态机的概览:
OpenFST要表达一个图,需要3个文件:
text.fst:构建的图
isyms.txt:输入符号表
osyms.txt:输出符号表
简单看一下三个文件对应于上图的格式应该表示成什么样。
text.fst格式
text.fst存放的是构建的有限自动机的图,基于上面的例子,格式如下:
0 1 a x .5 0 1 b y 1.5 1 2 c z 2.5 2 3.5
其中除了最后一行,每一行代表一个状态转移,可以从一个状态到另一个状态有多条边,在文件中的顺序没有影响。但是需要遵守几个规则:
1. 初始状态(initial state)为0
2. 文件第一行的状态转移一定是以初始状态开始
3. 最后一行是终止状态(final state),没有下一跳的状态
4. 除最后一行外,其他行为一条弧必须按照格式:,起点(arc source)、终点(arc destination)、输入标签(input label)、输出标签(output label)、权重(weight)。
isyms.txt格式
内容如下:
<eps> 0 a 1 b 2 c 3
osyms.txt格式
内容如下:
<eps> 0 x 1 y 2 z 3
可以使用任意的字符串作为label,也可以用任意非0值对label编码。一般0是为epsilon这个label保留的,epsilon表示一个空串,用来作为站位,比如语音识别有段静音或者声音拉得比较长,这段frame就可以用epsilon。
我们知道text.fst包含了状态机的转换图,已经使用的是符号了,为什么还需要用isyms.txt和osyms.txt这两个文件呢?这是因为FST内部都是使用的数字表示 ,所以需要参照这两个符号表 。
参考地址:LiveToolkit