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(整数)的映射。

、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阅读并更改代码的更多相关文章

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

    spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.相关Blog: 点击打开链接 原理是在发现代码有更改之后,重新启动应用 ...

  2. Week3 博客阅读感想和代码复审

    一.关于博客阅读感想 阅读了十多篇老程序员(大多在计算机相关行业工作超过10年)关于自身经历的博客,很有感触.这里一方面总结一下看博客的收获,另一方面写点自己的感受. 首先,这些博客不少涉及到了两大类 ...

  3. 用emacs 阅读 c/c++ 代码

    在emacs编程中有以下需求 从调用一个函数的地方跳转到函数的定义的地方 或是反过来从函数定义的地方列出所有调用这个函数的地方 实现办法 需要安装以下软件 gnu global(阅读源代码的工具)官网 ...

  4. 如何阅读luajit的代码——用vs调试篇

    为什么要看luajit的源码 作为目前最快的脚本语言之一,luajit确实是一个杰作,但相比原生lua仅仅几万行的代码而言,luajit却可以说是巨无霸.更要命的是,luajit之所以快,是因为大量使 ...

  5. perl 里面如何写出阅读友好的代码提示

    在我们使用别人写好的程序时,经常会使用-h 之类的东西查看一下简单的帮助手册或者说明信息: 对于perl 语言而言,写起来简单,经常随手一写,解决了当时的问题,但是过几天去看,你都不知道这个脚本该怎么 ...

  6. 阅读prettytable 一些代码、get、set 检查参数

    阅读代码是因为我发现官方教程里的代码在本地不能用,所以就通过”查看定义“转到了源代码里. 通过阅读源代码,查看方法内是否有教程中所说的方法名和参数名,然后再通过”查看引用“来试图了解函数的流程,如果没 ...

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

    本文转自: https://xbgd.iteye.com/blog/1259544 常见阅读代码的工具有 , visual c++, visual studio + va(visual assista ...

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

    XP系统下: C:\Documents and Settings\Administrator\ApplicationData\Adobe\Dreamweaver CS4\zh_CN\Configura ...

  9. linux源代码阅读笔记 get_free_page()代码分析

    /* 34 * Get physical address of first (actually last :-) free page, and mark it 35 * used. If no fre ...

随机推荐

  1. C# winfrom容器布局与工具栏&&右键菜单栏&&隐藏显示小图标的的简单事件

    前两天的时候学习了winfrom,简单地说就是各种布局,然后给按钮,textbox等各种控件添加各种事件的操作,经过前天一晚上,昨天一天的练习操作的还算熟练,但是对构造函数传值还是不是很了解,由于各种 ...

  2. (转)每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    背景:在redis集群中,有关于一致性哈希的使用. 一致性哈希:桶大小0~(2^32)-1 哈希指标:平衡性.单调性.分散性.负载性 为了提高平衡性,引入“虚拟节点” 每天进步一点点——五分钟理解一致 ...

  3. 【译】8. Java反射——注解

    原文地址:http://tutorials.jenkov.com/java-reflection/annotations.html ================================== ...

  4. linux 下配置svn

    1.以前配置好的,没做笔记,忘记了.现在重新回忆 查找svn目录:find / -name svn 找到/projects/svn cd /projects/svn 看里面的配置: 查看配置 [roo ...

  5. Mac上在终端上解压与压缩

    1.安装rar 1.brew install unrar 2.unrar -version 3.进入需要解压的文件目录下,unrar x 文件夹名.rar 1.tar -xvf [file.tar.g ...

  6. Luogu P2617 Dynamic Rankings

    带修主席树的模板,因为状态不好所以敲了很长时间,不过写完感觉能更好地理解主席树了. 核心其实就是树状数组套主席树,维护方法不再是以前的那种一步一修改,而是对于树状数组上的每一个点建立一棵权值线段树,然 ...

  7. RocketMQ_问题_启动报错,修改堆内存大小

    1.启动broker报错 虚拟机内存小,导致虚拟机中的JVM内存小,进而在启动broker时分配JVM内存遇到问题 查询网上得知,查看/usr/local/rocketmq-all-4.3.0/dis ...

  8. JSON的简单使用_解析前台传来的JSON数据

    package cn.rocker.json; import org.junit.Test; import net.sf.json.JSONArray; import net.sf.json.JSON ...

  9. java socket / No buffer space available

    s https://www.cnblogs.com/yiwangzhibujian/p/7107785.html Socket用在哪呢,主要用在进程间,网络间通信. https://www.cnblo ...

  10. javaweb简单登陆例子

    JSP+Servlet+JavaBean简单程序例子——用户名密码登陆,摘自<Tomcat&JavaWeb 技术手册>,亲测可用. IDE环境:MyEclipse10 1.建立We ...