伸展树是一种二叉平衡树,普通搜索树在构造序列不是很理想的情况下,访问复杂度会退化。相比于较高级的一点平衡树,伸展树实现上还是比较简单的,只有左旋和右旋两个操作。这种数据结构的优化思路是利用数据访问的局部性,将上次访问的数据节点旋转到根节点,而不破坏平衡树的结构。
STC/MLLT
GMM的传统建模中,为了避免建模单元参数过多,默认只存储协方差矩阵的对角形式。实际上这里做了一个隐性的假设,就是数据各个维度之间是不相关的,显然,这一点并不成立,但是如果对于每一个GMM建模单元都采取协方差矩阵表示方差的话,模型的整体参数量会急剧增大,所以,对于这一问题,一般有以下两种方式解决:
- 特征方案,通过去相关算法,使得数据分布更适合用对角矩阵建模,比如DCT和LDA算法
- 模型方案,根据生成观测的不同状态,使用不同的变换算法
Semi-Tied方法属于第二种,是基于state-specific rotation提出的一种通过在状态之间共享变换矩阵,解决该问题的方式。
后缀自动机之DAWG构造
最近需要参考一下文本检索的思路,所以看了一下后缀自动机并做了实现。
WFST核心算法
论文参考经典之作“Speech Recognition With Weighted Finite-State Transducers”,网上随便就能搜到。
状态绑定之决策树似然公式
对于一般决策树而言,每一次的最优划分,是要找到一个标准,使得在这种标准之下进行的划分获取的信息增益最大,这里的信息增益一般表示划分之后信息熵的增量。在ASR中,决策树的划分标准是获取最大似然提升,在GMM模型中,对于一个状态集合$S$,其似然表示为:
swig处理C指针参数传递
用Python调用C模块容易发生的就是参数类型不一致的问题,比如,C函数接收传入指针,python端怎么办?这里使用swig作为一种备选方案,处理方式不一定明智简洁,旨在说明可行性。
Python绘制语谱图
Linux上没装matlab,没有audition,开源的audacity程序没法看语谱(找到看的方法了……),所以当时就简单写了一个,勉强能看。
Ubuntu上安装pyfst
pyfst是对openfst的python API封装,学习fst过程中,实现代价相对较低,安装的时候只要先装openfst,再pip install pyfst
就OK了,但是,问题就出在这俩步上
本地交叉编译Android执行文件
用NDK很久了,玩一玩交叉编译,其实使用ndk-build
和Android.mk
,Application.mk
文件也可以做这件事,但是因为NDK自带了toolchain的脚本,配置很方便,简单的编译可以依赖cmd了。
JNI下C读写大小端和权限问题
最近搞项目期间需要频繁的操作数据文件,之前都是用C进行操作,转到java的时候出现了一点小问题:
在Android平台上进行wave的特征重构,重构的wave文件希望使用C直接输入,因为这部分代码在PC上已经验证通过了。Android的话,Application的Context本身提供了openFileInput
和openFileOutput
,用于创建,写入存在目录/data/data/package_name/files/
里面的文件。所以如果希望java能够读取C的输出文件的话,C在JNI部分的输出目录也应该是上面这个。