kaldi 源码分析(十) - gmm-init-mono.c分析
一直没有搞明白 hmm-gmm 之间是通过什么联系起来的,花了些时间查代码,看到最直观联系的就是 gmm-init-mono 工具。

通过上述看到,主要的配置都是 在 topo 文件中, 这里需要将一些常见的名称理解下来,这里直接贴出英文内容:
名称 | 解释 |
---|---|
phone | a phone index (1, 2, 3 ...) |
HMM-state | a number (0, 1, 2...) that indexes TopologyEntry (see hmm-topology.h) (HmmTopology 中 HmmState 位置) |
pdf-id | a number output by the Compute function of ContextDependency (it indexes pdf's, either forward or self-loop). Zero-based. (HmmState 中 pdf 中的 index) |
transition-state | the states for which we estimate transition probabilities for transitions out of them. In some topologies, will map one-to-one with pdf-ids. One-based, since it appears on FSTs. (状态转换描述) |
transition-index | identifier of a transition (or final-prob) in the HMM. Indexes the "transitions" vector in HmmTopology::HmmState. (状态转换 index) [if it is out of range, equal to transitions.size(), it refers to the final-prob.] Zero-based. |
transition-id | identifier of a unique parameter of the TransitionModel. Associated with a (transition-state, transition-index) pair.One-based, since it appears on FSTs. (状态转换 id) |
从 train_mono.sh 中获取 gmm-init-mono 命令详细内容
$cmd JOB=1 $dir/log/init.log \gmm-init-mono $shared_phones_opt "--train-feats=$feats subset-feats --n=10 ark:- ark:-|" $lang/topo $feat_dim \$dir/0.mdl $dir/tree || exit 1;
# 实际执行的内容如下:
$ gmm-init-mono --shared-phones=$lang/phones/sets.int "--train-feats=ark,s,cs:apply-cmvn --norm-vars=true --utt2spk=ark:$sdata/JOB/utt2spk scp:$sdata/JOB/cmvn.scp scp:$sdata/JOB/feats.scp ark:- | add-deltas $delta_opts ark:- ark:- | subset-feats --n=10 ark:- ark:-|" $lang/topo $feat_dim \$dir/0.mdl $dir/tree
从上述命令来看 --train-feats 指定了 gmm-init-mono 初始化使用的特征向量数据,其中通过 apply-cmvn 将 feats 进行归一化,然后通过 subset-feats 来取出 10 个特征向量作为参数
下面是具体代码的简单分析:
// 读入一定量的特征,进行统计获取 gmm 模型的 means 及 variances 数据if (train_feats != "") {double count = 0.0;Vector<double> var_stats(dim);Vector<double> mean_stats(dim);SequentialDoubleMatrixReader feat_reader(train_feats);for (; !feat_reader.Done(); feat_reader.Next()) {const Matrix<double> &mat = feat_reader.Value();for (int32 i = 0; i < mat.NumRows(); i++) {count += 1.0;var_stats.AddVec2(1.0, mat.Row(i));mean_stats.AddVec(1.0, mat.Row(i));}}if (count == 0) { KALDI_ERR << "no features were seen."; }var_stats.Scale(1.0/count);// 计算均值mean_stats.Scale(1.0/count);var_stats.AddVec2(-1.0, mean_stats);if (var_stats.Min() <= 0.0)KALDI_ERR << "bad variance";var_stats.InvertElements();glob_inv_var.CopyFromVec(var_stats);glob_mean.CopyFromVec(mean_stats);}HmmTopology topo;bool binary_in;Input ki(topo_filename, &binary_in);topo.Read(ki.Stream(), binary_in);const std::vector<int32> &phones = topo.GetPhones();// 根据 topo 中的配置来获取每个 phone 音素 pdf 类数量std::vector<int32> phone2num_pdf_classes (1+phones.back());for (size_t i = 0; i < phones.size(); i++)phone2num_pdf_classes[phones[i]] = topo.NumPdfClasses(phones[i]);// 根据每个 phone 音素对应 pdf 数量来创建 ContextDependency (决策树)对象// Now the tree [not really a tree at this point]:ContextDependency *ctx_dep = NULL;if (shared_phones_rxfilename == "") { // No sharing of phones: standard approach.ctx_dep = MonophoneContextDependency(phones, phone2num_pdf_classes);} else {std::vector<std::vector<int32> > shared_phones;ReadSharedPhonesList(shared_phones_rxfilename, &shared_phones);// ReadSharedPhonesList crashes on error.ctx_dep = MonophoneContextDependencyShared(shared_phones, phone2num_pdf_classes);}// 获取所有 pdfs 数量 = phones * 每个 phone 含有的 pdfclass 数量int32 num_pdfs = ctx_dep->NumPdfs();// 根据特征统计出的结果,创建 DiagGmm 初始化模型AmDiagGmm am_gmm;DiagGmm gmm;gmm.Resize(1, dim);{ // Initialize the gmm.Matrix<BaseFloat> inv_var(1, dim);inv_var.Row(0).CopyFromVec(glob_inv_var);Matrix<BaseFloat> mu(1, dim);mu.Row(0).CopyFromVec(glob_mean);Vector<BaseFloat> weights(1);weights.Set(1.0);gmm.SetInvVarsAndMeans(inv_var, mu);gmm.SetWeights(weights);gmm.ComputeGconsts();}// 将每个 pdf 都初始化为上述创建的 gmm ,并与pdf对应起来for (int i = 0; i < num_pdfs; i++)am_gmm.AddPdf(gmm);// 添加 perturb_factor 因子if (perturb_factor != 0.0) {for (int i = 0; i < num_pdfs; i++)am_gmm.GetPdf(i).Perturb(perturb_factor);}// 将 ContextDependency 与 topo 合并为一个模型文件保存下来// Now the transition model:TransitionModel trans_model(*ctx_dep, topo);{Output ko(model_filename, binary);trans_model.Write(ko.Stream(), binary);am_gmm.Write(ko.Stream(), binary);}// 将ContextDependency存为决策树文件// Now write the tree.ctx_dep->Write(Output(tree_filename, binary).Stream(),binary);
相关文章:

你最需要了解的H3C交换机端口安全模式
以下内容摘自正在全国热销的《Cisco/H3C交换机高级配置与管理技术手册》一书(畅销经典——《Cisco/H3C交换机配置与管理完全手册》(第二版)的配套姊妹篇)。目前京东网和卓越网上都有“满150元减50元,满300元减100元”的…

TCL发布7项AI合作项目,聘任蒋涛为技术顾问
作者 | 夕颜出品 | AI科技大本营(ID:rgznai100)2019 年 6 月 14 日,TCL 举办了以“技术无疆界,合作赢未来”为主题的技术合作开放大会。会上,TCL 面向全球发布了 13 项技术合作项目,其中包括 7 项人工智能技…

Microsoft Platform SDK Febrary 2003更新vc6的SDK网址
Microsoft Platform SDK Febrary 2003更新vc6的SDK网址,目前找到3处,分别为: 1、http://www.x86pro.com/plus/view.php?aid100 2、http://blog.csdn.net/Mobidogs/archive/2007/02/22/1512620.aspx 3、http://blog.chinaunix.net/u1/34831…

11岁姑娘挑战8分钟编程小程序!蚂蚁金服董事长井贤栋:欢迎加入
小蚂蚁说: 9月19日,在阿里巴巴云栖大会现场,一位年仅11岁的小学生万海妍报名参加了支付宝8分钟小程序挑战赛,成为现场最年轻选手。据悉,蚂蚁金服董事长兼CEO井贤栋在会后对万海妍十分赞赏,向她发出邀请&…

MST配置详解
一、 组网需求1. 网络中所有设备都属于同一个MST域。SW1和SW2为汇聚层设备,SW3和SW4为接入层设备。 2. 通过配置MSTP,使不同VLAN的报文按照不同的MSTI转发: VLAN10的报文沿MSTI1转发,VLAN30沿MSTI3转发&#…

CImg库的一个简单例子
转自:http://www.cppprog.com/2009/0424/106.html CImg是一个跨平台的C的图像处理库,提供了加载、处理、显示、保存等一系列功能,其中的图像处理功能尤其强大。 首先,建议先到这里欣赏一下使用CImg代码做的Demo,就是它…

继AutoML后,第四范式发布软硬一体化AI集成系统SageOne
作者 | 夕颜出品 | AI科技大本营(ID:rgznai100)6 月 20 日,AI产品和服务提供商第四范式宣布发布最新 AI 系列产品SageOne Appliance软硬一体化AI集成系统,性能较市面开源工具或GPU解决方案至少提高6倍。这是继 2018 年9 月 18 日第…

Apache 基金会宣布 Apache Pulsar 毕业成为顶级项目
开发四年只会写业务代码,分布式高并发都不会还做程序员? Apache 软件基金会宣布,Apache Pulsar 已经成功地从孵化毕业,成为基金会的一个新的顶级项目。Pulsar 是一个分布式的消息发布/订阅传递平台,旨在实现可扩展性…

CI报Disallowed Key Characters的解决
用CI框架时,有时候会遇到这么一个问题,打开网页,只显示 Disallowed Key Characters 错误提示。有人说 url 里有非法字符。但是确定 url 是纯英文的,问题还是出来了。但清空浏览器历史记录和cookies后。 刷新就没问题了。有时候。打…

刷新中文阅读理解水平,哈工大讯飞联合发布基于全词覆盖中文BERT预训练模型...
作者 | HFL来源 | 哈工大讯飞联合实验室(ID:rgznai100)为了进一步促进中文自然语言处理的研究发展,哈工大讯飞联合实验室发布基于全词覆盖(Whole Word Masking)的中文BERT预训练模型。我们在多个中文数据集上得到了较好…

CImg库中部分函数的作用和用法
部分内容来自于CImg参考手册或CImg的Doxygen手册 1、宏cimg_usage(usage):可以被用来描述程序的目的和使用情况。它通常被插入到 int main(int argc, char **argv)的定义之后。 参数:usage:描述程序目的和使用情况的字符串。 前置条件:使用ci…

golang通过itemid获取zabbix graph监控图
2019独角兽企业重金招聘Python工程师标准>>> #简述 本文将使用golang和第三方http client 库gorequest编写。如需要只使用golang 标准库可以参考我的另外一篇文章golang通过itemid获取zabbix graph监控图 #F&Q 为什么是golang? 网上很容易就能找到使…

n后问题-回溯法
问题描述: 在n*n的棋盘上放置彼此不受攻击的n个皇后。按国际象棋的规则,皇后可以与之处在同一行或者同一列或同一斜线上的棋子。 n后问题等价于在n*n格的棋盘上放置n皇后,任何2个皇后不放在同一行或同一列的斜线上。 算法设计: |i…

CImg库介绍
转自:http://www.cppprog.com/2009/0424/106.html CImg是一个跨平台的C的图像处理库,提供了加载、处理、显示、保存等一系列功能,其中的图像处理功能尤其强大。 首先,建议先到这里欣赏一下使用CImg代码做的Demo,就是它…

谷歌、阿里们的杀手锏:三大领域,十大深度学习CTR模型演化图谱
作者 | 王喆来源 | 转载自知乎专栏王喆的机器学习笔记今天我们一起回顾一下近3年来的所有主流深度学习CTR模型,也是我工作之余的知识总结,希望能帮大家梳理推荐系统、计算广告领域在深度学习方面的前沿进展。随着微软的Deep Crossing,Google的…

MariaDB 基金会 CEO 宣布将于 10 月 1 日卸任
开发四年只会写业务代码,分布式高并发都不会还做程序员? 近日,MariaDB 基金会 CEO Otto Keklinen 在官网宣布自己将在今年 10 月 1 日正式卸任 CEO,转而退居后线,以 CEO 特别顾问的身份辅助新 CEO 顺利渡过过渡期。从…

思科生成树命令之debug spanning-tree(本文转载自:www.91ccie.coml
debug spanning-tree 命令:debug spanning-treeno debug spanning-tree功能:打开MSTP 的调试信息;本命令的no 操作为关闭MSTP 调试信息。参数:无命令模式:特权模式使用指南:该命令是MSTP 庞大复杂debug 功能…

CImg库中CImg,CImgList,CImgDisplay三个类的介绍
转自:http://www.cppprog.com/2009/0426/108.html 本文简单介绍了CImg库中的三个大类:CImg,CImgList,CImgDisplay。然后给出了让CImg在HDC上绘图以及与HBITMAP互换的方法,为部署CImg到Windows GUI程序中提供了基本支持。 上回介绍了CImg模板…

这可能是Python面向对象编程的最佳实践
作者 | 崔庆才来源 | 进击的Coder(ID:FightingCoder)Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了或者某一对象非常复杂了,其中的一些…

mysql之 CentOS系统针对mysql参数优化
内核相关参数(/etc/sysctl.conf) 以下参数可以直接放到sysctl.conf文件的末尾: net.core.somaxconn 65535 net.core.netdev_max_backlog 65535 net.ipv4.tcp_max_syn_backlog 65535 加快TCP连接的回收: net.i…

天猫双十一神话恐终结
2011年双十一大促,天猫商城创造了单日33.6亿的促销奇迹,是2010年同日交易额的近4倍。今年双十一即将来临,淘宝还能再创奇迹吗?何玺认为,淘宝双十一的神话恐终结,理由如下。 一、电商促销年消费被透支 年初 …

opencv图像旋转
转自:http://download.csdn.net/source/2642701 /* 程序名:rotate.c 功能:读入图像文件,做图像旋转转,然后显示图像在屏幕上 */ #include <stdlib.h> #include <stdio.h> #include <math.h> #inclu…

机器如何读懂人心:Keras实现Self-Attention文本分类
作者 | 小宋是呢转载自CSDN博客一、Self-Attention概念详解了解了模型大致原理,我们可以详细的看一下究竟Self-Attention结构是怎样的。其基本结构如下对于self-attention来讲,Q(Query), K(Key), V(Value)三个矩阵均来自同一输入,首先我们要计…

通俗易懂!使用Excel和TF实现Transformer
作者 | 石晓文转载自小小挖掘机(ID:wAIsjwj)本文旨在通过最通俗易懂的过程来详解Transformer的每个步骤!假设我们在做一个从中文翻译到英文的过程,我们的词表很简单如下:中文词表:[机、器、学、习] 英文词表…

通过注册表修改VC6.0的字体【转】
2019独角兽企业重金招聘Python工程师标准>>> 在VC6.0下更改字体,我们一般通过菜单-Tools-Options-Format来更改 但在我的win7 64位系统下这一选项下的字体和字体颜色是空的,无法选择 所以我想起来通过注册表来更改。 WinR输入“Regedit”&…

Java中创建String的两种方式差异
我们知道创建一个String类型的变量一般有以下两种方法: String str1 "abcd"; String str2 new String("abcd"); 那么为什么会存在这两种创建方式呢,它们在内存中的表现形式各有什么区别? 方法1: String a …

OpenCV支持的图像格式
OpenCV目前支持的图像格式包括: Windows位图文件 - BMP, DIB; JPEG文件 - JPEG, JPG, JPE; 便携式网络图片 - PNG; 便携式图像格式 - PBM,PGM,PPM; Sun rasters - SR,RASÿ…

Debian Linux下的Python学习——控制流
python中有三种控制流语句:if、for和while。 1. if语句用法( if..elif..else) 代码: 运行: 注意:raw_input函数要求输入一个字符串,int把这个字符串转换为整数 2.for语句用法 (for ... else) 代码: 运行: 注:else部分是可选的。如果包含else,它总是在for循环结束后…

如何运行ImageMagick的命令行工具
在http://www.imagemagick.org/script/index.php网站下载相应的执行文件,这里以下载ImageMagick-6.6.5-10-Q16-windows-static.exe为例说明。 将ImageMagick-6.6.5-10-Q16-windows-static.exe下载后,安装,然后将其中需要的命令行工具考到你需…

华为最强自研NPU问世,麒麟810“抛弃”寒武纪
整理 | 一一出品 | AI科技大本营(ID:rgznai100)“能效高、算子多、精度高”,华为消费者业务手机产品线总裁何刚用一句话总结了自研达芬奇架构给最新麒麟810芯片带来的变化。6 月 21 日,在 HUAWEI Nova 5 系列新品发布会上&#x…