kaldi解码工具的使用
kaldi解码工具的使用
前言:
- 简单的介绍kaldi解码工具online2-wav-nnet3-latgen-faster以及online2-tcp-nnet3-decode-faster的使用
- 以其他人训练好的模型来测试: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>
# 等等 就可以看到结果了
- 本身来说online2-wav-nnet3-latgen-faster是测试多个音频的 我为了简化操作就写入脚本中,可以适当的修改解码参数也许会有更好的效果
- 参数中会带入两个输入即脚本中对应的${input_ark}以及${input_wavs_scp} 以及一个输出默认我们输出到/dev/null(你换个路径就能看到对应的输出)
- ${input_ark}的格式是spk2utt 就是每一行的内容为 “<说话者> <音频ID>"音频ID>说话者>
- ${input_wavs_scp}格式 对应的每一行内容为 “<音频ID> <音频路径>"音频路径>音频ID>
- 说白了就是遍历${input_ark} 得到<音频ID> 再从${input_wavs_scp}获取对应<音频路径>进而进行解码音频路径>音频ID>
- ${model_dir}/final.mdl 对应的是声音模型 就是平时用kaldi进行机器学习出来的那个模型
- ${model_dir}/HCLG.fst 对应的是语言模型 是通过大量文本统计 配合词典 音素表 以及kaldi中定义的一种状态表通过openfst的工具链生成的一个文件
- –word-symbol-table=${model_dir}/words.txt 这个是词索引表 解码出来的结果是索引数组 对应这样表进而得到可读性文本
- 其他参数可以慢慢研究
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
# 接着就会看到识别返回
- online2-tcp-nnet3-decode-faster 提供了一个简单的TCP服务允许我们建立socket连接后,向socket写入音频流并在服务端进行识别并实时反馈回来,进而达到一个实时识别并返回的效果
- 上述测试对于识别过程会而外输入wav的文件头影响到真实数据的识别,实际应用只需要传输数据体,即所用测试音频文件必须是16000采样的16bit int型的单声道的pcm数据
ps:
- 所用测试音频文件必须是16000采样的16bit int型单声道的wav音频
- 若没有nc这个程序 可以自行装之