kaldi学习 - 一脚本流学习工具使用
kaldi中脚本东西比较多,一层嵌一层,不易阅读。
本文以yesno为例,直接使用kaldi编译的工具,书写简易训练步骤,方便学习kaldi工具的使用。
注意:转载请注明出处。
yesno训练
- 准备数据
- 在yesno/s5下新建文件夹:
mkdir easy
,后续的操作将在easy文件夹中执行。 - 拷贝s5下
./path
到easy
文件夹中,./path的作用是能直接调用工具,不用添加工具所在路径,类似于设置环境变量。 - 本脚主要便于理解kaldi工具的使用,一些批处理和数据下载并没有做,需要运行一遍
yesno/s5/./run.sh
生成训练所需输入。 - 到
s5/data/train
下拷贝wav.scp
到easy目录下作为训练输入,因为wav.scp
是相对路径也需要拷贝waves_yesno/
到easy下。 - 拷贝词典到目录下:拷贝
s5/input
到easy目录下。
准备数据结束,可以写自己的脚本了。
- 在yesno/s5下新建文件夹:
先给出整体脚本如下:
#!/bin/bash
. ./path
# feature extraction:
# a series of light command [ compute-mfcc + copy-feats -> compute-cmvn-stats -> apply-cmvn -> add-deltas ]
# the data flow transition [ wav -> mfcc.ark,scp -> cmvn.ark,scp -> delta.ark ]
mkdir mfcc
compute-mfcc-feats --verbose=2 --config="../conf/mfcc.conf" scp,p:wav.scp ark:- | copy-feats --compress=true ark:- ark,scp:mfcc/mfcc.ark,mfcc/mfcc.scp
compute-cmvn-stats scp:mfcc/mfcc.scp ark:mfcc/cmvn.ark
apply-cmvn ark:mfcc/cmvn.ark scp:mfcc/mfcc.scp ark:- | add-deltas ark:- ark:mfcc/delta.ark
# prepare dict for lang:
# input data [ lexicon_nosil.txt lexicon.txt phones.txt ]
# output data [ lexicon.txt lexicon_words.txt nonsilence_phones.txt optional_silence.txt silence_phones.txt ]
mkdir -p lang/dict
cp input/lexicon_nosil.txt lang/dict/lexicon_words.txt
cp input/lexicon.txt lang/dict/lexicon.txt
cat input/phones.txt | grep -v SIL > lang/dict/nonsilence_phones.txt
echo "SIL" > lang/dict/silence_phones.txt
echo "SIL" > lang/dict/optional_silence.txt
echo "Dictionary preparation succeeded"
# generate [ topo ] for acoustic model
utils/gen_topo.pl 3 5 2:3 1 > lang/lang/topo
# from [lexicoin phone word] -> [L.fst word.txt] for [G.fst train.fst HCLG.fst]
utils/prepare_lang.sh --position-dependent-phones false lang/dict "<SIL>" lang/local lang/lang
# train monophic acoustic model
# 1.from [topo 39] -> 0.mdl tree
gmm-init-mono --train-feats=ark:mfcc/delta.ark lang/lang/topo 39 mono/0.mdl mono/tree
# 2.from [L.fst 0.mdl tree word.txt text] -> train.fst
# compile-train-graphs [options] <tree-in> <model-in> <lexicon-fst-in> <transcriptions-rspecifier> <graphs-wspecifier>
compile-train-graphs mono/tree mono/0.mdl lang/lang/L.fst 'ark:sym2int.pl -f 2- lang/lang/words.txt text|' ark:lang/lang/graphs.fsts
# 3.from [graphs.fst] equally align the train data -> [ euqal.ali ]
# align-equal-compiled <graphs-rspecifier> <features-rspecifier> <alignments-wspecifier>
align-equal-compiled ark:lang/lang/graphs.fsts ark:mfcc/delta.ark ark:mono/equal.ali
# 4.from [equal.ali delta.ark mdl] -> [ 0.acc ]
gmm-acc-stats-ali mono/0.mdl ark:mfcc/delta.ark ark:mono/equal.ali mono/0.acc
# 5.from [0.mdl 0.acc] -> [ 1.mdl ]
# parameter est:
gmm-est mono/0.mdl mono/0.acc mono/1.mdl
x=1
numliter=40
numgauss=11
while [ $x -lt $numliter ]; do
# 6.from [1.mdl graphs.fst] align the data by new model -> [ 1.ali ]
gmm-align-compiled --beam=6 --retry-beam=20 mono/$x.mdl ark:lang/lang/graphs.fsts ark:mfcc/delta.ark ark:mono/$x.ali
# 4.from [equal.ali delta.ark mdl] -> [ 0.acc ]
gmm-acc-stats-ali mono/$x.mdl ark:mfcc/delta.ark ark:mono/equal.ali mono/$x.acc
# 5.from [x.mdl x.acc] -> [ x+1.mdl ]
gmm-est --mix-up=$numgauss --power=0.25 mono/$x.mdl mono/$x.acc mono/$[$x+1].mdl
numgauss=$[$numgauss+25]
x=$[$x+1]
done
cp mono/$x.mdl mono/final.mdl
# Graph compilation
# from [input/task.arpabo word.txt] -> G.fst
arpa2fst --disambig-symbol=#0 --read-symbol-table=lang/lang/words.txt input/task.arpabo lang/lang/G.fst
fstisstochastic lang/lang/G.fst
# from [final.mdl G.fst L.fst tree] -> HLCG.fst
utils/mkgraph.sh lang/lang mono mono/graph
分块详解
首先进行特征提取:
#!/bin/bash
. ./path
# 特征提取: compute-mfcc-feats, copy-feats
# 输入为:wav.scp 输出为:mfcc.ark,mfcc.scp
compute-mfcc-feats --verbose=2 --config="../conf/mfcc.conf" scp,p:wav.scp ark:- | copy-feats --compress=true ark:- ark,scp:mfcc/mfcc.ark,mfcc/mfcc.scp
# 计算均方归一化矩阵:
# 输入为:mfcc.ark,mfcc.scp 输出为:mfcc/cmvn.ark,mfcc/cmvn.scp
compute-cmvn-stats scp:mfcc/mfcc.scp ark,scp:mfcc/cmvn.ark,mfcc/cmvn.scp
# 计算一阶二阶差分:
# 输入为:mfcc/cmvn.ark,mfcc/cmvn.scp 输出为:delta.ark
apply-cmvn scp:mfcc/cmvn.scp scp:mfcc/mfcc.scp ark:- | add-deltas ark:- ark:mfcc/delta.ark
然后,准备训练所需的词典,音素文件,词文件等。
yesno里准备好了,直接拷贝即可。
# prepare dict for lang:
# input data [ lexicon_nosil.txt lexicon.txt phones.txt ]
# output data [ lexicon.txt lexicon_words.txt nonsilence_phones.txt optional_silence.txt silence_phones.txt ]
mkdir -p lang/dict
cp input/lexicon_nosil.txt lang/dict/lexicon_words.txt
cp input/lexicon.txt lang/dict/lexicon.txt
cat input/phones.txt | grep -v SIL > lang/dict/nonsilence_phones.txt
echo "SIL" > lang/dict/silence_phones.txt
echo "SIL" > lang/dict/optional_silence.txt
echo "Dictionary preparation succeeded"
生成声学拓扑结构。
生成 L.fst
word.txt
用来生成G.fst
train.fst
HCLG.fst
。其中utils/prepare_lang.sh
所需全部输入为上一步生成的dict
文件。
# generate [ topo ] for acoustic model
utils/gen_topo.pl 3 5 2:3 1 > lang/lang/topo
# from [lexicoin phone word] -> [L.fst word.txt] for [G.fst train.fst HCLG.fst]
utils/prepare_lang.sh --position-dependent-phones false lang/dict "<SIL>" lang/local lang/lang
训练单音素模型
- 流程如下 :
- 利用生成的声学拓扑初始化模型
- 生成训练图
- 初始化对齐
- 生成统计量
- 模型参数估计
- {重新对齐生,成统计量,模型参数估计}x10
- 生成并导出最终模型:
# train monophic acoustic model
# 1.from [topo 39] -> 0.mdl tree
gmm-init-mono --train-feats=ark:mfcc/delta.ark lang/lang/topo 39 mono/0.mdl mono/tree
# 2.from [L.fst 0.mdl tree word.txt text] -> train.fst
# compile-train-graphs [options] <tree-in> <model-in> <lexicon-fst-in> <transcriptions-rspecifier> <graphs-wspecifier>
compile-train-graphs mono/tree mono/0.mdl lang/lang/L.fst 'ark:sym2int.pl -f 2- lang/lang/words.txt text|' ark:lang/lang/graphs.fsts
# 3.from [graphs.fst] equally align the train data -> [ euqal.ali ]
# align-equal-compiled <graphs-rspecifier> <features-rspecifier> <alignments-wspecifier>
align-equal-compiled ark:lang/lang/graphs.fsts ark:mfcc/delta.ark ark:mono/equal.ali
# 4.from [equal.ali delta.ark mdl] -> [ 0.acc ]
gmm-acc-stats-ali mono/0.mdl ark:mfcc/delta.ark ark:mono/equal.ali mono/0.acc
# 5.from [0.mdl 0.acc] -> [ 1.mdl ]
# parameter est:
gmm-est mono/0.mdl mono/0.acc mono/1.mdl
x=1
numliter=40
numgauss=11
while [ $x -lt $numliter ]; do
# 6.from [1.mdl graphs.fst] align the data by new model -> [ 1.ali ]
gmm-align-compiled --beam=6 --retry-beam=20 mono/$x.mdl ark:lang/lang/graphs.fsts ark:mfcc/delta.ark ark:mono/$x.ali
# 4.from [equal.ali delta.ark mdl] -> [ 0.acc ]
gmm-acc-stats-ali mono/$x.mdl ark:mfcc/delta.ark ark:mono/equal.ali mono/$x.acc
# 5.from [x.mdl x.acc] -> [ x+1.mdl ]
gmm-est --mix-up=$numgauss --power=0.25 mono/$x.mdl mono/$x.acc mono/$[$x+1].mdl
numgauss=$[$numgauss+25]
x=$[$x+1]
done
cp mono/$x.mdl mono/final.mdl
最后合成语言模型:
# Graph compilation
# from [input/task.arpabo word.txt] -> G.fst
arpa2fst --disambig-symbol=#0 --read-symbol-table=lang/lang/words.txt input/task.arpabo lang/lang/G.fst
fstisstochastic lang/lang/G.fst
# from [final.mdl G.fst L.fst tree] -> HLCG.fst
utils/mkgraph.sh lang/lang mono mono/graph
运行结果:
建立解码脚本
解码指令较简单一个指令即可:
#Usage: gmm-latgen-faster [options] model-in (fst-in|fsts-rspecifier) features-rspecifier lattice-wspecifier [ words-wspecifier [alignments-wspecifier] ]
gmm-latgen-faster --max-active=7000 --beam=13 --lattice-beam=6 --acoustic-scale=0.083333 \
--allow-partial=true --word-symbol-table=lang/lang/words.txt mono/final.mdl \
mono/graph/HCLG.fst ark:mfcc/delta.ark "ark:|gzip -c > result/lat.gz"
可以得到识别结果不是很好,没关系,主要用这个例子来理解kaldi是怎么样使用工具的。
转载请注明出处:https://blog.csdn.net/chinatelecom08/article/details/81392399
kaldi学习 - 一脚本流学习工具使用的更多相关文章
- java学习之IO流(学习之旅,一)
个人在学习IO流的时候看到如下所示java 流类图结构的时候,我的感想是,这么多··处于蒙的状态. Java流类图结构 这么多,没有分类不好学,那我们就慢慢一口一口的吃,这样每天学习一点就好了,其实很 ...
- 学习 shell脚本之前的基础知识
转载自:http://www.92csz.com/study/linux/12.htm 学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写sh ...
- Java IO流学习总结八:Commons IO 2.5-IOUtils
Java IO流学习总结八:Commons IO 2.5-IOUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/550519 ...
- Java IO流学习总结(1)
Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本 ...
- Java IO流学习
Java IO流学习 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是 ...
- 学习shell脚本之前的基础知识
日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员.目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目.有的单位 ...
- Shell脚本基础学习
Shell脚本基础学习 当你在类Unix机器上编程时, 或者参与大型项目如k8s等, 某些框架和软件的安装都是使用shell脚本写的. 学会基本的shell脚本使用, 让你走上人生巅峰, 才怪. 学会 ...
- 《零基础学习Python制作ArcGIS自定义工具》课程简介
Python for ArcGIS Python for ArcGIS是借助Python语言实现ArcGIS自动化行为的综合,它不止是如课程标题所述的“制作ArcGIS自定义工具”,还包括使用Pyth ...
- Auto.js无障碍免root脚本开发学习
Auto.js 简单入门 官方文档:https://hyb1996.github.io/AutoJs-Docs/#/ https://blog.csdn.net/QiHsMing/article/de ...
随机推荐
- SqlSugar之SqlQueryDynamic返回值处理
现在有个需求,有一张表每个月表名都会变的,但结构是一样的,我们不能再用类映射来完成的,我不能每个月都去手动添加,我们只能使用sql语句来完成这个需求.为了方便我这边选择的是SqlQueryDynami ...
- AngularJS 一 简介以及安装环境
AngularJS官网:https://angularjs.org AngularJS是开发动态Web应用程序的客户端JavaScript MVC框架.AngularJS最初是作为Google的一个项 ...
- caffe+opencv3.3.1
跟着时代走 换成opencv3.3.1,目前来看所有的都是最新版了. anaconda最新,opencv最新,我看了protobuf也很新. 下次再买台服务器时,我想直接用python来弄,因为这次安 ...
- 你不知道的javaScript笔记(5)
原生函数 常用的原生函数 String() Number() Boolean() Array() Object() Function() RegExp() Date() Error() Symbol( ...
- ABAP术语-APO (Advanced Planner and Optimizer)
APO (Advanced Planner and Optimizer) 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/14/994510. ...
- [NodeJs系列][译]理解NodeJs中的Event Loop、Timers以及process.nextTick()
译者注: 为什么要翻译?其实在翻译这篇文章前,笔者有Google了一下中文翻译,看的不是很明白,所以才有自己翻译的打算,当然能力有限,文中或有错漏,欢迎指正. 文末会有几个小问题,大家不妨一起思考一下 ...
- node 写api几个简单的问题
最近出了一直在做无聊的管理后台,还抽空做了我公司的计费终端,前端vue,后端node,代码层面没啥太多的东西.由于自己node版本是8.0.0,node自身是不支持import和export的,要想基 ...
- Yii2.0 游客访问限制(转)
最近在用Yii2.0做项目,其中需要实现一个功能:没有登录不能访问部分页面,即游客身份访问限制.查了半天资料,终于找到答案.解决方法如下: 在access里,access即访问的意思,其中有个配置项 ...
- Fabric go sdk初始化所需证书解析
fabric sdk go 提供的官方文档少之又少,要想入门,主要就靠研究官方的e2e系列示例,这真的是一件挺无奈的事情.没法子,只能硬着头皮上了.研究发现,e2e这个例子是通过cryptogen生成 ...
- go学习笔记-变量作用域
变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. 变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函数定义中的变量称为形式 ...