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的内容:

  1. 将路径添加到环境变量

     source path.sh
    
  2. 将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文件如下:

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

生成的图如下:

Show_Lattice

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