我正在尝试开发一种使用Weka中的MFCC对音频进行分类的方法。我的MFCC是用1024的缓冲区大小生成的,因此每个音频录制都有一系列的MFCC系数。我想将这些系数转换成Weka的ARFF数据格式,但我不知道该如何着手解决这个问题。
我还询问了一个关于合并数据的问题,因为我觉得这可能会影响数据转换为ARFF格式。
我知道ARFF格式的数据需要通过属性列出。每个MFCC的系数应该是一个单独的属性还是作为一个单一属性的系数数组?每个数据应该代表一个MFCC、一个时间窗口,还是整个文件或声音?下面,我写出了如果只考虑一个MFCC应该是什么样子的,我认为这样不能对整个声音进行分类。
@relation audio@attribute mfcc1 real@attribute mfcc2 real@attribute mfcc3 real@attribute mfcc4 real@attribute mfcc5 real@attribute mfcc6 real@attribute mfcc7 real@attribute mfcc8 real@attribute mfcc9 real@attribute mfcc10 real@attribute mfcc11 real@attribute mfcc12 real@attribute mfcc13 real@attribute class {bark, honk, talking, wind}@data126.347275, -9.709645, 4.2038302, -11.606304, -2.4174862, -3.703139, 12.748064, -5.297932, -1.3114156, 2.1852574, -2.1628475, -3.622149, 5.851326, bark
任何帮助都将不胜感激。
编辑:我已经使用Weka生成了几个ARFF文件,使用的是openSMILE,遵循这个网站的方法,但我不知道这些数据如何用于分类音频,因为每行数据代表的是同一文件中10毫秒的音频。每一行的名称属性都是“unknown”,我认为这是数据尝试分类的属性。我如何能够对整体声音(而不是10毫秒)进行分类,并将其与其他几个整体声音进行比较?
编辑#2:成功!
在更仔细地阅读了我找到的网站后,我看到了累积脚本以及测试和训练数据文件。累积脚本将所有文件中生成的每一组MFCC数据从不同的音频文件中组合成一个ARFF文件。他们的文件由大约200个属性组成,包括12个MFCC的统计数据。虽然我无法使用OpenSmile获取这些统计数据,但我使用Python库完成了这个任务。这些统计数据包括最大值、最小值、峰度、范围、标准差等。我使用Weka中的BayesNet和多层感知器准确地对我的音频文件进行了分类,这两种方法都为我提供了100%的准确率。
回答:
我对MFCC了解不多,但如果你试图对音频文件进行分类,那么@data
下的每一行必须代表一个音频文件。如果你使用时间窗口或只为@data
下的每一行使用一个MFCC,那么Weka分类器将尝试对时间窗口或MFCC进行分类,这不是你想要的。万一你对格式不熟悉(只是因为我看到你将音频文件的特征放在@data
的同一行上,所以提供链接),这里有一个例子,其中每一行代表一个Iris植物:
% 1. Title: Iris Plants Database% % 2. Sources:% (a) Creator: R.A. Fisher% (b) Donor: Michael Marshall (MARSHALL%[email protected])% (c) Date: July, 1988% @RELATION iris@ATTRIBUTE sepallength NUMERIC@ATTRIBUTE sepalwidth NUMERIC@ATTRIBUTE petallength NUMERIC@ATTRIBUTE petalwidth NUMERIC@ATTRIBUTE class {Iris-setosa,Iris-versicolor,Iris-virginica}@DATA5.1,3.5,1.4,0.2,Iris-setosa4.9,3.0,1.4,0.2,Iris-setosa4.7,3.2,1.3,0.2,Iris-setosa4.6,3.1,1.5,0.2,Iris-setosa5.0,3.6,1.4,0.2,Iris-setosa5.4,3.9,1.7,0.4,Iris-setosa4.6,3.4,1.4,0.3,Iris-setosa5.0,3.4,1.5,0.2,Iris-setosa4.4,2.9,1.4,0.2,Iris-setosa4.9,3.1,1.5,0.1,Iris-setosa
关于你提出的应该为你的音频文件使用哪些属性的问题,听起来(无意双关)使用MFCC系数可能是可行的(假设每个音频文件的MFCC数量相同,因为每条数据/音频文件必须具有相同数量的属性)。我建议你尝试一下,看看效果如何。
编辑:如果音频文件的大小不相同,你可以:
- 将比最短音频长的音频文件剪短。基本上,你会丢弃音频文件末尾的数据。
- 将属性的数量设置得足够高以适应最长的音频文件,并为较短的音频文件未填充的属性填充代表静音的MFCC系数。
- 如果MFCC值始终在某个范围内(例如-10到10或类似范围),那么也许可以使用“词袋”模型。你的属性将代表一个音频文件中MFCC系数落在某个范围内的次数。因此,第一个属性可能代表MFCC系数落在-10到-9.95之间的次数,第二个属性代表-9.95到-9.90之间的次数。所以,如果你有一个非常短的音频文件,包含两个MFCC(不太可能,只是为了举例),其中一个系数是10,另一个是-9.93,那么你的最后一个属性将有一个值1,你的第二个属性将有一个值1,但所有其他属性将值为0。这种方法的缺点是MFCC系数的顺序没有被考虑。然而,这种方法在文本分类中即使忽略了词序也表现良好,所以谁知道,也许它对音频也适用。
- 除此之外,我会看看你关于合并问题的回答是否有好的建议。