那么趁着这个机会,研究一下kaldi源码中MFCC部分的内容。不说废话,我们从 compute-mfcc-feats.cc开始讲解,这里是个main函数,需要携带参数,具体使用样例如下:
1.compute-mfcc-feats:
其实看到这里我是一脸懵逼的,并不知道该如何用,没办法硬着头皮往下看。
这句看起来好似定义了一个类,要想知道它到底在干什么,我们找到ParseOptions中。【这里注意一下,关于这些子类,我不做细节介绍,只做整体查看,不然细节太多,文章篇幅会很大。】ParseOptions如下:
看这个类应该对命令有关的操作,所以我理解ParseOptions仅仅是对用户输入的命令进行各种执行转化显示解析等操作,不做细节讲解,泛化概念上先如此理解。
我们接着往下看:
这是个结构体,比较重要。先整体看一下结构体的组成:
这个结构体定义了MFCC使用到的一些参数,并对其进行了初始化操作。这里又涉及到一个MelBanksOptions,具体如下:
他是对梅尔滤波器组进行操作所需的参数和方法的结构体。关于这里的Register函数,我个人认为是类似于某种map映射类型的操作,保存变量的值,具体理解是否正确后面会再次说明。
下面主要是一些变量的声明,群体贴出来。不具体讲每个变量的意义,很大一部分我都不知道干什么的,不过不影响我们继续往下看。
接下来定义了一个Mfcc:
不过Mfcc只不过是一个宏定义,其真实类型是OfflineFeatureTpl,其定义如下: