LDA(线性判别分析,又称为Fisher线性判别)是对标记数据的一种常见的降维算法。kaldi在对原始特征的常见处理中,就包括了应用LDA变换这一操作(但是一般不降维,比较奇怪)。本文主要讲解LDA的数学原理和在kaldi中的具体实现。
编辑距离
编辑距离指在有限编辑条件下(增加,删除,替换),将一个字符串变换成另一个字符串所需的最小操作次数。语音中用到编辑距离的地方还是蛮多的,比如对CTC的预测进行评估的时候,就可以采用编辑距离。
关于Attention机制
语音识别这块目前常见的端到端的方法除了CTC之外,就是attention(注意力)机制了。attention不同于CTC有着比较明确的数学定义和模式,它描述的应该是心理学现象中人注意力的某个特性,比如人的视觉上的注意力短期内只能集中在某一个区域中,而没有涵盖全部的视野范围。具体到语音识别任务(相比于图像和机器翻译领域,应用的算是比较晚的了)上,从字面意思看不出应该如何使用它。不过目前常见的使用方式和机器翻译类似,还是在encoder-decoder框架中使用。这种结合的思想是,定义一种描述注意力的方式,使得decoder可以尽量关注“有用”部分的信息,而不是全部的编码信息或者历史信息。
Kaldi中的决策树
三音素状态绑定这部分通过以下四个步骤完成,分别对应acc-tree-stats
,cluster-phones
,compile-question
,build-tree
:
- 统计量累计
- 音素聚类
- 问题集生成
- 决策树构建
加权自动机的索引构造
现实任务中,我们得到的大量信息都具有很高的不确定性,比如语言识别的结果取N-best的lattice网络,其中就包括了N种可能的带权序列。在对这种不确定信息的检索不同于以往确定信息中的检索模式(显然是权值相关的)。
我们可以将这些不确定的序列统一的用一个加权自动机(状态节点和带权的转移边)表示,那么这个问题就可以抽象成一个对加权自动机的索引构造算法。
一个简单内存管理器的实现
可能是C/C++用的多一些,看代码的时候总是习惯先看内存分配和管理部分的内容,看完之后心里才觉得踏实。之前看HTK源码的时候发现HTK中实现了一个简单的内存管理器(MemHeap),当时好奇,看了一下实现思路,非常朴素。
Kaldi中的Transition Model
kaldi中的Transition Model主要维护了概率密度函数pdf,HMM拓扑类型,以及所有音素的HMM状态信息(即音素id,状态id,和对应的概率密度函数的id,单独索引的transition-id)。这篇是过去的讲解列表,弄清前面说的几个id之间的关系就行了。
小结一下
从拿下一个腾讯云主机到今天把域名申了,零零星星两个多星期了。为了避免站点上东西太少,我从Cmd Markdown上拿了一部分东西(还是那句话,我只是在意一个markdown编辑器而已……)在markdown上记笔记,整理知识点还是相对随意的,毕竟就是自己看,能会意就行。放在云上,虽然我不会刻意去推广,但是仍然感觉会有误人子弟的潜在风险存在。
Connectionist Temporal Classification
CTC(Connectionist Temporal Classification)是为递归神经网络设计的一种输出层的损失准则。在语音领域,识别任务实际上是一种序列标记任务。比如,识别的目标就是要将观测到的帧序列映射到字符序列。传统的识别方案需要依靠因素分类器(即声学模型)得到当前观测帧的因素后验,之后借助解码网络得到最优路径从而得到字符序列。
基于Kaidi谱特征的语音重构
第一次是拿C写的,提谱特征,过增强网络,之后取噪声相位,重构音频,弄了一个星期,后来发现,其实可以不必这么麻烦的。用kaldi得到的增强特征,做一个逆的CMVN,之后拿Python处理一下特征还原就行了。