Kaldi阅读并更改代码

Common utilities

base/kaldi-common.h

几乎所有Kaldi程序都会include该头文件。

该头文件include了一些其他位于base/目录的头文件,主要提供:

  1. 错误-日志
  2. 类型定义(typedefs)
  3. 数学实用程序函数(如随机数生成器)
  4. 其他#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(整数)的映射。

key表示音素上下文位置(如,-1、0、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。

原文地址:https://www.cnblogs.com/JarvanWang/p/9152620.html

时间: 2024-11-12 06:20:42

Kaldi阅读并更改代码的相关文章

如何阅读一份代码?

https://zhuanlan.zhihu.com/p/26222486 ****************************** 上文谈到了像读书一样阅读源码的重要性,今天谈谈如何阅读一份代码.我所谓的一份代码,其范围可能从几千行到数万行,有时甚至可多达数十万行.这些代码作为一个有机体,共同完成某些重要的功能.比如说几个著名的 full fledged web framework,祖师爷 rails,师叔 django 和小师妹 phoenix: 三者对比很有意思 - rails / d

如何阅读别人的代码

############################################## """ 阅读什么样的代码? 很难明确的说应该阅读什么样的代码,只能说有一些基本的原则: 1,阅读那些你用得着的代码 这一步最好从阅读那些你已经在使用的插件或者库文件开始. 这些都是你可以学习的非常好的例子.你已熟悉了它们的公共API,了解它们内部工作原理的障碍是较低的.此外,作为代码的用户,你有机会添加文档.实现新的功能,或者通常以某种方式给项目做贡献. 2,阅读那些你印象深刻的代码

如何通过阅读别人的代码提高自己的编程能力

代码阅读的必要性 阅读别人的代码作为研发人员是一件经常要做的事情.一个是学习新的编程语言的时候通过阅读别人的代码是个最佳的学习方法,另外是积累编程经验.如果你有机 会阅读一些操作系统的代码会帮助你理解一些基本的原理.更有就是在你作为一个质量确保人员或一个小领导的时候如果你要做白盒测试的时候没有阅读代码的能力 是不能完成相应的任务.最后一个就是如果你中途接手一个项目的时候或给一个项目做售后服务的时候是要有阅读代码的能力的. 收集所有可能收集的材料阅 读代码要做的第一件事情是收集所有和项目相关的资料

阅读面向对象的代码:我们要有两个关注点:

阅读面向对象的代码:我们要有两个关注点:对象如何被创建,创建流程是什么样的:对象是如何被组织的,也就是被谁引用了:对象的方法是如何被调用的,也就是方法在什么地方,什么时机被触发执行的:如果对上述三点能够很好的把我,那么阅读代码也是一种剥丝抽茧的过程另外,在分析调用关系时,一定要有一个主链条,不能什么都要了解的非常透彻,要对你当下分析的主流程进行重点分析(其他涉及到的点点滴滴可以暂时搁置,后面再分析): 原文地址:https://www.cnblogs.com/big1987/p/10898963

maven工程使用spring-boot-devtools进行热部署,更改代码避免重启web容器

spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.相关Blog: 点击打开链接 原理是在发现代码有更改之后,重新启动应用,但是比速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间. 其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为  restart ClassLoader ,这样在有代码更

Dreamweaver CS5更改代码颜色方法代码

XP系统下: C:\Documents and Settings\Administrator\ApplicationData\Adobe\Dreamweaver CS4\zh_CN\Configuration\CodeColoring Win7系统下 C:\用户\Administrator\AppData\Roaming\Adobe\DreamweaverCS5\en_US\Configuration\CodeColoring 覆盖完成以后,发现背景并没有改变, 覆盖后还要执行:编辑->首选项参

拿什么心情来阅读我的代码(程序员的必备心理技能)

原文首发于我的微信公众号:GeekArtT . 阅读源代码的开始阶段,最好从感兴趣.自己有直观感受且有相对丰富准确的文档的项目开始.如同最开始阅读数学证明,最好从浅显易懂的教材开始,之后再开始最前沿的paper阅读. 阅读源代码需要同阅读证明一样的耐心,甚至更多.数学的定义或许就在前一页,可是源代码的某个新的类却需要你不断地Google,进而找到适合自己的关于原始概念的定义论述. 阅读源代码一定要放空自己的心,要做好精心死磕的准备.至少要在心理上给自己留出足够多的空间与时间.大不了拿出大段时间去

用emacs 阅读 c/c++ 代码

在emacs编程中有以下需求 从调用一个函数的地方跳转到函数的定义的地方 或是反过来从函数定义的地方列出所有调用这个函数的地方 实现办法 需要安装以下软件 gnu global(阅读源代码的工具)官网 emacs的gtags插件 启动emacs后,输入下面的命令,来启动gtags的功能 M-x ggtags-mode gnu global安装 apt-get install global emacs的gtags插件安装 M-x list-packages 找到ggtags后,鼠标点击,再点安装

利用Eclipse CDT 阅读C/C++代码

本文转自: https://xbgd.iteye.com/blog/1259544 常见阅读代码的工具有 , visual c++, visual studio + va(visual assistant), 以及 source insight, 这几个功能强大的收费软件 , 目前用得非常多 , 尤其是 Source Insight( 以下简称 SI), 是一个不错的跨平台的软件 . 今天推荐的 Eclipse C++ 版本 , 同样也是一个优秀的开源阅读代码的工具 , 其优越性有甚于 SI,