HDecode-HTK解码器的源码阅读总结 2013-07-10

这段时间学习语音识别,看了下HTK解码器HDecode的源码,写个总结记录下,以方便日后回顾
作者把解码的信息全放在DecoderInst这个实体里了,然后用数据对该实体的节点(一般有很多节点,作者按层的形式存储着这些节点,每层有个链表,用来维护该层的节点)所包含的相邻state之间的跳转更新分数,记录最大的分数。
1.入口函数main在HDecode.c里面, main里做了一系列初始化的工作(没管),最后定位到DoRecognition,它是主要的识别函数
2.在函数DoRecognition里面,作者一个outpBlocksize一个outpBlocksize的读取帧(outpBlocksize=1),然后调用ProcessFrame函数(在文件HLVRec-propagate.c里面)。
3.在函数ProcessFrame里,作者用该帧对DecoderInst安bfs的形式一层一层的更新节点,更新节点的操作在函数PropagateInternal里。
4.在函数PropagateInternal,作者根据当前帧的信息,更新该节点所包含的state,更新相邻state之间的跳转分数。(减枝部分还没看)
5.每处理一帧更新一次(就是没读一调帧就调用一次ProcessFrame,并把该帧作为参数传给ProcessFrame),到处理所有数据帧完为止。此时HDecode维护的信息就是最优解。

最后吐槽下作者的剪枝写的太乱了,如果把减枝的代码全删了,代码就能简洁很多

语音识别学习总结 2013-07-03

前端时间用HTK磕磕碰碰的走了一遍语言识别的整个流程,对语言识别有了个初步的了解,下面是自己对这段时间学习的总结。

语音识别系统整体上包括两大部分:训练和识别。
训练:海量语音、语言数据库 —(信号处理和知识挖掘)—> 声学模型+语言模型
识别:利用训练好的“声学模型”和“语言模型”对用户说话的特征向量进行统计模式识别(又称“解码”),得到其包含的文字信息, 乔正“声学模型”和“语言模型”。
一个最基本的语音识别系统(去除了训练部分的识别系统)如下图所示


主要包括一下四个模块
1.特征提取
a)用HCopy可以对语音材料库中的声音文件提取MFCC声纹特征
2.声学模型
a)用HInit,Hcompv,HRest等工具来训练声学模型(HMM)
3.语音模型
a)用HParse来训练语音模型
4.字典
a)发音对应到文字

有了以上准备之后就可以用HVite进行识别:
识别的大概原理就是,用生成的语音模型形成图(用字典把语音模型的词转成与其对应的基本元),图的点就是词的基本元,图里边的权值根据声学模型的HMM计算出来,然后对提取出来的MFCC声纹特征(理解成一个矩阵数组)在图里找路径正好覆盖它。这条路径对应的词就是识别的结果
最后HTK给我的感觉就是HTK的参数设置有点乱,最后整个试验过程中在语料准备方面微微遇到点麻烦。

Welcome 2013-03-29

Welcome, this is Hanson.