在本文中,讲记录一些自己在使用kaldi时对kaldi的理解和kaldi的一些常用的数据处理方式。

compute-vad

要弄清这个计算vad的命令,要搞懂两点。

  • compute-vad是怎么计算的(参考ComputeVadEnergy()

    compute-vad接受的是一个FxN的特征,F是frame的个数,N是特征的维度。对于每一帧,compute-vad会有一个输出,0或者是1。1代表这一帧是语音帧,0代表这一帧是非语音帧。在计算输出的时候,compute-vad只会读取每一帧特征的第一个参数(认为这个参数是log能量或者是类似的值),然后将这个参数与阈值进行比较(5.0 + 0.5 * (average log-energy in this file)),大于阈值则表示语音帧,小于阈值则表示非语音帧。(compute-vad还可以设置计算的context,只有context中一定比例的帧大于阈值才认为当前帧是语音帧)。

  • compute-vad的输入是什么

    由上面的计算过程知道,compute-vad只会读取每一帧特征的第一个值,并认为这是某种能量。也就是说只要我们输入的特征的第一个值可以表示某种能量就可以了。

    1. 如果我们使用的是mfcc特征,compute-mfcc有一个use-energy的参数,这个参数默认为true。如果这个参数为true,那么energy(这个energy究竟是什么energy还不知道,但感觉应该是wav或者是FFT变换之后的ener)就会替换掉mfcc的C0参数,也就是mfcc的第一个参数。这样mfcc特征的第一维就是energy了,就可以用了。
    2. plp特征与mfcc特征同理
    3. 如果我们使用的是fbank特征,compute-fbank也有一个use-energy参数,这个参数默认为false。如果将这个参数设为了true,那么就会在fbank原有的维度上加一维energy特征(如果fbank计算和mfcc配置一样的话,compute-mfcc的第一维和compute-fbank的第一维将会完全一致),加在第一维,这样fbank也可以用于vad计算。

apply-cmvn-sliding

当时只是好奇,当—center=true的时候,是怎么进行padding的。官方文档说,当这个参数为true的时候,use a window centered on the current frame。然后我就想如果current frame就是开头,是不是需要在左边进行padding啊,实验之后发现根本就没有padding。什么意思呢?

如果,一个frame左边的frame没有达到窗长的一般,那么窗就会右移直至窗的最左边与第一帧对齐。最右边的帧同理。而且如果window的长度大于整个帧的个数的话,算法会赋值window_len=帧数