使用Yaafe提取音频特征(MFCC、短时能量、短时过零率等特征)

来源:互联网 发布:初学java什么书比较好 编辑:程序博客网 时间:2024/04/29 15:12

使用Yaafe提取音频特征(MFCC、短时能量、短时过零率等特征)

前段时间装了Yaafe库,今天就使用Yaafe来提取音频特征。如果没安装Yaafe,请参考我之前的文章。

Yaafe安装教程

  • 使用Yaafe提取音频特征MFCC短时能量短时过零率等特征
    • 一音频信号预处理
      • 1设置音频信号采样率
      • 2音频信号分帧设置帧长和帧移
      • 3音频信号加窗
    • 二音乐特征介绍
      • 1Mel倒频谱系数
      • 2线性预测编码
      • 3短时能量
    • 三音频特征提取


一、音频信号预处理

(1)设置音频信号采样率

     在对音乐进行特征提取前,必须对音乐文件进行预处理,所有的歌曲必须是同一格式MP3,这样能够减小特征处理时出现的误差。此外,必须设置采样率,采样率是指录音设备在单位时间内对声音信号的采样次数。当今的主流采样率分为三个等级:22.05KHz、44.1KHz、48KHz。而在三个等级中,44.1KHz理论上是CD音质的界限,也就是MP3所具有的采样率。

(2)音频信号分帧(设置帧长和帧移)

    采样率设置完毕后需要对音乐信号进行分帧处理。音乐信号可以看做是一段连续的曲线,使用无限分割的办法,可将一小段音乐信号看做是短时平稳的,这样每一小段的音乐信号成为分析帧。为了在处理帧于帧之间的信息时,能够让帧于帧之间的信息平滑过渡,我们可以给帧设定一个步长,即帧移,帧移不超过帧的二分之一,它是帧于帧之间未重叠的部分。设置不同的帧和帧移,对于最后研究的结果会造成很大的偏移,因此选择合适的帧和帧移也是一个不可忽略的关键点。

这里写图片描述

(3)音频信号加窗

    在处理某些音乐文件时,需要进行快速的傅里叶变化,因为傅立叶变换对应的是无限信号,信号经过分帧后变成有限信号,分帧的信号再进行傅立叶变换后,高频部分将有"泄露",所以要加窗。常见的加窗处理包括汉宁窗(Hanning)、汉明窗(Hamming)、矩形窗(Square)、三角窗(Triangle)。加窗的目的是为了减少频谱能量泄露,因为在帧需要进行周期延拓处理,得到虚拟无限长的信号,才可以对信号进行快速傅里叶变换等相关处理,可是无限长的信号被截断,其频谱会发生畸形,集中的能量会被分散到两个较宽的频带去。

二、音乐特征介绍

在进行特征提取前简单介绍下音频特征。

(1)Mel倒频谱系数

    基于Mel倒谱系数(MFCC)是在Mel标度频率域中提取出来的倒频谱系数,是一种感知频域倒谱系数。MFCC以人耳的听觉系统为基础,利用Mel尺度三角滤波器组对傅里叶变换能量系数滤波器得到,并且可以对其频域进行Mel变化,因此Mel频率尺度是最符合人耳听觉系统的一种系数。

(2)线性预测编码

    线性预测编码(linear predictive coding,LPC)是一种很重要的编码方法,线性预测的基本思路是:由于语言信号样点之间有相关性,所以可以用过去的样本点来预测现在或未来的样本点,即一个语音的抽样能够用过去若干个语音抽样的线性组合来逼近,通过使实际语音信号抽样值和线性预测抽样值之间的误差在均方准则下达到最小值来求解预测系数,而这预测系数就反映了语音信号的特征,故可以用这组语音特征参数进行语音识别或语音合成等。

(3)短时能量

    短时能量是音频分析中常用的特征之一。音频信号的短时能量随时间变化相对比较明显,可以用来区分清音和浊音。短时能量还可以用来识别静音帧,我们可以给定一个阀值,使得当短时能量的值小于这个阀值时,就认为这个帧是静音帧。我们通常可以把静音帧看作是一段音乐的开始或者是结尾,还可以是音乐的过渡。

好了,其他特征不说了,再说下去我要把度娘搬上来了

三、音频特征提取

官方文档:http://yaafe.sourceforge.net/manual/pythonbindings.html

看例子:以下就是一个提取Mfcc平均值、方差的例子

#!/usr/bin/python# -*- coding:utf-8 -*-from yaafelib import FeaturePlan, Engine, AudioFileProcessordef init():    global engine    fp = FeaturePlan(sample_rate=44100, resample=True, time_start=20,time_limit=40)           # 采样率44.1Hkz,提取20 - 40s    fp.addFeature('mfcc: MFCC')        # 添加MFCC    fp.addFeature("energy: Energy")    # 能量    fp.addFeature("zcr: ZCR")          # 过零率    df = fp.getDataFlow()    engine = Engine()                  # 配置Engine    engine.load(df)    return 'Yaafe初始化'def startEngine(path):    global afp, features    afp = AudioFileProcessor()    afp.processFile(engine,path)       # 从mp3文件中提取特征,它必需提供engine配置    features = engine.readAllOutputs() # 得到所有特征矩阵    return 'Yaafe提取成功'#特征MFCC提取def getMFCC():    mfcc = features.get('mfcc')    mfccMean=mfcc.mean(axis=0)       # 平均值    mfccMean=mfccMean.reshape(-1,)    mfccVar=mfcc.var(axis=0)         # 方差    mfccVar=mfccVar.reshape(-1,)    return mfccMean, mfccVar#测试def main():    init()    startEngine('/home/chenming/Music/test.mp3')    print getMFCC()if __name__ == '__main__':    main()

结果:
这里写图片描述

FeaturePlan:

FeaturePlan 是一个按照给定的采样率提取的特征集合
addFeature(definition):
Add a feature defined according the feature definition syntax.
Parameters: definition (string) – feature definition.
Return type: True on success, False on fail.

DataFlow:

DataFlow对象持有一个描述如何计算一些音频特征的步骤的有向无环图

Engine:

Engine对象计算配置给定的特征所需的费用
load(dataflow):
Configure engine according to the given dataflow.
Parameters: dataflow (DataFlow or string) – dataflow object or filename of a dataflow file.
Returns: True on success, False on fail.

AudioFileProcessor:

AudioFileProcessor对象允许从音频文件中提取特征,并可能将输出特征写入文件,必须给它提供一个Engine
processFile(engine, filename):
Extract features from the given file using the given engine.
If an output format has been set, then output files will be written, else output feature data can be read using engine’s Engine.readOutput() or Engine.readAllOutputs() methods.
Parameters:
engine (Engine) – engine to use for feature extraction. It must already have been configured.
filename (string) – audio file to process
Returns:
0 on success, negative value on fail

短时能量和过零率就不写上去了,步骤一样features.get(‘zrc’)就好了。

0 0
原创粉丝点击