主要内容

基于小波时间散射的音乐类型分类

此示例显示如何使用小波时间散射和音频数据存储来对音乐摘录的类型进行分类。在小波散射中,数据通过一系列小波变换,非线性和平均传播,以产生数据的低方差表示。然后将这些低方差表示作为分类器的输入。

gtzan dataset.

本例中使用的数据集是GTZAN流派集合[7][8]。数据以压缩的tar压缩包的形式提供,大约1.2 GB。未压缩的数据集需要大约3gb的磁盘空间。从引用中提供的链接中提取压缩的tar文件将创建一个包含十个子文件夹的文件夹。每个子文件夹都根据它包含的音乐样本的类型来命名。音乐类型有:布鲁斯、古典、乡村、迪斯科、嘻哈、爵士、金属、流行、雷鬼和摇滚。每种类型有100个例子,每个音频文件包含约30秒以22050 Hz采样的数据。在原始论文中,作者使用了大量的时域和频域特征,包括从每个音乐例子中提取的mel-frequency倒谱(MFC)系数和高斯混合模型(GMM)分类,实现了61%[7]的准确率。随后,深度学习网络被应用到这些数据中。在大多数情况下,这些深度学习方法由卷积神经网络(CNN)组成,MFC系数或谱图作为深度CNN的输入。 These approaches have resulted in performance of around 84% [4]. An LSTM approach with spectrogram time slices resulted in 79% accuracy and time-domain and frequency-domain features coupled with an ensemble learning approach (AdaBoost) resulted in 82% accuracy on a test set [2][3]. Recently, a sparse representation machine learning approach achieved approximately 89% accuracy [6].

下载数据

第一步是下载GTZAN类型收集[7] [8]。此示例中的说明假定您将数据设置为临时目录,tempdir在MATLAB®。如果您选择在不同的文件夹下载数据tempdir,在后续指令中更改目录名称。使用枪声下载并解压缩数据集。然后使用解压提取tar文件的内容。的文件夹类型中创建tempdir.内部类型是十个子文件夹,一个用于每个音乐类型。

dataul =.'http://opihi.cs.uvic.ca/sound/genres.tar.gz';gunzip (dataURL tempdir)%在tempdir中创建genre .tar将(fullfile (tempdir,解压“genres.tar”),Tempdir)%创建类型文件夹

小波散射框架

在小波时间散射网络中指定的唯一参数是时间不变性的持续时间,小波滤波器组的数量以及每个八度音程的小波数。对于大多数应用程序,通过两个小波滤波器组级联数据就足够了。在此示例中,我们使用使用两个小波滤波器组的默认散射网络。第一滤波器组每个八度度有8个小波,第二个过滤器组有一个每个八度的小波。对于此示例,将不变刻度设置为0.5秒,这对应于给定采样率的略高于11,000个样本。创建小波时间散射分解网络。

Sn =小波示踪剂('signallength',2 ^ 19,“SamplingFrequency”,22050,......'invariarcescale',0.5);

要了解不变性缩放的作用,请及时获取和绘制缩放滤波器以及来自第一滤波器组的粗略级小波的实际和虚部。请注意,缩放滤波器的时间支持基本上是0金宝app.5秒的设计。此外,粗略小波的时间支持不超过小波散金宝app射分解的不变尺度。

[fb, f, filterparams] = filterbank (sn);φ= ifftshift(传输线(神奇动物{1}.phift));psiL1 = ifftshift(传输线(神奇动物{2}.psift (:,)));dt = 1/22050;时间= 2 ^ 18 * dt: dt: 2 ^ 18 * dt-dt;scalplt =情节(时间、φ'行宽',1.5);抓住网格ylimits = [-3e-4 3e-4];ylim(ylimits);绘图([ -  0.25-0.25],ylimits,'k-');绘图([0.25 0.25],ylimits,'k-');XLIM([ -  0.6 0.6]);Xlabel(“秒”);ylabel ('振幅');wavplt = plot(time,[real(psiL1) imag(psiL1)]);传奇([scalplt wavplt (1) wavplt (2)),......{“扩展功能”'小波真的部分''小波虚构的部分'});标题({“扩展功能”;“最粗尺度小波第一滤波器组”}) 抓住离开

音频数据存储

音频数据存储允许您管理音频数据文件的集合。对于机器或深度学习,音频数据存储不仅可以管理文件和文件夹中的音频数据流,音频数据存储还可以管理标签与数据的关联,并提供将数据随机分区为不同的集合以进行培训,验证和测试。在此示例中,使用音频数据存储来管理GTZAN音乐类型集合。回想一下集合的每个子文件夹都以其代表的类型命名。设定'insertumbfolders'财产真的指示音频数据存储使用子文件夹并设置'labelsource'财产“foldernames”根据子文件夹名称创建数据标签。此示例假定顶级目录位于Matlab中tempdir目录,被称为“体裁”。确保位置是计算机上顶级数据文件夹的正确路径。您机器上的顶级数据文件夹应包含10个为十个类型命名的子文件夹,并且只能包含与这些类型相对应的音频文件。

位置= fullfile(tempdir,“类型”);广告= audiodatastore(位置,'insertumbfolders',真的,......'labelsource'“foldernames”);

运行以下内容以在数据集中获取音乐类型的计数。

CountAckeLabel(广告)
ans =10×2表标签数__________ _____蓝调100古典100国家100迪斯科100个Hiphop 100爵士100爵士100张歌曲100 reggae 100摇滚100

如前所述,有10个类型,每个类型有100个文件。

训练和测试集

创建培训和测试集以开发和测试我们的分类器。我们使用80%的数据进行培训,并持有剩余的20%进行测试。这洗牌音频数据存储的功能随机洗牌数据。在按标签分割数据以随机化数据之前,先这样做。在这个例子中,我们为再现性设置随机数生成器种子。使用音频数据存储splitEachLabel命令功能执行80-20分裂。splitEachLabel确保所有的班级都是平等的。

Rng (100) ads = shuffle(ads);[adsTrain, adsTest] = splitEachLabel(广告,0.8);countEachLabel (adsTrain)
ans =10×2表标签数_________ _____蓝调80古典80国家80迪斯科80个Hiphop 80爵士80金属80 POP 80 Reggae 80 Rock 80
countEachLabel (adsTest)
ans =10×2表标签数_________ _____蓝调20古典20国家20迪斯科20个Hiphop 20爵士20金属20 Pop 20 Reggae 20 Rock 20

您看到培训数据中有800条记录,预期数据和测试数据中的200条记录。另外,存在训练集中的每个类型的80个例子,并且测试集中的每个类型的20个例子。

要获得散射功能,请使用辅助功能,helperbatchscatfeatures,可获得散射功能的自然对数 2 1 9 每个音频文件的样本,并将散射窗口的数量按6.源代码helperbatchscatfeatures都列在附录中。小波散射特征的计算使用的批大小的64个信号。

如果你有并行计算工具箱™和一个支持的GPU,设置金宝app使用gpu.真的在以下代码中,将使用GPU计算散射变换。使用具有批量大小为64的NVIDIA Titan V GPU,该示例中的散射功能比使用CPU快约9倍。

N = 2 ^ 19;batchsize = 64;scTrain = [];useGPU = false;%设置为true以使用gpu尽管hasdata(adsTrain) sc = helperbatchscatfeatures(adsTrain,sn,N,batchsize,useGPU);scTrain =猫(3 scTrain sc);结束

记录标签创建的散射变换中的时间窗口数。

numTimeWindows =大小(scTrain, 2);

在这个例子中,每个散射路径有43个时间窗口或帧。

对测试数据重复相同的特征提取过程。

sct = [];尽管Hasdata(adstest)sc = helperbatchscatfeatures(adstest,sn,n,批量化,使用gpu);SCTEST =猫(3,SCTEST,SC);结束

确定散射网络中的路径数,并将训练和测试特征重塑为2-D矩阵。

[〜,npaths] = sn.paths();npaths = sum(npaths);训练训练=换算(Sctrain,[2 3 1]);训练费用=重塑(训练治疗,[],NPaths,1);TestFeatures =换算(SCTEST,[2 3 1]);testfeatures =重塑(Testfeatures,[],NPaths,1);

每一排训练费TestFeatures是每个音频信号散射变换中横跨334个路径的一个散射时间窗。对于每个音乐样本,我们有43个这样的时间窗口。因此,训练数据的特征矩阵为34400 × 334。行数等于训练示例数(800)乘以每个示例散射窗口数(43)。同样,测试数据的散射特征矩阵为8600 × 334。有200个测试示例,每个示例有43个窗口。为训练数据的小波散射特征矩阵中的43个窗口每个创建一个类型标签。

trainLabels = adsTrain.Labels;numTrainSignals =元素个数(trainLabels);trainLabels = repmat (trainLabels 1 numTimeWindows);trainLabels =重塑(trainLabels numTrainSignals * numTimeWindows, 1);

对测试数据重复此过程。

testLabels = adsTest.Labels;numTestSignals =元素个数(testLabels);testLabels = repmat (testLabels 1 numTimeWindows);testLabels =重塑(testLabels numTestSignals * numTimeWindows, 1);

在本例中,使用具有三次多项式核的多类支持向量机(SVM)分类器。金宝app将支持向量机与训练数据进行拟合。

template = templatesvm(......'骨箱''多项式'......'polynomialOrder'3,......“KernelScale”'汽车'......'boxconstraint',1,......'标准化', 真的);类= {'蓝调'“经典”“国家”'迪斯科''嘻哈'“爵士乐”......“金属”“流行”'reggae''岩石'};Classificationsvm = fitcecoc(......训练疗法,......Trainlabels,......“学习者”, 模板,......'编码'“onevsone”'classnames',分类(类));

测试设置预测

使用SVM模型适合培训数据的散射变换,以预测测试数据的音乐类型。召回散射变换中的每个信号有43个时间窗口。使用简单的大多数投票来预测流派。辅助功能helperMajorityVote在所有43个散射窗口上获得类型标签的模式。如果没有唯一模式,helperMajorityVote返回指示的分类错误'nounquemode'.这导致混淆矩阵中的额外列。源代码helperMajorityVote都列在附录中。

predLabels =预测(classificationSVM TestFeatures);[TestVotes, TestCounts] = helperMajorityVote (predLabels adsTest.Labels,分类(类));testAccuracy =总和(eq (TestVotes adsTest.Labels)) / numTestSignals * 100
testaccuracy = 87.5000.

测试的准确性,testAccuracy,约为88%。这种准确性与GTZAN数据集的领域相当。

显示混淆矩阵以检查类型的类型逐个精度速率。回想一下每个班级中有20个例子。

confusionchart (TestVotes adsTest.Labels)

混淆矩阵图的对角线显示,总体上对单个体例的分类准确度相当好。分别提取这些类型的准确性和情节。

厘米= confusionmat (TestVotes adsTest.Labels);厘米(:,结束)= [];genreAccuracy =诊断接头(cm)。/ 20 * 100;图;栏(genreAccuracy)集(gca,“XTickLabels”、类);甘氨胆酸xtickangle (30);标题("按类型划分的正确百分比-测试集");

概括

此示例展示了使用小波时间散射和音乐类型分类中的音频数据存储。在该示例中,小波时间散射实现了与GTZAN数据集的最新性能的状态相当的分类精度。与需要提取多个时域和频域特征的其他方法相反,小波散射仅需要单个参数的规格,时间不变。音频数据存储使我们能够有效地管理从磁盘到MATLAB的大型数据集的传输,并允许我们通过分类工作流程准确地保留随机数据的类型成员资格。

参考

  1. Anden, J.和Mallat, S. 2014。深的散射光谱。IEEE信号处理汇刊,Vol. 62, 16, pp. 4114-4128。

  2. Bergstra, J., Casagrande, N., Erhan, D., Eck, D.,和Kegl, B.聚合特征和AdaBoost音乐分类。机器学习,第65卷,第2-3期,473-484页。

  3. Irvin, J., Chartock, E.和Hollander, N. 2016。注重体裁分类的循环神经网络。https://www.semanticscholar.org/paper/Recurrent-Neural-Networks-with-Attention-for-Genre-Irvin/6da301817851f19107447e4c72e682e3f183ae8a

  4. 李,T.,Chan,A.B.和Chun,A. 2010.使用卷积神经网络自动音乐模式特征提取。国际会议数据挖掘和应用。

  5. 马利拉特。S. 2012.集团不变散。纯净和应用数学的通信,Vol。65,10,pp。1331-1398。

  6. Panagakis, Y., Kotropoulos, c.l.,和Arce, G.R., 2014。基于音频特征联合稀疏低秩表示的音乐类型分类。《IEEE音频、语音和语言处理汇刊》,22、12页,1905-1917。

  7. Tzanetakis, G.和Cook, P. 2002。音乐类型分类的音频信号。IEEE Transactions on Speech and Audio Processing, Vol. 10, No. 5, pp. 293-302。

  8. GTZAN类型集合http://marsyas.info/downloads/datasets.html.

附录 - 支持功能金宝app

helperMajorityVote- 此函数返回在多个特征向量上预测的类标签的模式。在小波时间散射中,我们为每个时间窗口获得一个类标签。如果没有找到唯一模式的标签'nounquemode'返回表示分类错误。

类型helperMajorityVote
function [ClassVotes,ClassCounts] = helperMajorityVote(predLabels,origLabels,classes) %此函数仅支持小波散射示例。金宝app它可能会在未来的版本中被更改或删除。%如果标签不是分类的,则创建分类数组origLabels =分类(origLabels);%期望predLabels和origLabels都是分类向量Norig =元素个数(origLabels);Nwin = npr / Norig;predLabels =重塑(predLabels Nwin Norig);ClassCounts = countcats (predLabels);[mxcount, idx] = max (ClassCounts); ClassVotes = classes(idx); % Check for any ties in the maximum values and ensure they are marked as % error if the mode occurs more than once tmpsum = sum(ClassCounts == mxcount); ClassVotes(tmpsum > 1) = categorical({'NoUniqueMode'}); ClassVotes = ClassVotes(:);

helperbatchscatfeatures-此函数返回给定输入信号的小波时间散射特征矩阵。在这种情况下,我们使用小波散射系数的自然对数。散射特征矩阵的计算 2 1 9 信号的样本。散射特征的抽样倍数为6。如果使用gpu.设定为真的,散射变换在GPU上计算。

功能sc = helperbatchscatfeatures (ds、锡、N, batchsize useGPU)%此函数仅用于支持小波中的示例金宝app%的工具箱。它可能会在未来的版本中被更改或删除。从音频数据存储中读取一批数据Batch = HelperReadbatch(DS,N,Batchsize);如果useGPU batch = gpuArray(batch);结束%获得散射功能s = sn.featurematrix(批量,“转换”“日志”);收集(批处理);S =收集(年代);%对特性进行子采样sc = s(:,1:6:结束,:);结束

helperReadBatch- 此函数从数据存储读取指定大小的批量,并以单精度返回输出。输出的每列是来自数据存储的单独信号。如果数据存储区没有足够的记录,则输出可能比批量化更少。

功能batchout = helperReadBatch (N, ds batchsize)%此函数仅支持小波工具箱示例。金宝app它可能%更改或在未来发布中删除。%batchout = ReadReadbatch(DS,N,Batchsize),其中DS是数据存储和%ds是数据存储% batchsize是批大小kk = 1;尽管&& kk <= batchsize tmpRead = read(ds);batchout (:, kk) =投(tmpRead (1: N),“单一”);% #好< AGROW >kk = kk + 1;结束结束