kaldi解码工具的使用

kaldi解码工具的使用

前言:

  1. 简单的介绍kaldi解码工具online2-wav-nnet3-latgen-faster以及online2-tcp-nnet3-decode-faster的使用
  2. 以其他人训练好的模型来测试:0011_multi_cn_chain_sp_online_v2.tar.gz

默认

{kaldi_dir} 表示你的kaldi路径

准备工作

##准备好一个编译好的kaldi环境

cd {kaldi_dir}/egs

#创建测试目录
mkdir -p test_model/s5
cd test_model/s5

#下载模型
wget http://kaldi-asr.org/models/11/0011_multi_cn_chain_sp_online_v2.tar.gz

#....等待模型下载完毕

#解压模型
tar -xf ./0011_multi_cn_chain_sp_online_v2.tar.gz

#复制一份path.sh
cp ../../multi_cn/s5/path.sh ./

#令kaldi的环境在当前shell有效
. ./path.sh

# 执行完上述后你就可以愉快在shell中使用kaldi的工具链了

看看0011_multi_cn_chain_sp_online_v2有啥

tree ./multi_cn_chain_sp_online

如下输出

./multi_cn_chain_sp_online
|-- HCLG.fst
|-- conf
|   |-- ivector_extractor.conf
|   |-- mfcc.conf
|   |-- online.conf
|   |-- online_cmvn.conf
|   `-- splice.conf
|-- final.mdl
|-- frame_subsampling_factor
|-- ivector_extractor
|   |-- final.dubm
|   |-- final.ie
|   |-- final.mat
|   |-- global_cmvn.stats
|   |-- online_cmvn.conf
|   `-- splice_opts
|-- phones.txt
|-- tree
`-- words.txt

2 directories, 17 files

重点看两个文件并改之

cat ./multi_cn_chain_sp_online/conf/online.conf

如下内容(路径对不上了)

--feature-type=mfcc
--mfcc-config=multi_cn/s5/exp/chain_cleaned/tdnn_cnn_1a_sp_online/conf/mfcc.conf
--ivector-extraction-config=multi_cn/s5/exp/chain_cleaned/tdnn_cnn_1a_sp_online/conf/ivector_extractor.conf
--endpoint.silence-phones=1:2:3:4:5:6:7:8:9:10:11:12:13:14:15

换成现在用的相对路径

file:./multi_cn_chain_sp_online/conf/online.conf

--feature-type=mfcc
--mfcc-config=multi_cn_chain_sp_online/conf/mfcc.conf
--ivector-extraction-config=multi_cn_chain_sp_online/conf/ivector_extractor.conf
--endpoint.silence-phones=1:2:3:4:5:6:7:8:9:10:11:12:13:14:15

file: ./multi_cn_chain_sp_online/conf/ivector_extractor.conf

--splice-config=./multi_cn_chain_sp_online/conf/splice.conf
--cmvn-config=./multi_cn_chain_sp_online/conf/online_cmvn.conf
--lda-matrix=./multi_cn_chain_sp_online/ivector_extractor/final.mat
--global-cmvn-stats=./multi_cn_chain_sp_online/ivector_extractor/global_cmvn.stats
--diag-ubm=./multi_cn_chain_sp_online/ivector_extractor/final.dubm
--ivector-extractor=./multi_cn_chain_sp_online/ivector_extractor/final.ie
--num-gselect=5
--min-post=0.025
--posterior-scale=0.1
--max-remembered-frames=1000
--max-count=100
--ivector-period=10

online2-wav-nnet3-latgen-faster的使用

写个脚本来测试单个wav的音频

file:test_a_wav.sh

#! /bin/sh
#
# test_a_wav.sh
# Copyright (C) 2020 xiaominfc(武汉鸣鸾信息科技有限公司) <xiaominfc@gmail.com>
#
# Distributed under terms of the MIT license.
#
if [ $# != 1 ];then
	echo "enter:"$0" <wav_file>"
	exit 1

fi
wav_file=$1
if [ ! -f ${wav_file} ];then
	echo "not such  file:"${wav_file}
	exit 1
fi

. path.sh
#模型路径
model_dir=./multi_cn_chain_sp_online

online2-wav-nnet3-latgen-faster --config=${model_dir}/conf/online.conf \
	--max-active=7000 --beam=15.0 --lattice-beam=8.0  --word-symbol-table=${model_dir}/words.txt \
	${model_dir}/final.mdl ${model_dir}/HCLG.fst "ark:echo utt1 utt1|" "scp:echo utt1 "${wav_file}"|" "ark,t:/dev/null"

# 赋权限
chmod +x ./test_a_wav.sh
# 带上一个音频文件路径执行之
./test_a_wav.sh <wav_file_path>
# 等等 就可以看到结果了

测试指定路径下的所有wav文件 file:test_dir.sh

#! /bin/sh
#
# test_dir.sh
# Copyright (C) 2020 xiaominfc(武汉鸣鸾信息科技有限公司) <xiaominfc@gmail.com>
#
# Distributed under terms of the MIT license.
#


if [ $# != 1 ];then
	echo "enter:"$0" <wavs_dir>"
	exit 1

fi
wavs_dir=$1

if [ ! -d ${wavs_dir} ];then
	echo "not such dir:"${wavs_dir}
	exit 1
fi

input_ark=./tmp_input.ark
if [ -f ${input_ark} ];then
	rm -f ${input_ark}
fi
input_wavs_scp=./tmp_wavs.scp
if [ -f ${input_wavs_scp} ];then
	rm -f ${input_wavs_scp}
fi
ls ${wavs_dir}/*.wav | while read line;
do
	name=$(basename ${line})
	name=${name%.*}
	echo ${name}" "${name} >> ${input_ark}
	echo ${name}" "${line} >> ${input_wavs_scp}
done

. path.sh
#模型路径
model_dir=./multi_cn_chain_sp_online
online2-wav-nnet3-latgen-faster --config=${model_dir}/conf/online.conf \
	--max-active=7000 --beam=15.0 --lattice-beam=8.0  --word-symbol-table=${model_dir}/words.txt \
	${model_dir}/final.mdl ${model_dir}/HCLG.fst "ark:"${input_ark} "scp:"${input_wavs_scp} "ark,t:/dev/null"


同理

# 赋权限
chmod +x ./test_dir.sh
# 带上含有音频文件路径执行之
./test_a_wav.sh <wavs_dir>
# 等等 就可以看到结果了

  1. 本身来说online2-wav-nnet3-latgen-faster是测试多个音频的 我为了简化操作就写入脚本中,可以适当的修改解码参数也许会有更好的效果
  2. 参数中会带入两个输入即脚本中对应的${input_ark}以及${input_wavs_scp} 以及一个输出默认我们输出到/dev/null(你换个路径就能看到对应的输出)
  3. ${input_ark}的格式是spk2utt 就是每一行的内容为 “<说话者> <音频ID>"
  4. ${input_wavs_scp}格式 对应的每一行内容为 “<音频ID> <音频路径>"
  5. 说白了就是遍历${input_ark} 得到<音频ID> 再从${input_wavs_scp}获取对应<音频路径>进而进行解码
  6. ${model_dir}/final.mdl 对应的是声音模型 就是平时用kaldi进行机器学习出来的那个模型
  7. ${model_dir}/HCLG.fst 对应的是语言模型 是通过大量文本统计 配合词典 音素表 以及kaldi中定义的一种状态表通过openfst的工具链生成的一个文件
  8. –word-symbol-table=${model_dir}/words.txt 这个是词索引表 解码出来的结果是索引数组 对应这样表进而得到可读性文本
  9. 其他参数可以慢慢研究

online2-tcp-nnet3-decode-faster的使用

依旧用个简单的脚本启动

file:test_server_run.sh

#! /bin/sh
#
# test_server_run.sh
# Copyright (C) 2020 xiaominfc(武汉鸣鸾信息科技有限公司) <xiaominfc@gmail.com>
#
# Distributed under terms of the MIT license.
#

#模型路径
model_dir=./multi_cn_chain_sp_online
online2-tcp-nnet3-decode-faster --config=${model_dir}/conf/online.conf \
	--max-active=7000 --beam=15.0 --lattice-beam=8.0 \
	${model_dir}/final.mdl ${model_dir}/HCLG.fst ${model_dir}/words.txt
chmod +x test_server_run.sh
#运行启动之
test_server_run.sh

新开一个终端

# <wav_file> 为音频的路径
cat <wav_file> | nc 127.0.0.1 5050

# 接着就会看到识别返回
  1. online2-tcp-nnet3-decode-faster 提供了一个简单的TCP服务允许我们建立socket连接后,向socket写入音频流并在服务端进行识别并实时反馈回来,进而达到一个实时识别并返回的效果
  2. 上述测试对于识别过程会而外输入wav的文件头影响到真实数据的识别,实际应用只需要传输数据体,即所用测试音频文件必须是16000采样的16bit int型的单声道的pcm数据

ps:

  1. 所用测试音频文件必须是16000采样的16bit int型单声道的wav音频
  2. 若没有nc这个程序 可以自行装之

阅读量: