Alink教程(Java版)

第27.2节 提取MFCC特征

MFCC是Mel频率倒谱系数(Mel Frequency Cepstrum Coefficient)的缩写。Mel频率是基于人耳听觉特性提出来的,它与Hz频率成非线性对应关系。倒谱(Cepstrum)的含义是:对时域信号做傅里叶变换,然后取log,再进行反傅里叶变换。

Mel频率(Mel Frequency)刻度是一种基于人耳对等距的音高(pitch)变化的感官判断而定的非线性频率刻度。和频率的赫兹的关系如下:


如果Mel频率刻度为均匀分度的话,对应的赫兹之间的距离将会越来越大,Mel频率刻度的滤波器组的尺度变化如下:

Mel频率刻度的滤波器组在低频部分的分辨率高,跟人耳的听觉特性是相符的,这也是Mel频率刻度的物理意义所在。这一步的含义是:首先对时域信号进行傅里叶变换转换到频域,然后再利用Mel频率刻度的滤波器组对应频域信号进行切分,最后每个频率段对应一个数值。

计算MFCC特征是对音频数据不同声道分别进行的,每个声道的数据会按时间分为一系列滑动窗口,每个窗口可以计算出一个MFCC向量(维度为num_mfcc,可以通过组件的setNumMfcc方法进行设置)。音频数据为张量(Tensor)格式,shape为:(len_audio, num_channel);相应的MFCC特征也为张量(Tensor)格式,shape为:(num_window, num_mfcc, num_channel)。


从上节计算的音频数据集中采样出一条数据,对其audio_data列的音频张量数据进行MFCC特征提取,结果保存到mfcc列,具体代码如下:

        new AkSourceBatchOp()
            .setFilePath(DATA_DIR + TEST_FILE)
            .sampleWithSize(1)
            .link(
                new ExtractMfccFeatureBatchOp()
                    .setSelectedCol("audio_data")
                    .setSampleRate(AUDIO_SAMPLE_RATE)
                    .setOutputCol("mfcc")
            )
            .print();

查看输出结果。audio_data为张量,每个分量为FLOAT类型, shape为(48000,1),打印输出的开头如下:

FLOAT#48000,1#-0.0023498535 -0.003753662 -0.0034179688 -0.0037231445 ...... 

mfcc为张量,每个分量为FLOAT类型, shape为(90,128,1),其中,90为窗口个数,128为每个窗口计算出的MFCC系数个数,1为音频数据的channel数。mfcc打印输出的开头如下:

FLOAT#90,128,1#-118.16171 20.761873 14.966998 -51.510258 23.400412 ......