Kaldi阅读并更改代码
Common utilities
base/kaldi-common.h
几乎所有Kaldi程序都会include该头文件。
该头文件include了一些其他位于base/目录的头文件,主要提供:
- 错误-日志
宏 - 类型定义(typedefs)
- 数学实用程序函数(如随机数生成器)
- 其他#defines
util/common-utils.h
命令行参数解析
I/O函数(处理带管道的文件名)
ark列表处理
列表类型
字符串转换
gmm/model-common.h
GMM/SGMM的枚举,如:模型哪些部分需要更新
gmm/diag-gmm.h
单个GMM的定义,对GMM的操作,包括:
调整混合组元数以及特征维数
复制
高斯采样
扰动
分裂
合并
对组元的增、删、改、读写
似然计算
根据数据选择似然最高的组元
private:
/// GMM Constant(对数高斯混合模型概率密度函数中的常量)
/// 即 log(weight) - 0.5 * (log det(var) + mean*mean*inv(var))
Vector<BaseFloat> gconsts_;
bool valid_gconsts_; ///< Recompute gconsts_ if false
gmm/am-diag-gmm.h
该类仅储存了一个GMM列表,以及定义了一些存取函数和便捷函数。
std::vector<DiagGmm*> densities_;
矩阵库
matrix/matrix-lib.h
该头文件是对BLAS和LAPACK的封装
sp-matrix.h
压缩的对称矩阵(symmetric packed matrices)
tp-matrix.h
压缩的上下三角矩阵(triangular packed matrices)
srfft.h
分裂基快速傅里叶变换(Split Rafix FFT)
matrix/kaldi-matrix.h
矩阵定义、矩阵运算,tutorial
在文件matrix/matrix-lib-test.cc中添加一个测试函数。如前所述,如果出现问题,测试程序将被设计为以非零状态中止或退出。
我们将为Vector::AddVec函数添加一个测试例程。该函数将一个常量乘以一个向量,并加到另一个向量中。仔细阅读下面的代码,尽可能多地理解它(请注意:我们故意在代码中插入了两个错误)。如果你对模板不熟悉,理解它可能会很困难。我们尽量避免使用模板,因此Kaldi的大部分内容在不知道模板编程的情况下仍然可以理解。
template<class Real> void UnitTestAddVec() { // note: Real will be float or double when instantiated. int32 dim = 1 + Rand() % 10; Vector<Real> v(dim); w(dim); // two vectors the same size. v.SetRandn(); w.SetRandn(); Vector<Real> w2(w); // w2 is a copy of w. Real f = RandGauss(); w.AddVec(f, v); // w <-- w + f v for (int32 i = 0; i < dim; i++) { Real a = w(i), b = f * w2(i) + v(i); AssertEqual(a, b); // will crash if not equal to within // a tolerance. } } |
特征提取代码
feat/feature-mfcc.h
数据成员有:
// lifter系数
Vector<BaseFloat> lifter_coeffs_;
// 离散余弦变换(Discrete Cosine Transformation)矩阵
Matrix<BaseFloat> dct_matrix_; // matrix we left-multiply by to perform DCT.
// 最小对数能量
BaseFloat log_energy_floor_;
// 梅尔滤波器组,声道长度归一化系数
std::map<BaseFloat, MelBanks*> mel_banks_; // BaseFloat is VTLN coefficient.
// 分裂基傅里叶变换
SplitRadixRealFft<BaseFloat> *srfft_;
// note: mel_energies_ is specific to the frame we're processing, it's
// just a temporary workspace.
// 当前帧的梅尔能量
Vector<BaseFloat> mel_energies_;
以及特征计算函数
声学决策树以及HMM拓扑代码
tree/build-tree.h
决策树构建主要是由BuildTree函数实现:
EventMap *BuildTree(...)
其返回值EventMap是一个能够表示从EventType((key, value)二元组向量)到EventAnswerType(整数)的映射。
、1或2);
其中-1表示当前位置位于该HMM中(粗略的位置)
value表示音素的标识符;
BuildTree()函数的输入数据为
const BuildTreeStatsType &stats,
其类型BuildTreeStatsType:
typedef vector<pair<EventType, Clusterable*> > BuildTreeStatsType;
其中的EventType:
typedef vector<pair<EventKeyType, EventValueType> > EventType;
EventType是三音素标识符,如{{-1, 1},{0, 15},{1, 21},{2, 38}}表示左上文音素为15、右下文音素为38的三音素21,并且其pdf-class(中间状态的标识符)为1。
Clusterable* 是指向一个接口类,支持如 统计数据相加、目标函数(如似然)计算 的运算。
在常见的脚本中,该指针通常指向一个统计数据类。
该类包含足够的用于估计对角高斯pdf的统计数据。
如:
class GaussClusterable: public Clusterable{
private:
Matrix<double> stats_;//两行的矩阵,一行为向量之和,一行为向量的平方和
}
在进行accumlate tree时,为三音素中的每个HMM状态(即pdf-class)统计单高斯的统计数据。
-ci-phones选项(该选项是优化项,不加也可)用于指定无需进行数据统计的上下文无关音素(如静音音素)。
该程序的输出可以被看作是上述的BuildTreeStatsType。
Kaldi阅读并更改代码的更多相关文章
- maven工程使用spring-boot-devtools进行热部署,更改代码避免重启web容器
spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.相关Blog: 点击打开链接 原理是在发现代码有更改之后,重新启动应用 ...
- Week3 博客阅读感想和代码复审
一.关于博客阅读感想 阅读了十多篇老程序员(大多在计算机相关行业工作超过10年)关于自身经历的博客,很有感触.这里一方面总结一下看博客的收获,另一方面写点自己的感受. 首先,这些博客不少涉及到了两大类 ...
- 用emacs 阅读 c/c++ 代码
在emacs编程中有以下需求 从调用一个函数的地方跳转到函数的定义的地方 或是反过来从函数定义的地方列出所有调用这个函数的地方 实现办法 需要安装以下软件 gnu global(阅读源代码的工具)官网 ...
- 如何阅读luajit的代码——用vs调试篇
为什么要看luajit的源码 作为目前最快的脚本语言之一,luajit确实是一个杰作,但相比原生lua仅仅几万行的代码而言,luajit却可以说是巨无霸.更要命的是,luajit之所以快,是因为大量使 ...
- perl 里面如何写出阅读友好的代码提示
在我们使用别人写好的程序时,经常会使用-h 之类的东西查看一下简单的帮助手册或者说明信息: 对于perl 语言而言,写起来简单,经常随手一写,解决了当时的问题,但是过几天去看,你都不知道这个脚本该怎么 ...
- 阅读prettytable 一些代码、get、set 检查参数
阅读代码是因为我发现官方教程里的代码在本地不能用,所以就通过”查看定义“转到了源代码里. 通过阅读源代码,查看方法内是否有教程中所说的方法名和参数名,然后再通过”查看引用“来试图了解函数的流程,如果没 ...
- 利用Eclipse CDT 阅读C/C++代码
本文转自: https://xbgd.iteye.com/blog/1259544 常见阅读代码的工具有 , visual c++, visual studio + va(visual assista ...
- Dreamweaver CS5更改代码颜色方法代码
XP系统下: C:\Documents and Settings\Administrator\ApplicationData\Adobe\Dreamweaver CS4\zh_CN\Configura ...
- linux源代码阅读笔记 get_free_page()代码分析
/* 34 * Get physical address of first (actually last :-) free page, and mark it 35 * used. If no fre ...
随机推荐
- 洛谷P1463 反素数
经典题了,很难想到这TM是搜索...... 题意:求[1, n]中约数最多的数中最小的. 解:我们有约数个数定理. 所以考虑通过枚举每个质因数个数来直接计算出约数个数. 然后就可以搜索了. 注意:若p ...
- Eclipse搭建SpringBoot之HelloWorld
你的eclipse需要先安装 Spring Tool Suite™ 第一种方法(不建议,之所以贴上是因为探索的过程) 首先新建Maven工程 勾选第一个按钮,第三个是选择working set ,你可 ...
- Android Eclipse 安装教程 hosts替换
http://www.cnblogs.com/Potato-lover/p/5582542.html 第一步,也是最为关键的一步——修改hosts文件 为什么说是最关键的一步呢?因为接下来的操作,我们 ...
- TODO java 作业-梭哈--待完成
作业:定义一个类,该类用于封装一桌梭哈游戏,这个类应该包含桌上剩下的牌的信息,并包含5个玩家的状态的信息,他们各自的位置,游戏状态(正在游戏或已放弃),手上已有的牌等信息.如果有可能,这个类还应该实现 ...
- Mac idea中git igenore设置
- 函数,参数数组params与数组参数,结构函数
1.函数 static 返回值类型 函数名(形参1,形参2,...){ 函数体; return 返回值; } 无返回值,则static void 函数名(){ } stat ...
- Luogu P4009 汽车加油行驶问题
题目链接 \(Click\) \(Here\) 分层图..好长时间没写差点要忘了\(hhhhh\),其实思路还是很明了的. 注意需要强制消费. #include <bits/stdc++.h&g ...
- (最小生成树) codeVs 1231 最优布线问题
题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外 ...
- 决策树decision tree原理介绍_python sklearn建模_乳腺癌细胞分类器(推荐AAA)
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- 访问内网(https,udp)
安装teamview 客户端. 安装vpn驱动(这里的VPN应该是A主机与B客户端分别连接上了teamview的服务器,但是本身不是局域 网,所以不能直接访问A的局域网的其他主机) 主机端A,安装主机 ...