想用opensmile批量提取MFCC并以.csv格式存放,但是默认文件(如:MFCC12_0_D_A.conf)提取得到的是.htk,不方便查看,同时直接使用截取的音频提取MFCC发生错误,用matplot处理后读取成功,另外编写shell脚本实现批量提取。
SMILExtract -C config/MFCC12_E_D_A.conf -I input.wav -O output.mfcc.htk
参考:《openSMILE用户手册》第2章 (3) 默认特征集的使用
此时得到的是.htk文件,修改为.csv
SMILExtract -C config/MFCC12_0_D_A.conf -I input.wav -csvoutput output.mfcc.csv
在官方文档中提到:
输出文件格式是HTK参数文件格式。如果需要输出其他文件格式,你必须在配置文件中更改‘cHtkSink’
组件类型为你想要的类型。但查了很多资料后发现其实只用修改-o 为 -csvoutput
就可以了。(刚开始的时候直接将-o 后面的output.mfcc.htk
改为output.mfcc.csv
,但是没有成功,或许有的环境可以《Mel Frequency Cepstral Coefficient (MFCC)提取》) 。
修改为 -csvoutput
来源于这篇 《opensmile 工具的使用和批处理》的最后部分。
Maybe this is not a WAVE file?
具体的原因忘了,求大佬解答,可以用matlab的audioread,audiowrite函数处理一下
filedir = 'infiledir/*.wav';%输入文件
file = dir(filedir);
outfile_dir = 'outfiledir/';%输出文件路径
infile_dir = 'infiledir/';%输入文件路径
for i = 1:length(file)
infile = [infile_dir,file(i).name];
[y,fs]=audioread(infile);
outfile = [outfile_dir,file(i).name];
audiowrite(outfile,y,fs);
end
处理之后再次提取成功
第一列应该是序号,不知道为什么是unknown,不过影响不大。
最后,附上批量提取MFCC的shell脚本
#!/bin/bash
dir=/home/xxx/文档/opensmile-2.3.0/myconfig/input
OPATH=/home/xxx/文档/opensmile-2.3.0/myconfig/output
for wav in $(ls $dir); do
SMILExtract -C ../config/MFCC12_0_D_A.conf -I $dir/$wav -csvoutput $OPATH/$wav.mfcc.csv
echo "$wav is extracted"
done
echo "work finished!"
参考:《使用openSMILE提取MFCC简易教程(Mac)》
感觉用opensmile的不是很多,网上资料也比较少,大多是官方说明文档的翻译,但是尝试了几次之后感觉还是挺方便的,能提取特征也很多,各位如果有其他好的学习资料,恳请分享,感谢!
以下部分是博主学习时为理解做的记录,不用理睬
openSMILE可以生成简单场景的配置文件模板。我们将使用这个函数来生成我们的第一个配置文件,这将能够读取wave文件,计算帧能量,并保存输出到一个CSV文件。
首先,创建一个目录myconfig,它将保存你的配置文件。现在键入以下内容(不包括换行符)以生成第一个配置文件:
SMILExtract -cfgFileTemplate -configDflt cWaveSource,cFramer,cEnergy,cCsvSink -l 1
-cfgFileTemplate
选项指示openSMILE生成配置文件模板,
-configDflt
选项用于指定逗号分隔的组件列表,列表是生成的配置的一部分。
-l 1
选项将日志级别设置为1,抑制任何消息,不会出现在配置文件中(你仍然会得到错误日志级别的消息,例如消息通知您已经指定的组件不存在等)。模板文本被打印到标准错误输出端,因此我们使用2>
将其转储到文件myconfig/demo1.conf
。如果您想添加描述个别选项的注释在生成的配置文件中,将选项-cfgFileDescriptions
添加到上面命令行。
SMILExtract -cfgFileTemplate -configDflt cWaveSource,cFramer,cEnergy,cCsvSink -l 1 2> myconfig/demo1.conf
接下来,您必须配置组件连接。这可以通过分配dataReader
和dataWriter
组件并设置名为数据存储器“levels”实现,它们总是包含在每个源,汇或处理组件中,可修改reader.dmLevel
和writer.dmLevel
行。您可以在这里为writer level
选择任意名称,因为dataWriters
会在数据存储区注册并创建您为writer.dmLevel
的level。然后通过赋值reader.dmLevel
的读取level来连接组件。
因此,下列规则适用:对于一个level,只有一个writer可以存在,即只有一个组件可以写入一个level;然而,读取的组件数量没有限制,一个组件可以从多个level读取,如果您指定多个level名称用“;”隔开,比如reader.dmLevel = energy;loudness
从energy和loudness level中读取数据。数据将以列的形式串联。
现在我们就可以用SMILExtract 来使用我们的配置文件
SMILExtract -C demo1.conf
这将打开当前目录下文件”input.wav”(确保已经把可用文件放在当前目录下并重命名),进行特征抽取,然后保存结果到”myenergy.csv”
。结果应该和例子配置文件中的一样。
如果你想在命令行中再提供输入和输出文件名,你必须在配置文件中添加用户定义的command-line option
。为此,需要改变wave source
和csv sink
中的filename
行:
[waveSource:cWaveSource]
...
filename = \cm[inputfile(I):file name of the input wave file]
...
[csvSink:cCsvSink]
...
filename = \cm[outputfile(O):file name of the output CSV file]
...
SMILExtract -C myconfig/demo1.conf -I wav\_samples/speech01.wav -O
speech01.energy.csv
参考: 《openSMILE用户手册》第2章 (2) openSMILE 第一次特征提取