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

Posted

技术标签:

【中文标题】如何在 Weka 中使用 MFCC 进行音频分类?【英文标题】:How to use MFCCs in Weka for audio classification? 【发布时间】:2017-12-26 16:50:58 【问题描述】:

我正在尝试开发一种在 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

任何帮助将不胜感激。

编辑: 我按照this网站上的方法使用Weka使用openSMILE生成了一些ARFF files,但我不确定如何使用这些数据对音频进行分类,因为每行数据都是来自同一行的10毫秒音频文件。每行的名称属性是“未知的”,我假设这是数据将尝试分类的属性。我如何能够对整体声音(而不是 10 毫秒)进行分类并将其与其他几个整体声音进行比较?


编辑 #2:成功!

在更彻底地阅读了我找到的website 之后,我看到了 Accumulate 脚本和 Test and Train 数据文件。累积脚本将从单独的音频文件生成每组 MFCC 数据的所有文件放在一个 ARFF 文件中。他们的文件由大约 200 个属性和 12 个 MFCC 的统计信息组成。尽管我无法使用 OpenSmile 检索这些统计信息,但我使用了 Python 库来检索这些统计信息。统计数据是最大值、最小值、峰度、范围、标准差等。我在 Weka 中使用 BayesNet 和 Multilayer Perceptron 准确地分类了我的音频文件,这两种方法都为我提供了 100% 的准确率。

【问题讨论】:

【参考方案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 系数落在音频文件特定范围内的次数。所以第一个属性可能代表介于 -10 和 -9.95 之间的 MFCC 系数的数量,第二个属性可能表示 -9.95 到 -9.90。因此,如果您有一个非常短的音频文件,其中包含两个 MFCC(不太可能,仅用于示例目的)并且一个系数是 10,另一个是 -9.93,那么您的最后一个属性的值为 1,您的第二个属性将有一个值为 1,但所有其他属性的值为 0。此方法的缺点是未考虑 MFCC 系数的顺序。但是,即使忽略了词序,这种方法也适用于文本分类,所以谁知道呢,也许它适用于音频。 除此之外,我会看看您是否能在合并问题上得到任何好的答案。

【讨论】:

感谢您的帖子。我编辑了数据的格式。不幸的是,每个音频文件之间的 MFCC 数量确实不同,我不确定它如何包含我想要分类的整个文件或声音。每个 MFCC 有 13 个不同频率的系数,基于我认为是 23.27 毫秒的帧。我不明白这与其他音频相比如何。 我对我的回答做了一些修改。抱歉,我不能提供更多帮助。 感谢您的编辑,我尝试进行一些更改,看看是否可行。

以上是关于如何在 Weka 中使用 MFCC 进行音频分类?的主要内容,如果未能解决你的问题,请参考以下文章

音频特征:mfcc提取

Python 音频信号分类 MFCC 特征神经网络

如何合并 MFCC

如何在weka中预处理数据以进行分类

使用 MFCC 进行特征提取

使用 Weka 进行文本分类