主要内容

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

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

GTZAN数据集

本例中使用的数据集是GTZAN流派集合[7][8]。数据以压缩tar存档的形式提供,约为1.2 GB。未压缩的数据集需要约3 GB的磁盘空间。从参考资料中提供的链接提取压缩tar文件将创建一个包含10个子文件夹的文件夹。每个子文件夹根据其包含的音乐样本的类型命名。类型为:布鲁斯,classical、country、disco、hiphop、jazz、metal、pop、reggae和rock。每种类型都有100个示例,每个音频文件由大约30秒的22050 Hz采样数据组成。在最初的论文中,作者使用了许多时域和频域特征,包括mel频率倒谱(MFC)从每个音乐示例和高斯混合模型(GMM)分类中提取系数,以达到61%的准确率[7]。随后,深度学习网络已应用于该数据。在大多数情况下,这些深度学习方法由卷积神经网络(CNN)组成将MFC系数或频谱图作为深度CNN的输入。这些方法的性能约为84%[4]。带有频谱图时间切片的LSTM方法的精度为79%,时域和频域特征加上集成学习方法(AdaBoost)的精度为82%[2] [3]。最近,稀疏表示机器学习方法实现了大约89%的准确率[6]。

下载数据

第一步是下载GTZAN流派集合[7] [8]。在这个例子中的说明假设您下载的数据集中到临时目录中,TEMPDIR在MATLAB®。如果您选择下载一个文件夹中不同的数据TEMPDIR在随后的指令更改目录名。用gunzip要下载并解压缩的数据集。然后使用解压提取tar文件的内容。文件夹流派在创建TEMPDIR.内部流派有十个子文件夹,每种音乐类型一个子文件夹。

dataURL ='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 = waveletScattering (“SignalLength”2 ^ 19,'采样频率', 22050,...“InvarianceScale”, 0.5);

为了理解不变性尺度的作用,从第一滤波器组中,取最粗尺度小波的实部和虚部,在时间上绘制尺度滤波器。注意,按设计,缩放滤波器的时间支持基本金宝app上是0.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);ylimits情节([-0.25 - -0.25],“k——”);ylimits情节([0.25 - 0.25],“k——”);xlim ([-0.6 - 0.6]);包含(“秒”);ylabel (“振幅”);wavplt =情节(时间,[真实(psiL1)IMAG(psiL1)]);图例([scalplt wavplt(1)wavplt(2)],...{“缩放功能”“小波实部”“Wavelet-Imaginary部分”});标题({“缩放功能”“粗尺度小波第一滤波器组”}) 抓住

音频数据存储

音频数据存储,您可以管理的音频数据文件的集合。对于机器或深学习,音频数据存储不仅管理音频数据从文件和文件夹流,音频数据存储还管理与数据标签的关联,并提供能力将数据随机划分为不同的组进行训练,验证和测试。在这个例子中,使用音频数据存储管理GTZAN音乐流派集合。回想集合的每个子文件夹被命名为它所代表的流派。设定'IncludeSubFolders'财产真正的指示音频数据存储到使用子文件夹和设置“LabelSource”财产“foldernames”根据子文件夹名称创建数据标签。这个例子假设顶级目录在MATLAB中TEMPDIR目录中,名为“流派”。确保这件事地点是计算机上顶级数据文件夹的正确路径。你机器上的顶级数据文件夹应该包含10个子文件夹,每个文件夹都以10种类型命名,并且必须只包含与这些类型相对应的音频文件。

位置= fullfile (tempdir,“类型”);广告= audioDatastore(位置,'IncludeSubFolders',真的,...“LabelSource”“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表标签数_________ _____蓝调20古典20乡村20迪斯科20嘻哈20爵士20金属20流行20雷鬼20摇滚20

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

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

如果您有并行计算工具箱™和支持的GPU,请设置金宝appuseGPU真正的在下面的代码和散射变换将使用GPU来计算。使用的NVIDIA泰坦V GPU使用64的批量大小,在本例中,散射特性进行了计算比使用CPU快大约9倍。

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

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

numTimeWindows =大小(scTrain, 2);

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

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

scTest = [];hasdata(adsTest) sc = helperbatchscatfeatures(adsTest,sn,N,batchsize,useGPU);sct =猫(3 sct sc);结尾

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

[~, npaths] = sn.paths ();Npaths =总和(Npaths);TrainFeatures = permute(scTrain,[2 3 1]);[], TrainFeatures =重塑(TrainFeatures Npaths, 1);TestFeatures = permute(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将支持向量机与训练数据进行拟合。

模板= templateSVM(...“KernelFunction”多项式的...“多项式序”,3,...'KernelScale'“自动”...“BoxConstraint”1....“标准化”,真正的);类= {“布鲁斯”'古典'“国家”'迪斯科''嘻哈(音乐'“爵士乐”...“金属”'流行音乐'“雷鬼”“摇滚乐”};classificationSVM = fitcecoc (...TrainFeatures,...列车标签,...“学习者”, 模板,...“编码”“onevsone”“类名”,分类(类));

测试集预测

使用SVM模型拟合训练数据的散射变换来预测测试数据的音乐类型。回想一下散射变换中每个信号都有43个时间窗。使用简单多数投票来预测类型。辅助函数helperMajorityVote获得所有43个散射窗口的类型标签模式。如果没有唯一的模式,helperMajorityVote返回所指示的分类误差“NonuniqueMode”. 这会在混淆矩阵中增加一列。的源代码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 = DIAG(厘米)./ 20 * 100;数字;栏(genreAccuracy)集(GCA,'XTickLabels',类);xtickangle(GCA,30);标题(“类型的正确百分比-测试集”);

总结

这个例子演示了小波时间散射和音频数据存储在音乐类型分类中的应用。在此示例中,小波时间散射实现了与GTZAN数据集的最先进性能相当的分类精度。与其他需要提取大量时域和频域特征的方法不同,小波散射只需要指定单个参数,即时不变尺度。音频数据存储使我们能够有效地管理从磁盘到MATLAB的大型数据集传输,并允许我们随机化数据,并通过分类工作流准确保留随机化数据的流派成员资格。

参考文献

  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. 李涛、陈雅博和陈雅博。2010。基于卷积神经网络的音乐模式特征自动提取。国际会议数据挖掘和应用。

  5. Mallat。美国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

附录—支持功能金宝app

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

类型helperMajorityVote
这个函数只支持小波散射的例子。金宝app它可能会在未来的版本中更改或删除。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)%该功能仅用于支持例子小波金宝app%的工具箱。它可能会在未来的版本中被更改或删除。%读一批从音频数据存储数据批= helperReadBatch (ds, N, batchsize);如果useGPU batch = gpuArray(batch);结尾获得散射特征S = sn.featureMatrix(批处理,“转换”“日志”);收集(批处理);S =收集(年代);%子样本的特点1:6 sc = S (::,:);结尾

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

函数batchout = helperReadBatch(DS,N,BATCHSIZE)%这个函数只支持小波工具箱的例子。金宝app它可能%的变化或在将来的版本中删除。%batchout=ReadBatch(ds,N,batchsize),其中ds是数据存储,而% ds是数据存储% batchsize为batchsizeKK = 1;(hasdata(DS))&& KK <= BATCHSIZE tmpRead =读(DS);batchout(:,KK)=流延(tmpRead(1:N),'单身的');%#确定KK = KK + 1;结尾结尾

另见

相关的话题