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

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);

kaldi 源码分析(十) - gmm-init-mono.c分析相关推荐

  1. 【vue-router源码】十二、useRoute、useRouter、useLink源码分析

    [vue-rouer源码]系列文章 [vue-router源码]一.router.install解析 [vue-router源码]二.createWebHistory.createWebHashHis ...

  2. 【Android 10 源码】healthd 模块 HAL 2.0 分析

    Android 9 引入了从 health@1.0 HAL 升级的主要版本 android.hardware.health HAL 2.0.这一新 HAL 具有以下优势: 框架代码和供应商代码之间的区 ...

  3. Alian解读SpringBoot 2.6.0 源码(十):启动流程之自动装配原理

    目录 一.背景 1.1.主类的加载 1.2.后置处理器的获取 二.配置类后处理器 2.1.获取配置类 2.2. 2.3.解析主类 2.3.1.整体解析过程 2.3.2.核心解析过程 2.3.3.延迟导 ...

  4. 价值4500的国际版多语言点赞抖音分享点赞任务平台源码(十二种语言)

    介绍: 平台会员分享给我的,他自己搭建成功了,测试可用!我就不测试了,需要的拿! 九种语言 :西班牙语,泰语.日语,印度尼西亚语言.越南语言.英文.繁体中文,简体中文,印度语 前台支持更换5种颜色风格 ...

  5. 深入剖析Spring Web源码(十九) - 整理的文档和日志的索引(第一版)

    整理的文档 把所有的<深入剖析Spring Web>系列日志整理成为文档,供大家下载阅读,希望对大家有所帮助.里面有些章节尚未完成,所以称为第一版.希望不久的将来,能把没有完成的章节在第二 ...

  6. vue+django 微博舆情系统源码、深度学习+舆情扩散消失分析、舆情紧急等级、属地分析、按话题、情感预测、话题评论获取、提取观点、正面负面舆情、按区域检测舆情

    项目背景 315又马上要到了,现在有开始对食品安全话题的关注地提升了,因此,本文系统对微博的食品安全话题进行分析,有如下的功能 1.展示当前食品安全事件相关的热点信息以及提供根据食品关键词,食品安全类 ...

  7. Postgresql源码(82)SPI模块拆解分析一:执行简单SQL获取结果

    相关 <Postgresql源码(76)执行器专用元组格式TupleTableSlot> <Postgresql源码(82)SPI模块拆解分析一:执行简单SQL获取结果> &l ...

  8. 抖音seo优化源码搭建/搜索排名系统,技术理论分析搭建中。

    抖音seo系统源码SaaS+源码私有化部署搭建,抖音seo源码,抖音seo系统源码,抖音seo系统搭建部署,抖音已经成为了当今最为流行的短视频平台之一,拥有着庞大的用户群体和海量的视频资源.对于一些商 ...

  9. [附源码]计算机毕业设计JAVA学生考试成绩分析系统

    [附源码]计算机毕业设计JAVA学生考试成绩分析系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(In ...

  10. Postgresql源码(69)常规锁细节分析

    相关: <Postgresql源码(40)Latch的原理分析和应用场景> <Postgresql源码(67)LWLock锁的内存结构与初始化> <Postgresql源 ...

最新文章

  1. JavaScript中this关键字使用方法详解
  2. Struts配置文件务必采用正确的DTD
  3. 中国最懂自动驾驶量产公司秀肌肉:自动驾驶算力怪兽、百亿参数云端超大模型、百万公里路测里程...
  4. 标准C程序设计七---12
  5. HDU 1407 测试你是否和LTC水平一样高 (HASH)
  6. Java - concurrent包详解
  7. 个人成长:2021年中随想记
  8. dnf韩服服务器维护中,DNF2019韩服4.30维护:这些职业被加强
  9. linux7.0安装oracle乱码,Oracle Linux 7设置中文字符集
  10. 裁员潮来袭!IT行情雪崩之下,我靠它竟能逆向突破职业危机
  11. zabbix监控Nginx/Tomcat/MySQL
  12. JAVA怎么接收长字符串_【Java】Java中常用的String方法
  13. 【题解】保安站岗[P2458]皇宫看守[LOJ10157][SDOI2006]
  14. 格雷码与二进制转换的verilog实现
  15. java短信验证码接口demo分享
  16. 电磁散射特性与SAR影像之间的关联,典型地物的散射特性
  17. 数据可视化Matplotlib-中
  18. JavaScript 中的数字在计算机内存中占多少个Byte?
  19. mailbox的controller
  20. Metaverse 元宇宙入门-09-不断发展的用户 + 商业行为和元界

热门文章

  1. Linux下获取usb视频设备vendor id和product id的8种方法
  2. TensorRT Samples: MNIST API
  3. linux nor flash 读写,9.2 NorFLASH读写实验——M25PExx
  4. 董东 java_Java面向对象程序设计
  5. 未找到beta版怎么解决_刚刚,谷歌正式发布Android 11 Beta版,带来多项重磅更新...
  6. Java项目:宠物医院预约挂号系统(java+JSP+Spring+SpringBoot+MyBatis+html+layui+maven+Mysql)
  7. oracle 条件反转,Oracle反转倒置函数
  8. 终极方案!解决正确设置LaunchImage后仍然不显示的问题
  9. 微信小程序的数字有部分会自动加粗的解决方法
  10. Mac 安装Android Studio