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

How to use MFCCs in Weka for audio classification?

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

我也问了一个数据,因为我觉得这可能会影响到ARFF格式的数据转换。

我知道对于 ARFF,数据需要通过属性列出。 MFCC 的每个系数应该是一个单独的属性还是作为单个属性的系数数组?每个数据应该表示单个 MFCC、window 时间,还是整个文件或声音?下面,我写了我认为如果只考虑一个 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 using Weka using openSMILE following a method from this 网站,但我不确定如何使用这些数据对音频进行分类,因为每一行数据都是来自同一文件的 10 毫秒音频。每行的名称属性是 "unknown,",我假设这是数据将尝试分类的属性。我如何才能对整体声音(而不是 10 毫秒)进行分类并将其与其他几种整体声音进行比较?


编辑#2:成功!

在更彻底地阅读了我找到的 website 之后,我看到了 Accumulate 脚本以及测试和训练数据文件。 accumulate 脚本将从单独的音频文件中生成的每组 MFCC 数据的所有文件一起放入一个 ARFF 文件中。他们的文件由大约 200 个属性和 12 个 MFCC 的统计信息组成。虽然我无法使用 OpenSmile 检索这些统计数据,但我使用了 Python 库来做到这一点。统计数据是最大值、最小值、峰度、范围、标准差等。我使用 Weka 中的 BayesNet 和多层感知器对我的音频文件进行了准确分类,它们都为我带来了 100% 的准确率。

我不太了解 MFCC,但是如果您要对音频文件进行分类,那么 @data 下的每一行都必须代表一个音频文件。如果您使用 windows 的时间或在 @data 下的每一行仅使用一个 MFCC,那么 Weka 分类器将尝试对 windows 的时间或 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,因为每个片段data/audio 文件必须具有相同数量的属性)。我会尝试一下,看看效果如何。

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

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