主要内容

音乐流派分类使用小波时散射

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

GTZAN数据集

在这个例子中使用的数据集是GTZAN流派集合[7] [8]。该数据被提供为一个压缩tar归档其大约为1.2 GB。未压缩的数据集大约需要3 GB的磁盘空间。提取从文献中提供的链接压缩的tar文件创建十个子文件夹的文件夹。每个子文件夹被命名为它包含音乐样本的流派。该类型是:蓝调,古典,乡村,迪斯科,嘻哈,爵士,金属,流行,雷鬼,摇滚和。有每个类型的100个例子和每个音频文件包括大约30秒22050赫兹采样数据。在最初的论文中,作者使用了大量的时域和频域的功能,包括梅尔频率倒谱(MFC)从每个音乐示例和高斯混合模型(GMM)的分类萃取,以实现61%的精确度系数[7]。随后,深学习网络已经应用到这些数据。在大多数情况下,这些深层次的学习方法包括用MFC系数或频谱作为输入到深CNN卷积神经网络(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.内部类型有十个子文件夹,每种音乐类型一个子文件夹。

数据URL='http://opihi.cs.uvic.ca/sound/genres.tar.gz';gunzip解(dataURL,TEMPDIR)%创造了TEMPDIR genres.tar将(fullfile (tempdir,解压'genres.tar'),tempdir)%创建类型文件夹

小波散射框架

在小波时间散射网络中,唯一需要指定的参数是时间不变性的持续时间、小波滤波器组的数量和每倍频程小波的数量。对于大多数应用,通过两个小波滤波器组级联数据就足够了。在本例中,我们使用默认散射网络,该网络使用两个小波滤波器组。第一个滤波器组每倍频程有8个小波,第二个滤波器组每倍频程有1个小波。对于本例,将不变比例设置为0.5秒,这对应于给定采样率下略多于11000个采样。建立小波时间散射分解网络。

sn=小波模式(“信号长度”,2^19,'采样频率',22050,...“不变性刻度”,0.5);

为了理解不变性尺度的作用,从第一个滤波器组中获得并绘制缩放滤波器以及最粗尺度小波的实部和虚部。请注意,缩放滤波器的时间支持基本上是设计的0.5秒。此外,最粗尺度小波的时间支持不超过小波散射分解的不变尺度。万博1manbetx

[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)情节(ylimits (-0.25 - -0.25),“k——”)情节([0.25 0.25],ylimits,“k——”xlabel([-0.6 0.6])“秒”)伊拉贝尔(“振幅”)wavplt=绘图(时间,[真实(psiL1)图像(psiL1)];图例([切割wavplt(1)wavplt(2)],...{“缩放功能”“小波实部”“小波虚部”})头衔({“缩放功能”“粗尺度小波第一滤波器组”}) 抓住

音频数据存储

音频数据存储使您能够管理音频数据文件的集合。对于机器学习或深度学习,音频数据存储不仅管理来自文件和文件夹的音频数据流,音频数据存储还管理标签与数据的关联,并提供将您的数据随机划分为不同集合的能力,以供traini使用ng、验证和测试。在本例中,使用音频数据存储来管理GTZAN音乐流派集合。回想该集合的每个子文件夹都是根据其所代表的流派命名的。设置“包含子文件夹”财产符合事实的指示音频数据存储到使用子文件夹和设置“标签源”财产“foldernames”基于子文件夹名称创建数据标签。此示例假定顶级目录位于MATLAB中TEMPDIR目录中,名为“流派”。确保这件事地点是指向计算机上顶级数据文件夹的正确路径。计算机上的顶级数据文件夹应包含十个子文件夹,每个子文件夹都以十种类型命名,并且只能包含与这些类型对应的音频文件。

位置=完整文件(tempdir,“类型”); ads=音频数据存储(位置,“包含子文件夹”,真的,...“标签源”“foldernames”);

运行以下命令以获取数据集中音乐类型的计数。

countEachLabel(ads)
ANS =10×2表唱片计数(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数

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

培训和测试集

创建训练集和测试集来开发和测试我们的分类器。我们使用80%的数据进行训练,剩下的20%用于测试洗牌功能的音频数据存储随机洗牌的数据。在按标签分割数据以随机化数据之前进行此操作。在这个例子中,我们设置随机数生成器种子以保证重现性。使用音频数据存储splitEachLabel命令功能,执行80-20分割。splitEachLabel确保所有的类被相等地表示。

RNG(100)的广告=混洗(广告);[adsTrain,adsTest] = splitEachLabel(广告,0.8);countEachLabel(adsTrain)
ANS =10×2表唱片计数80古典80乡村80迪斯科80嘻哈80爵士80金属80流行80雷鬼80摇滚80
countEachLabel (adsTest)
ANS =10×2表唱片计数(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数

你看,有800条记录训练数据如预期200所记录的测试数据。此外,还有在训练集中的每个流派80组的实施例和在测试集合中的每个类型的20倍的例子。

要获取散射特征,请使用辅助函数,helperbatchscatfeatures,该函数获取散射特征的自然对数 2 1 9 对每个音频文件进行采样,并将散射窗口数再采样6次。的源代码helperbatchscatfeatures列在附录中。小波散射特征是使用64个信号的批量大小计算的。

如果您有并行计算工具箱™和支持的GPU,请设置万博1manbetxuseGPU符合事实的在下面的代码中,将使用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个时间窗或帧,对于每个散射路径。

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

scTest = [];虽然hasdata(adsTest)sc=helperBachScatFeatures(adsTest、sn、N、batchsize、useGPU);scTest=cat(3,scTest,sc);结尾

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

[~,npath]=sn.paths();npath=sum(npath);TrainFeatures=permute(scTrain,[2 3 1]);TrainFeatures=reformate(TrainFeatures,[],npath);TestFeatures=permute(scTest,[2 3 1]);TestFeatures=reformate(TestFeatures,[],npath);

每行列车特征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)分类器。万博1manbetx将支持向量机与训练数据进行拟合。

template=templateSVM(...“内核函数”“多项式”...“多项式序”,3,...'KernelScale'“自动”...“BoxConstraint”1....“标准化”,true);类={“布鲁斯”'古典'“国家”“迪斯科”“嘻哈”“爵士乐”...“金属”'流行音乐'“雷鬼”“摇滚乐”}; 分类VM=FITCECOCC(...列车特征,...列车标签,...“学习者”样板...“编码”“onevsone”“类名”,分类(类));

测试集预测

使用适合训练数据散射变换的SVM模型预测测试数据的音乐类型。回忆散射变换中每个信号有43个时间窗口。使用简单多数投票预测类型。辅助函数helperMajorityVote获取所有窗口中类型标签的模式。如果没有唯一模式,helperMajorityVote返回由指示的分类错误“NonuniqueMode”。这会在混淆矩阵中增加一列。的源代码helperMajorityVote列在附录中。

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

测试的准确性,testAccuracy,约为88%。该精度与GTZAN数据集的最先进水平相当。

显示混淆矩阵,按类别准确率检查类别。回想一下,每节课有20个示例。

cm=混淆图(adsTest.Labels、testvots);

对角线的混淆矩阵图显示,对于各个流派的分类准确度是一般相当不错。提取这些类型的精度和单独绘制。

cmat=cm.NormalizedValues;cmat(end,:)=[];genreAccuracy=diag(cmat)。/20*100;图形条(genreAccuracy)集合(gca,'XTickLabels',班级)xtickangle(gca,30)职称(“类型的正确百分比-测试集”

总结

本例演示了小波时间散射和音频数据存储在音乐类型分类中的使用。在本例中,小波时间散射实现了与GTZAN数据集的最新性能相当的分类精度。与其他需要提取大量时域和fre的方法不同序列域特征,小波散射只需要指定一个参数,即时不变的尺度。音频数据存储使我们能够有效地管理从磁盘到MATLAB的大型数据集的传输,并允许我们随机化数据,并通过e分类工作流程。

工具书类

  1. Anden J.和Mallat S. 2014。深的散射光谱。《信号处理学报》,Vol. 62, 16, pp. 414 -4128。

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

  3. 欧文,J.,Chartock,E.,与霍兰德,N. 2016年的递归神经网络,注重对流派分类。https://www.semanticscholar.org/paper/Recurrent-Neural-Networks-with-Attention-for-Genre-Irvin/6da301817851f19107447e4c72e682e3f183ae8a

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

  5. Mallat.S.2012.群不变散射。纯数学和应用数学通讯,第65卷,第10卷,第1331-1398页。

  6. 帕纳加基斯,科特罗普洛斯,C.L.和阿尔切,G.R. 2014。基于音频特征联合稀疏低秩表示的音乐类型分类。IEEE音频、语音和语言处理汇刊,22,12,1905-1917页。

  7. Tzanetakis,G和库克,音频信号的P. 2002音乐流派分类。IEEE TRANSACTIONS ON语音和音频处理,第10,第5号,第293-302。

  8. GTZAN流派集http://marsyas.info/downloads/datasets.html

附录——支持功能万博1manbetx

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

类型helperMajorityVote
这个函数只支持小波散射的例子。万博1manbetx它可能会在未来的版本中更改或删除。predLabels = categorical(predLabels);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。如果useGPU设置为符合事实的,散射变换计算在GPU上。

作用sc = helperbatchscatfeatures (ds、锡、N, batchsize useGPU)%该功能仅用于支持例子小波万博1manbetx%的工具箱。它可能会在未来的版本中被更改或删除。%读一批从音频数据存储数据batch=helperReadBatch(ds、N、batchsize);如果useGPU batch = gpuArray(batch);结尾%获取散射特征S=序列号特征矩阵(批次,“转换”“日志”);收集(批处理);S =收集(年代);%子样本的特点sc=S(:,1:6:end,:);结尾

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

作用batchout = helperReadBatch(DS,N,BATCHSIZE)%此函数仅支持小波工具箱示例。可能万博1manbetx%的变化或在将来的版本中删除。%batchout=ReadBatch(ds,N,batchsize),其中ds是数据存储,而%ds是数据存储% batchsize为batchsizeKK = 1;虽然(hasdata(DS))&& KK <= BATCHSIZE tmpRead =读(DS);batchout(:,KK)=流延(tmpRead(1:N),'单身的');%#确定KK = KK + 1;结尾结尾