如何在Weka中使用MFCC进行音频分类?

时间:2017-07-20 19:52:55

标签: audio machine-learning weka feature-extraction mfcc

我正在尝试开发一种在Weka中使用MFCC对音频进行分类的方法。我生成的MFCC的缓冲区大小为1024,因此每个音频录制都有一系列MFCC系数。我想将这些系数转换为Weka的ARFF数据格式,但我不确定如何解决这个问题。

我还问了一个question about merging数据,因为我觉得这可能会影响到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}

@data
126.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

非常感谢任何帮助。

修改: 我使用ARFF files根据openSMILE网站上的方法使用Weka生成了一些this,但我不确定这些数据将如何用于对音频进行分类,因为每行数据为10来自同一文件的毫秒音频。每行的name属性为" unknown,"我假设是数据试图分类的属性。如何将整体声音(而不是10毫秒)分类并将其与其他几种整体声音进行比较?

编辑#2:成功!

在更彻底地阅读了我找到的website后,我看到了Accumulate脚本和Test and Train数据文件。 accumulate脚本将所有文件生成的每组MFCC数据从单独的音频文件一起放入一个ARFF文件中。他们的文件由大约200个属性组成,其中包含12个MFCC的统计数据。虽然我无法使用OpenSmile检索这些统计信息,但我使用Python库来执行此操作。统计数据是最大值,最小值,峰度,范围,标准差等。我在Weka中使用BayesNet和Multilayer Perceptron准确地对我的音频文件进行了分类,两者都为我提供了100%的准确度。

1 个答案:

答案 0 :(得分:1)

我对MFCC了解不多,但如果您尝试对音频文件进行分类,那么@data下的每一行都必须代表一个音频文件。如果您在@data下为每一行使用了时间窗口或只有一个MFCC,那么Weka分类器将尝试对时间窗口或MFCC进行分类,这不是您想要的。如果您不熟悉格式(只是链接,因为我看到您将音频文件的功能放在与@data相同的行),这里是example,其中每一行代表一个虹膜植物:

% 1. Title: Iris Plants Database
% 
% 2. Sources:
%      (a) Creator: R.A. Fisher
%      (b) Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
%      (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}

@DATA
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
4.6,3.4,1.4,0.3,Iris-setosa
5.0,3.4,1.5,0.2,Iris-setosa
4.4,2.9,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa

就解决你应该用于音频文件的属性的问题而言,它听起来(没有双关语)就像使用MFCC系数一样可行(假设每个音频文件具有相同数量的MFCC,因为每个数据/音频文件必须具有相同数量的属性)。我会尝试一下,看看它是怎么回事。

编辑: 如果音频文件的大小不同,您可以:

  • 剪切音频文件的时间超过最短音频短片。基本上你是在丢弃音频文件末尾的数据。
  • 使属性数量足够高以适应最长的音频文件,并将任何MFCC系数表示静音,用于短于最长音频文件的音频文件的未填充属性。
  • 如果MFCC值始终在某个范围内(例如-10到10或类似的范围),那么可以使用"bag of words"模型。您的属性将表示MFCC系数落入音频文件的特定范围内的次数。因此,第一个属性可能表示MFCC系数的数量介于-10和-9.95之间,第二个属性为-9.95到-9.90。因此,如果你有一个非常短的音频文件有两个MFCC(不太可能,仅作为示例),一个系数是10而另一个是-9.93那么你的最后一个属性的值是1,你的第二个属性将有一个值1,但所有其他属性的值都为0.该方法的缺点是不考虑MFCC系数的顺序。但是,这种方法适用于文本分类,即使单词顺序被忽略,所以谁知道,也许它适用于音频。
  • 除此之外,我会看到你在合并问题上得到任何好的答案。