kaldi中nnet3解码实践

举报
可爱又积极 发表于 2021/11/03 16:23:56 2021/11/03
【摘要】 Kaldi的nnet3网络结构。xconfig: 类似于keras,简洁的网络定义,xconfig覆盖了大部分常用的神经网络layerconfig: kaldi实际使用的config, 基于node定义网络结构,如果xconfig无法满足需求,可在config层实现。C++: 如果某些网络无法用config构建,或者想提高效率,则可以在C++层实现。(Kaldi本身的LSTM可以通过conf...

Kaldi的nnet3网络结构。

xconfig: 类似于keras,简洁的网络定义,xconfig覆盖了大部分常用的神经网络layer

config: kaldi实际使用的config, 基于node定义网络结构,如果xconfig无法满足需求,可在config层实现。

C++: 如果某些网络无法用config构建,或者想提高效率,则可以在C++层实现。(Kaldi本身的LSTM可以通过config实现,但是Kaldi也在C++层实现了一个更高效的LSTM)

xconfig定义网络

假如要定义如下网络

特征40维,
1层tdnn,输出64维,t时刻的上下文依赖(t-2,t,t+2) 
1层lstm,cell/输出 32维, t时刻依赖t-3时刻的recurrent输入(一般t时刻依赖t-1时刻,但是kaldi里经常做3帧的跳帧)
10维softmax输出。

对应的xconfig文件为

#tdnn-lstm.xconfig
  input dim=40 name=input
  relu-batchnorm-layer name=tdnn dim=64 input=Append(-2,0,2)
  fast-lstm-layer name=lstm cell-dim=32 decay-time=20 delay=-3
  output-layer name=output input=lstm dim=10 max-change=1.5

其网络的拓扑如下图 

config网络定义

使用下面脚本,可以将xconifg转换为Kaldi Nnet3实际使用的config文件。

steps/nnet3/xconfig_to_configs.py --xconfig-file tdnn-lstm.xconfig --config-dir ./

tdnn-lstm.xconfig转换后的网络如下,可以看到基于config的定义比较长。

input-node name=input dim=40
component name=tdnn.affine type=NaturalGradientAffineComponent input-dim=120 output-dim=64  max-change=0.75
component-node name=tdnn.affine component=tdnn.affine input=Append(Offset(input, -2), input,  Offset(input, 2))
component name=tdnn.relu type=RectifiedLinearComponent dim=64 self-repair-scale=1e-05
component-node name=tdnn.relu component=tdnn.relu input=tdnn.affine
component name=tdnn.batchnorm type=BatchNormComponent dim=64 target-rms=1.0
component-node name=tdnn.batchnorm component=tdnn.batchnorm input=tdnn.relu

### Begin LTSM layer 'lstm'
# Gate control: contains W_i, W_f, W_c and W_o matrices as blocks.
component name=lstm.W_all type=NaturalGradientAffineComponent input-dim=96 output-dim=128  max-change=1.5
# The core LSTM nonlinearity, implemented as a single component.
# Input = (i_part, f_part, c_part, o_part, c_{t-1}), output = (c_t, m_t)
# See cu-math.h:ComputeLstmNonlinearity() for details.
component name=lstm.lstm_nonlin type=LstmNonlinearityComponent cell-dim=32  max-change=0.75
# Component for backprop truncation, to avoid gradient blowup in long training examples.
component name=lstm.cm_trunc type=BackpropTruncationComponent dim=64 clipping-threshold=30.0 zeroing-threshold=15.0 zeroing-interval=20 recurrence-interval=3 scale=1.0
###  Nodes for the components above.
component-node name=lstm.W_all component=lstm.W_all input=Append(tdnn.batchnorm, IfDefined(Offset(lstm.m_trunc, -3)))
component-node name=lstm.lstm_nonlin component=lstm.lstm_nonlin input=Append(lstm.W_all, IfDefined(Offset(lstm.c_trunc, -3)))
dim-range-node name=lstm.m input-node=lstm.lstm_nonlin dim-offset=32 dim=32
component-node name=lstm.cm_trunc component=lstm.cm_trunc input=lstm.lstm_nonlin
dim-range-node name=lstm.c_trunc input-node=lstm.cm_trunc dim-offset=0 dim=32
dim-range-node name=lstm.m_trunc input-node=lstm.cm_trunc dim-offset=32 dim=32
### End LTSM layer 'lstm'

component name=output.affine type=NaturalGradientAffineComponent input-dim=32 output-dim=10  max-change=1.5 param-stddev=0.0 bias-stddev=0.0
component-node name=output.affine component=output.affine input=lstm.m
component name=output.log-softmax type=LogSoftmaxComponent dim=10
component-node name=output.log-softmax component=output.log-softmax input=output.affine
output-node name=output input=output.log-softmax objective=linear

在nnet_online生产nnet3解码的online.cfg的配置文件及相关数据准备的;为调用./steps/online/nnet3/decode.sh 解码数据做准备

1、./steps/online/nnet3/prepare_online_decoding.sh data/lang_chain exp/nnet3/extractor exp/chain/tdnn_1a_sp exp/chain/nnet_online

2、bash -x ./steps/online/nnet3/decode.sh exp/chain/tdnn_1a_sp/graph data/test/ exp/chain/nnet_online_addpitch/decode/

exp/chain/nnet_online_addpitch/decode下有等文件

将words级别的lattice转换phone级别的:

3、lattice-to-phone-lattice /home/kaldi/egs/aishell/s5/exp/chain/nnet_online_addpitch/final.mdl "ark:gunzip -c ./lat.1.gz|" ark:./phones.lats

取lattice路径中最好的N条(得到的是fst):
4、lattice-best-path --acoustic-scale=0.1 ark:./phones.lats 'ark,t:|/home/kaldi/egs/aishell/s5/utils/int2sym.pl -f 2- /home/kaldi/egs/aishell/s5/exp/chain/nnet_online_addpitch/phones.txt > text' ark:./1.tmp.ali

text文件如下:

原文与识别结果的对比

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。