建议在csdn资源页中免费下载该学习笔记的PDF版进行阅读:)点击进入下载页面
Kaldi决策树状态绑定学习笔记(四)
——如何构建决策树?
到现在为止,程序acc-tree-stats累积好了构建决策树所需的统计量,程序cluster-phones和compile-questions自动生成好了构建决策树所需的问题集,我们也准备好了roots.int文件,那么我们就可以开始构建决策树,对三音素GMM的状态进行绑定。这次笔记的主要内容是讲解Kaldi如何构建决策树,实现对三音素GMM状态的绑定。
在这个笔记中,首先我会介绍构建决策树的主程序build-tree和主函数BuildTree(),然后介绍主函数中用到的核心函数GetStubMap()和SplitDecisionTree()。
建议学习Kaldi官方文档《Decision tree internals》的Classes and functions involved in tree-building部分,官方文档《How decision trees are used in Kaldi》和论文《Tree-Based State Tying For High Accuracy Acoustic Modelling》S.J.Young的第三部分Tree-BasedClustering。
目录
build-tree
- 作用:构建决策树
- 输入:累积的统计量treeacc、问题集questions.qst、roots.int、HMM拓扑topo
- 输出:决策树tree
- 示例:
build-tree $context_opts --verbose=1 --max-leaves=$numleaves \
--cluster-thresh=$cluster_thresh $dir/treeacc $lang/phones/roots.int \
$dir/questions.qst $lang/topo $dir/tree
- 过程:
- 读取roots.int,得到1)
vector<vector<int>> phone_sets
,其一个元素包含roots.int的一行上的所有音素;2)vector<bool> is_shared_root
,其一个元素指明该行的音素是否共享三个HMM状态的决策树树根;3)vector<bool> is_split_root
,其一个元素指明是否对该行音素对应的决策树树根进行划分。 - 读取topo文件,得到保存HMM拓扑结构的对象HmmTopology topo,一般音素的HMM状态为三个,我们实验室只有SIL和SPH的HMM状态为五个。
- 读取treeacc,得到累积的统计量BuildTreeStatsType stats。
- 读取questions.qst,得到Questions qo。
- 调用topo.GetPhoneToNumPdfClasses(&phone2num_pdf_classes)得到
vector<int> phone2num_pdf_classes
,其元素保存每个音素对应的HMM状态数(前面说了,除了音素SIL和SPH的HMM状态数为5,其他均为3)。 - 调用BuildTree(),返回保存整个大决策树的EventMap *to_pdf。
- 用to_pdf初始化对象ContextDependency ctx_dep(N, P, to_pdf),并将ctx_dep写到文件tree。Kaldi用类ContextDependency对决策树进行封装,其数据成员包含音素宽度N_(=3)、中间音素位置P_(=1)、决策树to_pdf_。
- 读取roots.int,得到1)
BuildTree()
EventMap *BuildTree(Questions &qopts,
const std::vector<std::vector<int32> > &phone_sets,
const std::vector<int32> &phone2num_pdf_classes,
const std::vector<bool> &share_roots,
const std::vector<