opensmile 工具的使用和批处理

前言

openSMILE是一款以命令行形式运行的工具,通过配置config文件来提取音频特征。主要应用于语音识别、情感计算、音乐信息获取。2.0版本之后的openSMILE包括了openCV库,可以用于视频处理和视频特征提取。
官网下载有linux和windows版本提供下载,windows可以不编译直接用,建议在命令行里指明 openSMILE 绝对路径。

openSMILE的输入输出格式

文件输入格式

  • RIFF-WAVE (PCM) (for MP3, MP4, OGG, etc. a converter needs to be used)
  • Comma Separated Value (CSV)
  • HTK parameter files
  • WEKA’s ARFF format.(由htk工具产生)
  • Video streams via openCV.(opencv产生的视频流数据)

文件输出格式

  • RIFF-WAVE (PCM uncompressed audio)
  • Comma Separated Value (CSV)
  • HTK parameter file
  • WEKA ARFF file
  • LibSVM feature file format
  • Binary float matrix format

分类器和其他组件
openSMILE还提供了许多VAD算法,用于判断各时间点有没有说话。

  • Voice Activity Detection based on Fuzzy Logic
  • Voice Activity Detection based on LSTM-RNN with pre-trained models
  • Turn-/Speech-segment detector
  • LibSVM (on-line)
  • LSTM-RNN (Neural Network) classifier which can load RNNLIB and CURRENNT nets
  • GMM (experimental implementation from eNTERFACE’12 project, to be release soon)
  • SVM sink (for loading linear kernel WEKA SMO models)
  • Speech Emotion recognition pre-trained models (openEAR)

openSMILE使用流程简介

  1. 先切换到处理文件SMILExtract.exe所在的目录
  2. 通过如下语句提取:
    windows下:SMILExtract_Release -C “配置文件” -I “要处理的音频” -O “要保存特征向量的路径及文件名”
    linux下:SMILExtract -C “配置文件” -I “要处理的音频” -O “要保存特征向量的路径及文件名”

官方配置文件

官方提供了许多常见特征集的配置文件,如MFCC,PLP,以及各大语音比赛中效果好的特征集。
官方配置文件

MFCC特征

为了提取MFCC特征(兼容HTK),提供了以下四个文件(它们是以它们所代表的相应的HTK参数类型命名的):
MFCC12_0_D_A.conf此配置从25毫秒的音频帧中提取梅尔频率倒谱系数(以10毫秒的速率采样)(汉明窗口)。 它由26个Mel频带计算13个MFCC(0-12)组,并应用了一个权重参数为22的倒谱提升滤波器。13个一阶和13个二阶系数被附加到MFCC后。
MFCC12_E_D_A.conf此配置跟MFCC12_0_D_A.conf一样,但对数能量是只加在MFCC1-12上。
MFCC12_0_D_A_Z.conf这个配置跟MFCC12_0_D_A.conf配置一样,除了所有特征是参考整个输入序列进行了标准化。
MFCC12_E_D_A_Z.conf这个配置跟MFCC12_E_D_A.conf配置一样,除了所有特征是参考整个输入序列进行了标准化。
帧长为25ms,帧移为10ms,使用的汉明窗,预增强参数为0.97。由26个通过FFT功率谱计算的mel-滤波器组计算MFCC 0/1-12。MEL频谱的频率范围为0-8kHz,同时这些配置文件提供了-I,-O选项。输出文件格式是HTK参数文件格式。如果需要输出其他文件格式,你必须在配置文件中更改‘cHtkSink’组件类型为你想要的类型。命令行示例如下:

SMILExtract -C config/MFCC12_E_D_A.conf -I input.wav -O output.mfcc.htk

PLP特征

用于提取PLP倒谱系数(PLP-CC)(与HTK兼容)以下四个文件(它们是以它们所代表的相应的HTK参数类型命名的):
PLP_0_D_A.conf该配置从25 ms长音频(以10ms的速率采样)帧提取Mel频率倒谱系数(汉明窗口)。它从26个Mel频带,并使用预测阶数为5计算6个PLP(0-5),并应用了一个权重参数为22的倒谱提升滤波器。6个一阶和6个二阶系数被附加到PLP-CC后。
PLP_E_D_A.conf该配置与PLP_0_D_A.conf相同,但对数能量是只加在PLP1-12上。
PLP_0_D_A_Z.conf此配置与PLP_0_D_A.conf相同,除了所有特征是参考整个输入序列进行了标准化。
PLP_E_D_Z.conf此配置与PLP_E_D_A.conf相同,除了所有特征是参考整个输入序列进行了标准化。
帧长为25ms,帧移为10ms,使用的汉明窗,预增强参数为0.97。由26个通过FFT功率谱计算的听觉mel-滤波器组(压缩系数为0.33)计算PLP 0/1-5。线性预测器的预测阶数为5。MEL频谱的频率范围为0-8kHz,同时这些配置文件提供了-I,-O选项。输出文件格式是HTK参数文件格式。如果需要输出其他文件格式,你必须在配置文件中更改‘cHtkSink’组件类型为你想要的类型。命令行示例如下:

SMILExtract -C config/PLP_E_D_A.conf -I input.wav -O output.plp.htk

情感特征集

自openSMILE在openEAR的项目EWS09情感识别中被使用,openSMILE提供了各种情感识别的标准特征集。
The INTERSPEECH 2009 Emotion Challenge feature set(参见[SSB09])由配置文件config/emo IS09.conf提供。它包含对LLDs应用统计函数得到的384个特征。该特征被保存在Arff格式(针对WEKA),新的实例会被附加到一个已存在文件(这是用于批处理,其中openSMILE被反复调用从多个文件提取特征到单个特征文件)。 出现在Arff文件中16个低级描述符(LLDs)的名称,见下面的列表:

pcm_RMSenergy  信号帧均方根能量
mfcc  梅尔频率倒谱系数1-12
Pcm_zcr  时间信号的过零率(基于帧)
voiceProb  从ACF计算的发声概率。
F0  从倒谱计算的基频

附加到低级描述符名称的后缀_sma表示它们是通过窗口长度为3的移动平均滤波器进行平滑。附加到sma的后缀_de表示当前特征是低级描述符平滑后的一阶delta系数(微分)。

max  轮廓的最大值
min  轮廓的最小值
range  = max- min
maxPos  最大值的绝对位置(以帧为单位)
minPos  最小值的绝对位置(以帧为单位)
amean  轮廓的算术平均值
linregc1  轮廓线性逼近的斜率(m)
linregc2  轮廓线性逼近的偏移量(t)
linregerrQ  计算的二次误差作为线性近似值和实际轮廓的差值
stddev  轮廓上的值的标准偏差
skewness  偏度(3阶矩)
kurtosis  峰度(4阶矩)

The INTERSPEECH 2010 Paralinguistic Challenge feature set(见2010年INTERSPEECH会议论文集)由配置文件config/IS10_paraling.conf提供。该集包含的1582个特征是由34个低级描述符(LLDs)和34个相应的delta作为68个LLDs轮廓值,在此基础上应用21个函数得到1428个特征,另外,对4个基于音高的LLD及其4个delta系数应用了19个函数得到152个特征,最后附加音高(伪音节)的数量和总数输入的持续时间(2个特征)。
该特征被保存在Arff格式(针对WEKA),新的实例会被附加到一个已存在文件(这是用于批处理,其中openSMILE被反复调用从多个文件提取特征到单个特征文件)。 出现在Arff文件中34个低级描述符(LLDs)的名称,见下面的列表:

pcm_loudness  归一化强度提高到0.3的幂的响度
mfcc  美尔频率倒谱系数0-14
logMelFreqBand  梅尔频带的对数功率0-7(分布范围内从0到8 kHz)
lspFreq  从8个LPC系数计算出的8个线谱对频率。
F0finEnv  平滑的基频轮廓线。
voicingFinalUnclipped  最终基频候选的发声概率。Unclipped的意思是,当其低于浊音阈值时,它不被设置为零。

附加到低级描述符名称的后缀_sma表示它们是通过窗口长度为3的移动平均滤波器进行平滑。附加到sma的后缀_de表示当前特征是低级描述符平滑后的一阶delta系数(微分)。出现在Arff文件中的21个函数的名字,均在以下列表中:

maxPos  最大值的绝对位置(以帧为单位)
minPos  最小值的绝对位置(以帧为单位)
amean  轮廓的算术平均值
linregc1  轮廓线性逼近的斜率(m)
linregc2  轮廓线性逼近的偏移量(t)
linregerrA  把线性误差计算作为线性近似值和实际的轮廓的误差
linregerrQ  把二次误差计算作为线性近似值和实际的轮廓的误差
stddev  轮廓中的值的标准偏差
skewness  偏度(3阶矩)。
kurtosis 峰度(4阶矩)。
quartile1  第一四分位数(25%百分位数)
quartile2  第一四分位数(50%百分位数)
quartile3  第一四分位数(75%百分位数)
iqr1-2  四分位数间距:quartile2- quartile1
iqr2-3  四分位数间距:quartile3- quartile2
iqr1-3  四分位数间距:quartile3- quartile1
percentile1.0  轮廓的离群值鲁棒最小值,按1%百分位数表示。
percentile99.0  轮廓的离群值鲁棒最大值,按99%百分位数表示。
pctlrange0-1  由1%和99%的百分点的范围表示的离群值鲁棒信号范围“max-min”。
upleveltime75  信号超过(75%*范围+min)的时间百分比。
upleveltime90  信号超过(90%*范围+min)的时间百分比。

四个音高相关的LLD(及相应的delta系数)如下(清音区域均为0,因此功能仅适用于这些轮廓的浊音区域):

F0final  平滑的基频频率
jitterLocal  本地(帧到帧)抖动(音调周期长度偏差)
jitterDDP  差分帧间抖动(‘Jitter of the Jitter’)
shimmerLocal  本地(帧到帧)闪烁(音调周期幅度偏差)

对这4 + 4个LLD应用了19个函数,即上述21个函数的集合没有最小值(1%百分位数)和范围。

The INTERSPEECH 2011 Speaker State Challenge feature set(见2011年INTERSPEECH会议论文集)由配置文件config/IS11_speake_state.conf提供。该集包含的4368个特征是由4个能量相关+50个频谱相关的低级描述符(LLDs)和54个相应的delta作为108个LLDs,在此基础上应用33个基本函数+平均值、最小值、最大值、标准差得到3996个特征;5个声音相关和5个对应的delta作为10个LLDs,在此基础上应用33个基本函数+二次平均、上升时长、下降时长得到360个特征;6个F0基本函数和对应的delta,12个特征。
inter2011
inter2011_func

The INTERSPEECH 2012 Speaker Trait Challenge feature set(见2012年INTERSPEECH会议论文集)由配置文件config/IS12_speake_trait.conf提供。该集包含的6125个特征。
inter2012

The INTERSPEECH 2013 ComParE Challenge feature set (见2013年INTERSPEECH会议论文集)由配置文件config/IS13_ComParE.conf提供。该集包含的6373个特征,LLD包括能量,频谱,倒谱(MFCC)、声音、对数谐波噪声比(HNR),频谱谐度和心理声学频谱清晰度。

The MediaEval 2012 TUM feature set for violent video scenes detection 针对好莱坞流行电影的暴力进行检测的特征集在config/mediaeval2012_tum_affect/,里面有不同的设置,参考文章:Florian Eyben, Felix Weninger, Nicolas Lehment, Gerhard Rigoll, Björn Schuller: ”Violent Scenes Detection with Large, Brute-forced Acoustic and Visual Feature Sets”, Proc. MediaEval 2012 Workshop, Pisa, Italy, 04.-05.10.2012.

MediaEval Audio IS12based subwin2.conf包含的是从2s的子窗中提取音频特征的配置。MediaEval Audio IS12based subwin2 step0.5.conf提取一样的特征,但是2s子窗的偏移为0.5s。MediaEval VideoFunctionals.conf用于视频特征提取,如文章使用方法,需要一个包含LLDs的CSV文件(由openCV提取)作为输入和输出,ARFF文件作为视频特征。

The openSMILE/openEAR ‘emobase’ set早期的基线集(参照”emobase2”集作为新的基线集),拥有情感识别的998个声学特征,包含以下低级描述符(LLDs):强度,响度,12 MFCC,音高(F0),浊音概率,F0包络线,8 LSF(线频谱频率),过零率, 以及这些LLD的Delta回归系数。以下函数被应用于上述LLDs及其Delta系数。:Max./Min。输入的相对位置和范围,范围,算术平均值,2线性回归系数,线性和二次误差,标准差,偏度,峰度,四分位数1-3和三位四分位数范围。

The large openSMILE emotion feature set用于提取更多的LLDs和更多的函数(6552个特征),配置文件为config/emo_large.conf。

The openSMILE ‘emobase2010’ reference set 是基于the INTERSPEECH 2010 Paralinguistic Challenge feature set,配置文件为config/emobase2010.conf。
对持续时间和位置特征的规范化进行了一些调整。这个特性集包含了一套大大增强的低级描述符(LLDs),以及一套“emobase”相比更加精细化选择的函数列表。建议使用此特征集作为比较新的情感识别特征集和方法的参考,因为它代表当前最先进的情感和语言识别功能。
该集合包含1582个特征(与INTERSPEECH 2010 Paralinguistic 挑战集相同设置),其由34个低级描述符(LLDs)和34个相应的delta作为68个LLDs轮廓值,在此基础上应用21个函数得到1 428个特征,另外,对4个基于音高的LLD及其4个delta系数应用了19个函数得到152个特征,最后附加音高(伪音节)的数量和总数输入的持续时间(2个特征)。唯一的区别是INTERSPEECH 2010 paralinguistic挑战集标准化的是是“maxPos”和“minPos”特征,本配置被标准化为段长度。

python批处理提取openSMILE特征

所有支持标准数据输出格式的配置文件都可以在WINDOWS的批特征提取GUI(使用VS10 C#编写,位于progsrc/openSMILEbatchGUI/)。这个工具允许openSMILE自动的执行文件夹中的若干文件。它可以在图形界面中选择音频文件和指定输出类型。
openSMILE本身提供批处理GUI(使用VS10 C#编写,位于progsrc/openSMILEbatchGUI/),但若语音数据的目录结构较复杂,还可以利用python来进行批处理。示例代码如以下:

import os
from subprocess import call

def excute_CMD(path_ExcuteFile, path_Config, path_Audio, path_Output):
    cmd = path_ExcuteFile + " -C " + path_Config + " -I " + path_Audio + " -O " + path_Output
    call(cmd, shell=True)


def batch_extract_features(path_Config, path_Input_Root, path_Output):
    path_ExcuteFile = "SMILExtract_Release"

    filename = os.listdir(path_Input_Root)
    for i in range(len(filename)):
        print('Extracting features of %s' % filename[i])
        path_Input = path_Input_Root + '/' + filename[i] + '.wav'

        excute_CMD(path_ExcuteFile, path_Config, path_Input, path_Output)


path_Config = "./config/IS13_ComParE.conf"
path_Input_Root = 'root_path_to_audio/'
path_Output = 'features.csv'
batch_extract_features(path_Config, path_Input_Root, path_Output)

输出数据格式控制

对于不包含统计函数的配置文件,选项定义在config/shared/standard_data_output_lldonly.conf.inc

==============================LLD only=============================
================================CSV================================
-csvoutput <filename> 默认输出选项. CSV格式,存放帧向LLD
-appendcsv <0/1> 设为1代表添加到已有CSV文件文末,默认0
-timestampcsv <0/1> 设为0禁止把时间步输出到CSV第二列,默认为1
-headercsv <0/1> 设为0禁止把标题输入到CSV,默认为1
================================HTK================================
-output <filename> 输出特征汇总(函数)到HTK格式文件
================================ARFF===============================
-arffoutput <filename> 默认输出选项. ARFF格式,存放帧向LLD
-appendarff <0/1> 设为0代表不添加到已有ARFF文件文末,默认1添加
-timestamparff <0/1> 设为0禁止把时间步输出到ARFF第二列,默认为1
arfftargetsfile <file>指定配置包含定义目标域(类)的文,默认为:shared/arff_targets_conf.inc

对于包含统计函数的配置文件,如全部的INTERSPEECH和AVEC挑战集,选项定义在config/shared/standard_data_output.conf.inc

=============================LLD and func =========================
-instname <string> 通常是输入文件的名称保存在CSV和ARFF输出的首列。默认是"unknow"
================================ARFF===============================
-lldarffoutput, -D <filename> 启动LLD帧向输出到ARFF格式文件
-appendarfflld <0/1> 设为1代表添加到已有ARFF文件文末,默认0覆盖
-timestamparfflld <0/1> 设为0禁止把时间步输出到ARFF第二列,默认为1
-lldarfftargetsfile <file> 指定配置包含定义目标域(类)的文,默认为: shared/arff_targets_conf.inc
================================CSV================================
-lldcsvoutput, -D <filename>  启动LLD帧向输出到CSV格式文件
-appendcsvlld <0/1> 设为1代表添加到已有CSV文件文末,默认0覆盖
-timestampcsvlld  <0/1> 设为0禁止把时间步输出到CSV第二列,默认为1
-headercsvlld <0/1> 设为0禁止把标题输入到CSV,默认为1
================================HTK================================
-lldhtkoutput <filename> 启动LLD帧向输出到HTK格式文件
================================ARFF===============================
-output, -O <filename> 默认输出选项. ARFF格式,存放特征汇总
-appendarff <0/1> 设为0代表不添加到已有ARFF文件文末,默认1添加 
-timestamparff <0/1> 设为1把时间步输出到ARFF第二列,默认为0
-arfftargetsfile <file>指定配置包含定义目标域(类)的文,默认为: shared/arff_targets_conf.inc
================================CSV================================
-csvoutput <filename> 默认输出选项. CSV格式,存放特征汇总
-appendcsv <0/1> 设为0代表不添加到已有CSV文件文末,默认1
-timestampcsv <0/1> 设为0禁止把时间步输出到CSV第二列,默认为1
-headercsv <0/1> 设为0禁止把标题输入到CSV,默认为1
================================HTK================================
-htkoutput <filename> 输出特征汇总(函数)到HTK格式文件

如下为lldcsvoutput的定义。注:从2.2版本起,可以指定一个“?”替代文件名。它会禁止相应的输出组件,即它不会产生输出文件,在标准输出接口界面,看到的所有的文件名默认都是”?”

[lldsink:cCsvSink]
reader.dmLevel = lld;lld_de
filename=\cm[lldcsvoutput(D){?}:output csv file for LLD, disabled by default ?, only written if filename given]
instanceName=\cm[instname(N){unknown}:instance name]
append = \cm[appendcsvlld{0}:set to 1 to append to the LLD output csv file, default is not to append]
timestamp = \cm[timestampcsvlld{1}:set to 0 to suppress timestamp column, default is 1, i.e. to show timestamp in second column]
number = 0
printHeader = \cm[headercsvlld{1}:set to 0 to suppress header line with feature names, default is 1, i.e. to show header line]
errorOnNoOutput = 1

那么,当需要同时输出lld和func时,可用如下命令

SMILExtract -C config/IS13_ComParE.conf -I input.wav -lldcsvoutput lld_output.csv -csvoutput func_output.csv

最后一点话

其实如果只是用官方配置提特征那么只看批处理那里也够了。官方配置文件可以根据需求时再看需要哪个文件,也可自己按着这个格式自定义编写配置文件。另外输出格式控制感觉最好也是先看一下,我一开始都是直接用 -O 输出统计特征,但想输出lld时跑去源代码里一阵捣鼓,后来才发现它已经封装好了直接一个参数就可以了。

彩蛋