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模型主要用于语音识别,自然语言处理,生物 ...
随机推荐
- SpringBoot 2.0 + InfluxDB+ Sentinel 实时监控数据存储
前言 阿里巴巴提供的控制台只是用于演示 Sentinel 的基本能力和工作流程,并没有依赖生产环境中所必需的组件,比如持久化的后端数据库.可靠的配置中心等.目前 Sentinel 采用内存态的方式存储 ...
- 外部服务器使用jedis操作redis数据库
使用maven获取jedis的包,我本来想去找jedis的jar包的,但是没找到. (maven) <dependency> <groupId>redis.client ...
- [Linux] linux下vim对于意外退出的文档的再次开启
转载自博客:https://blog.csdn.net/ljp1919/article/details/48372615 1.对于同一个文件如果上次已经打开,而未关闭的情况下,又打开该文件进行编辑时, ...
- C# 代码往oracle数据库添加datetime格式列
C# 代码往oracle数据库添加datetime格式列时,不需要在insert语句中为datetime类型使用to_date函数
- 【Java】SpringBoot 中从application.yml中获取自定义常量
由于这里我想通过java连接linux,connection连接需要host.port.username.password及其他路径等等.不想每次修改的时候都去改源文件,所以想写在applicatio ...
- 【linux】【FastDFS】FastDFS安装
前言 FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server).存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存 ...
- Janus安装教程,ubuntu18.04系统
Janus安装教程,ubuntu18.04系统 本文介绍Jansu如何安装,操作系统为Ubuntu 18.04. (1)安装git 执行命令:“sudo apt-get install ...
- IntelliJ IDEA 如何在同一个窗口创建多个项目--超详细教程
一.IntelliJ IDEA与Eclipse的区别 二.在同一个窗口创建多个项目 1.打开IntelliJ IDEA,点击Create New Project 2.Java Enterprise-- ...
- 根据vue-cli手摸手实现一个自己的脚手架
故事背景 身为一个入门前端七个月的小菜鸡,在我入门前端的第一天就接触到了vue,并且死皮赖脸的跟他打了这么久的交到,还记得第一次用vue init webpack 这句命令一下生成一个模板的时候那种心 ...
- RabbitMQ原理介绍
RabbitMQ历史 RabbitMQ消息系统是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.在同步消息通讯的世界里有很多公开标准(如COBAR的IIO ...