kaldi使用cvte模型进行语音识别
操作系统 : Unbutu18.04_x64
gcc版本 :7.4.0
该模型在thch30数据集上测试的错误率只有8.25%,效果还是不错的。
模型下载地址:
http://www.kaldi-asr.org/models/m2
选择模型:CVTE Mandarin Model V2
测试文本:
自然语言理解和生成是一个多方面问题,我们对它可能也只是部分理解。
在线识别
测试脚本
./online2-wav-nnet3-latgen-faster --do-endpointing=false --online=false --feature-type=fbank --fbank-config=../../egs/cvte/s5/conf/fbank.conf --max-active= --beam=15.0 --lattice-beam=6.0 --acoustic-scale=1.0 --word-symbol-table=../../egs/cvte/s5/exp/chain/tdnn/graph/words.txt ../../egs/cvte/s5/exp/chain/tdnn/final.mdl ../../egs/cvte/s5/exp/chain/tdnn/graph/HCLG.fst 'ark:echo utter1 utter1|' 'scp:echo utter1 /tmp/test1.wav|' ark:/dev/null
识别结果:
LOG (online2-wav-nnet3-latgen-faster[5.5.~-85d1a]:RemoveOrphanNodes():nnet-nnet.cc:) Removed orphan nodes.
LOG (online2-wav-nnet3-latgen-faster[5.5.~-85d1a]:RemoveOrphanComponents():nnet-nnet.cc:) Removing orphan components.
LOG (online2-wav-nnet3-latgen-faster[5.5.~-85d1a]:Collapse():nnet-utils.cc:) Added components, removed
LOG (online2-wav-nnet3-latgen-faster[5.5.~-85d1a]:CompileLooped():nnet-compile-looped.cc:) Spent 0.00508595 seconds in looped compilation.
utter1 自然语言 理解 和 生成 时 你 该 付 多少 拗 暗 批 我们 对 他 能 爷 只是 部分 理解
LOG (online2-wav-nnet3-latgen-faster[5.5.~-85d1a]:main():online2-wav-nnet3-latgen-faster.cc:) Decoded utterance utter1
LOG (online2-wav-nnet3-latgen-faster[5.5.~-85d1a]:Print():online-timing.cc:) Timing stats: real-time factor for offline decoding was 0.442773 = 3.21453 seconds / 7.26 seconds.
LOG (online2-wav-nnet3-latgen-faster[5.5.~-85d1a]:main():online2-wav-nnet3-latgen-faster.cc:) Decoded utterances, with errors.
LOG (online2-wav-nnet3-latgen-faster[5.5.~-85d1a]:main():online2-wav-nnet3-latgen-faster.cc:) Overall likelihood per frame was 1.84166 per frame over frames.
可以看到,在线识别的效果比较差。
离线识别
1、直接用cvte自带的脚本进行识别
替换声音文件后,执行如下操作:
ln -s ~/kaldi/egs/wsj/s5/steps ~/kaldi/egs/cvte/s5/steps
ln -s ~/kaldi/egs/wsj/s5/utils ~/kaldi/egs/cvte/s5/utils
cd egs/cvte/s5
./run.sh
查看结果 :
mike@local:~/src/kaldi/egs/cvte/s5/exp$ cat chain/tdnn/decode_test/scoring_kaldi/penalty_1./.txt
CVTE201703_00030_165722_11750 自然语言 理解 和 生成 是 一个 多方面 问题 我们 对 他 可能 也 只是 部分 理解
mike@local:~/src/kaldi/egs/cvte/s5/exp$
可以看到,识别效果还是相当好的。
缺点:
加载比较慢,导致整个识别过程比较慢
2、使用自定义脚本进行识别
具体如下:
mike@local:demo1$ pwd
/home/mike/src/kaldi/egs/cvte/s5/demo1
mike@local:demo1$ cat run.sh
#! /bin/bash cd /home/mike/src/kaldi/egs/cvte/s5
. ./cmd.sh
. ./path.sh demo1/nnet3-latgen-faster --frame-subsampling-factor= --frames-per-chunk= --extra-left-context= --extra-right-context= --extra-left-context-initial=- --extra-right-context-final=- --minimize=false --max-active= --min-active= --beam=15.0 --lattice-beam=8.0 --acoustic-scale=1.0 --allow-partial=true --word-symbol-table=exp/chain/tdnn/graph/words.txt exp/chain/tdnn/final.mdl exp/chain/tdnn/graph/HCLG.fst "ark,s,cs:apply-cmvn --norm-means=true --norm-vars=false --utt2spk=ark:data/fbank/test/utt2spk scp:data/fbank/test/cmvn.scp scp:data/fbank/test/feats.scp ark:- |" "ark:|lattice-scale --acoustic-scale=10.0 ark:- ark:- | gzip -c >exp/chain/tdnn/decode_test/lat.1.gz" mike@local:demo1$
mike@local:demo1$ cat update.sh
#!/bin/bash cd /home/mike/src/kaldi/egs/cvte/s5
. ./cmd.sh
. ./path.sh # step : generate fbank features
obj_dir=data/fbank for x in test; do
# rm fbank/$x
mkdir -p fbank/$x # compute fbank without pitch
steps/make_fbank.sh --nj --cmd "run.pl" $obj_dir/$x exp/make_fbank/$x fbank/$x || exit ;
# compute cmvn
steps/compute_cmvn_stats.sh $obj_dir/$x exp/fbank_cmvn/$x fbank/$x || exit ;
done mike@local:demo1$
需要修改 nnet3-latgen-faster.cc 文件,代码路径:/home/mike/src/kaldi/src/nnet3bin/nnet3-latgen-faster.cc
主要是这个调用比较慢:
fst::ReadFstKaldiGeneric(fst_in_str)
加载后连续识别即可,修改后的测试代码:
KALDI_LOG << "before load model :"<<time(NULL);
// Input FST is just one FST, not a table of FSTs.
Fst<StdArc> *decode_fst = fst::ReadFstKaldiGeneric(fst_in_str);
KALDI_LOG << "load model ok :"<<time(NULL);
timer.Reset(); int i = ;
while(){
clock_t start, finish;
start = clock();
i = i+;
system("bash /home/mike/src/kaldi/egs/cvte/s5/demo1/update.sh >/dev/null 2>&1 &");
KALDI_LOG << "decode i = "<<i<<",timestamp :"<<time(NULL);
LatticeFasterDecoder decoder(*decode_fst, config);
SequentialBaseFloatMatrixReader feature_reader(feature_rspecifier); for (; !feature_reader.Done(); feature_reader.Next()) {
std::string utt = feature_reader.Key();
const Matrix<BaseFloat> &features (feature_reader.Value());
if (features.NumRows() == ) {
KALDI_WARN << "Zero-length utterance: " << utt;
num_fail++;
continue;
}
const Matrix<BaseFloat> *online_ivectors = NULL;
const Vector<BaseFloat> *ivector = NULL;
if (!ivector_rspecifier.empty()) {
if (!ivector_reader.HasKey(utt)) {
KALDI_WARN << "No iVector available for utterance " << utt;
num_fail++;
continue;
} else {
ivector = &ivector_reader.Value(utt);
}
}
if (!online_ivector_rspecifier.empty()) {
if (!online_ivector_reader.HasKey(utt)) {
KALDI_WARN << "No online iVector available for utterance " << utt;
num_fail++;
continue;
} else {
online_ivectors = &online_ivector_reader.Value(utt);
}
} DecodableAmNnetSimple nnet_decodable(
decodable_opts, trans_model, am_nnet,
features, ivector, online_ivectors,
online_ivector_period, &compiler); double like;
if (DecodeUtteranceLatticeFaster(
decoder, nnet_decodable, trans_model, word_syms, utt,
decodable_opts.acoustic_scale, determinize, allow_partial,
&alignment_writer, &words_writer, &compact_lattice_writer,
&lattice_writer,
&like)) {
tot_like += like;
frame_count += nnet_decodable.NumFramesReady();
num_success++;
} else num_fail++;
}
finish = clock();
KALDI_LOG << "decode i = "<<i<<",timestamp :"<<time(NULL)<<",diff :"<<(double)(finish - start) / CLOCKS_PER_SEC <<"s";
printf("preess Enter to continue");
getchar();
}
测试效果:
LOG (nnet3-latgen-faster[5.5.~-85d1a]:main():nnet3-latgen-faster.cc:) decode i = ,timestamp :,diff :.817448s
preess Enter to continue
LOG (nnet3-latgen-faster[5.5.~-85d1a]:main():nnet3-latgen-faster.cc:) decode i = ,timestamp :
apply-cmvn --norm-means=true --norm-vars=false --utt2spk=ark:data/fbank/test/utt2spk scp:data/fbank/test/cmvn.scp scp:data/fbank/test/feats.scp ark:-
LOG (apply-cmvn[5.5.~-85d1a]:main():apply-cmvn.cc:) Applied cepstral mean normalization to utterances, errors on
CVTE201703_00030_165722_11750 自然语言 理解 和 生成 是 一个 多方面 问题 我们 对 他 可能 也 只是 部分 理解
LOG (nnet3-latgen-faster[5.5.~-85d1a]:DecodeUtteranceLatticeFaster():decoder-wrappers.cc:) Log-like per frame for utterance CVTE201703_00030_165722_11750 is 2.32415 over frames.
LOG (nnet3-latgen-faster[5.5.~-85d1a]:main():nnet3-latgen-faster.cc:) decode i = ,timestamp :,diff :.845735s
preess Enter to continue
可以看到,识别效果还是相当好的。
当然,这个只是测试,替换文件后,直接按回车进行识别,能达到预期效果。如果需要在实际项目中使用,上述代码做的远远不够。
本文中涉及训练数据及测试示例地址:https://pan.baidu.com/s/1jyeWkZvU8ZjLt4Y9y9B89g
可关注微信公众号后回复 19102601 获取提取码。
本文github地址:
https://github.com/mike-zhang/mikeBlogEssays/blob/master/2019/20191026_kaldi使用cvte模型进行语音识别.rst
kaldi使用cvte模型进行语音识别的更多相关文章
- 音频工具kaldi部署及模型制作调研学习
语音识别简介 语音识别(speech recognition)技术,也被称为自动语音识别(英语:Automatic Speech Recognition, ASR).计算机语音识别(英语:Comput ...
- [转]kaldi特征和模型空间转换
转:http://blog.csdn.net/shmilyforyq/article/details/76807431 博主话:这篇博客是对kaldi官网中Feature and model-spac ...
- Kaldi单音素模型 训练部分
在Kaldi中,单音素GMM的训练用的是Viterbi training,而不是Baum-Welch training.因此就不是用HMM Baum-Welch那几个公式去更新参数,也就不用计算前向概 ...
- kaldi基于GMM的单音素模型 训练部分
目录 1. gmm-init-mono 模型初始化 2. compile-train-graghs 训练图初始化 3. align-equal-compiled 特征文件均匀分割 4. gmm-acc ...
- [转]语音识别中区分性训练(Discriminative Training)和最大似然估计(ML)的区别
转:http://blog.sina.com.cn/s/blog_66f725ba0101bw8i.html 关于语音识别的声学模型训练方法已经是比较成熟的方法,一般企业或者研究机构会采用HTK工具包 ...
- ADALINE模型
ADALINE模型即自适应线性单元(Adaptive Linear Neuron),主要用于信号处理中的自适应滤波.预测和模式识别.其结构图如下 输入向量X=(x0,x1,x2,...,xn)T每个输 ...
- [DeeplearningAI笔记]序列模型3.9-3.10语音辨识/CTC损失函数/触发字检测
5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.9语音辨识 Speech recognition 问题描述 对于音频片段(audio clip)x ,y生成文本 ...
- 安装python各类工具包、IDE以及著名开源模块如kaldi等的简单总结
在学习一门语言或者使用一个著名的开源工具时,搭建环境是非常重要的一步,在环境搭建的过程中往往要踩很多坑.昨天一不小心把电脑操作系统整坏了,搞了个通宵算是搞定了,把win10系统重装回win7,但之前搭 ...
- 隐马尔可夫模型及Viterbi算法
隐马尔可夫模型(HMM,hidden Markov model)是可用于标注问题的统计学模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型.HMM模型主要用于语音识别,自然语言处理,生物 ...
随机推荐
- Elasticsearch(9) --- 聚合查询(Bucket聚合)
Elasticsearch(9) --- 聚合查询(Bucket聚合) 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch(8) --- 聚合查询(Metri ...
- jdk1.8源码阅读
一.java.lang java的基础类 1.object 所有类的爸爸 registerNatives() Class<?> getClass():返回运行时的类 int hashCod ...
- 记一次 JavaScript 浮点型数字误差引发的问题
需求 车间的工人在生产出来产品后,需要完成初步的自检,并通过手机上报.在实际生产中,用户(工人)不方便进行数值的输入,因而表单中的一些项设计成 picker 模式以供选取数值.数值的取值范围,根据允许 ...
- 使用Shell脚本编译运行C++源码 输入输出重定向
在写C++控制台程序的时,如果使用Xcode或者Visual Studio之类的IDE,需要创建许多工程,会造成很多不便.有时,采用Vim或者Sublime text等编辑器编写简单的控制台程序能节省 ...
- java 中使用StopWatch来计算时间差
以前在进行时间耗时时我们通常的做法是先给出计算前后两个的时间值,然后通过详见来计算耗时时长. eg: long start = System.currentTimeMillis(); ......业务 ...
- Linux 查看端口状态netstat
netstat命令参数: -t : 指明显示TCP端口 -u : 指明显示UDP端口 -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序) -p ...
- hadoop之yarn详解(框架进阶篇)
前面在hadoop之yarn详解(基础架构篇)这篇文章提到了yarn的重要组件有ResourceManager,NodeManager,ApplicationMaster等,以及yarn调度作业的运行 ...
- Spark 学习笔记之 Streaming Window
Streaming Window: 上图意思:每隔2秒统计前3秒的数据 slideDuration: 2 windowDuration: 3 例子: import org.apache.kafka.c ...
- springboot配置ehcache2.X缓存(@Cacheable等注解和手动操作缓存的工具类 支持element粒度的时间设置)
本文只写出一些注意事项和源码,请善用官方文档~ 注解实现 @Cacheable @CachePut @CacheEvit 启动类上加@EnableCaching就可以开启缓存 由文档可知,自动检测缓存 ...
- 转:python2.x 和 python3.x的区别
注:本文的原文地址为Key differences between Python 2.7.x and Python 3.x 许多 Python 初学者想知道他们应该从 Python 的哪个版本开始学习 ...