kaldi中的lattice可视化
1. lattice简介
kaldi的主要作者Daniel Povey在论文Generating exact lattices in the WFST framework 中有提到语音识别圈内对于lattice的概念并没有统一的定义。 在kaldi中,lattice用于表示一句话可能对应的不同词序列。 这里有两种不同的表示方法,一种是有限状态转换器(FST)的形式,另外一种是有限状态接收器(FSA)的形式,这两种不同的表示方法所包含的信息量是一样的。 其中,前一种被称之为Lattice,后一种被称之为CompactLattice。
2. 查看lattice
kaldi在解码的过程中会生成lattice,运行过egs文件夹下面的例子之后会有一部分lattice被保存下来。 保存的lattice可以在exp文件夹下面第二层或者第三层的decode_dev和decode_test两个子文件夹里找到。 我在另外一篇博文里介绍了使用kaldi训练aishell数据集,对于kaldi不熟悉的读者可以先参考一下那篇博文。
以chain模型训练得到的chain/tdnn_1a_sp/decode_dev/lat.1.gz文件为例,我们可以通过在训练的根目录下面执行以下步骤查看lattice的内容:
-
将路径添加到环境变量
source path.sh -
将lattice文件解析成可读格式
gunzip -c exp/chain/tdnn_1a_sp/decode_dev/lat.1.gz | \ lattice-copy --write-compact=true ark:- ark,t:- | \ int2sym.pl -f 3 data/lang/words.txt \ > exp/chain/tdnn_1a_sp/decode_dev/lat.1.txt
kaldi解码过程中保存的lattice文件默认是CompactLattice形式,我们可以通过将上面指令中的–write-compact选项设为false来输出Lattice形式的文档。解析后的CompactLattice文件如下:

其中,第一列和第二列是lattice结点的编号,第三列是词,接下来的两个数字(比如41.2236,-1364.37)分别是语言模型概率和声学模型概率,接下来以“_”分隔的每个数字都是每一帧对应的transition-id。[参考这里]
3. 将lattice可视化
kaldi提供了一个show_lattice.sh脚本来将lattice可视化成一幅图。 使用这个功能之前需要保证安装了可视化图形软件graphviz,没有安装的可以通过apt先装一下(ubuntu操作系统)。
以BAC009S0724W0121这句话为例,我们可以通过以下指令生成可视化的图:
utils/show_lattice.sh BAC009S0724W0121 \
exp/chain/tdnn_1a_sp/decode_dev/lat.1.gz \
exp/chain/tdnn_1a_sp/graph/words.txt
生成的图如下:

这里需要注意的是弧上的数字是词在words.txt里的编号ID,跟后面的词是一一对应的,并不是FST弧上的输入,读者不要混淆。