opensmile 2.3批量提取MFCC并以.csv存放(linux)

问题

想用opensmile批量提取MFCC并以.csv格式存放,但是默认文件(如:MFCC12_0_D_A.conf)提取得到的是.htk,不方便查看,同时直接使用截取的音频提取MFCC发生错误,用matplot处理后读取成功,另外编写shell脚本实现批量提取。

1.安装参考: ubuntu18.04安装openSMILE教程以及出错解决办法
2.使用默认特征集(MFCC12_0_D_A.conf)提取MFCC命令
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的不是很多,网上资料也比较少,大多是官方说明文档的翻译,但是尝试了几次之后感觉还是挺方便的,能提取特征也很多,各位如果有其他好的学习资料,恳请分享,感谢!

以下部分是博主学习时为理解做的记录,不用理睬

从demo的简单例子自己生成配置文件,学习如何编写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

接下来,您必须配置组件连接。这可以通过分配dataReaderdataWriter组件并设置名为数据存储器“levels”实现,它们总是包含在每个源,汇或处理组件中,可修改reader.dmLevelwriter.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 sourcecsv 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 第一次特征提取

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值