荐歌大师:用深度学习搭建一个音乐推荐系统

年初时我们曾向大家分享过一个有趣的项目:用深度学习发现一首歌属于哪个流派。

其实这个项目再往深了研究,就可以根据歌曲流派来推荐歌曲了。最近有位叫Matt Murray的机器学习研究者就完成了这样一个项目——用深度学习创建了一个音乐推荐系统。

项目代码地址见文末。

总之这是一个非常不错的音乐资源,为在售的每首歌都提供了一个2分钟的MP3格式的试听样本。唯一的问题是····在这个网站上找到一首老歌实在是太困难了。

这个网站极度热衷推广新歌曲,当然这也说得过去,因为新歌卖得火就意味着赚的更多了。但是那些以前的老歌呢?

音乐推荐

其实在JunoDownload网站上已经存在一些推荐歌曲,在网站主界面上有在售歌曲排行榜,新歌排行榜,以及由一些DJ和网站编辑创建的推荐歌单。

在每首歌的页面上,窗口右手边显示了“购买了这首歌曲的人还买了”,“该歌手发布的其它歌曲”和“该唱片公司发布的其它歌曲”,这些信息倒也有用。

但是坐拥这么大的一个音乐数据库,我觉得这个网站上却唯独缺少基于内容的推荐类型,比如“你可能还喜欢”,也就是根据用户当前所听的歌曲和已购买的歌曲,向用户推荐他可能喜欢的同类歌曲。

当然我也知道,现在几乎所有的音乐App已经有这种功能,但是亲自用深度学习技术创建一种能帮自己发现歌曲的系统,还是很酷的,对吧?所以我决定搭建一款音乐推荐系统。

过程

要想实现这个目标,需要几个步骤,包括获取数据、处理数据和训练模型。

整个工作流程涉及:

下载MP3 文件

我需要做的第一件事就是下载大量MP3样本文件用作数据。

在爬取网站上超过40万首歌曲文件的单曲信息后,我会任意选择9种不同的音乐流派,并按这9个流派从每个流派中随机选择1000首歌曲。

这9个歌曲流派是:

碎拍音乐

雷鬼乐

慢摇

鼓打贝斯

经典电音

嘻哈乐

极简音乐

摇滚乐

迷幻舞曲

在接下来几天内,我下载了全部9000首MP3文件。

将音频转换为声谱图

一份音频文件内包含的数据非常多,所以这一步的大部分工作实质上就是浓缩音乐中的信息,提取主要特征并去除所有的噪声数据。基本上这是一项降维操作,首个步骤就是把音频转换为图像形式。

利用离散傅里叶变换法,我将音频信号转换为频域,以这种方式处理了全部9000个MP3音频文件,为每首歌保存了它们的声谱图。所谓声谱图就是声音频率的频谱随着时间变化的可视化表示。图谱中颜色的深浅表示该频率下的声音大小。

我选择创建单色的声谱图,如下所示:

这是从嘻哈单曲中生成的约为20秒的音频,其中声谱图中X轴为时间,Y轴为声音频率。

将图像分为256 x 256的正方图

如果用这些数据训练模型,我需要将所有的图像具有相等的维度,所以我将全部声谱图分割为256 x 256的正方图。这表示每张图上约为5秒的音频。

现在我总共有超过18万5千张图像,每张图像都有一个标签,注明了音乐流派。

我将数据分为包含12万张图像的训练集、包含4万5千张图像的验证集和2万张图像的Holdout验证集。

用图像训练一个卷积神经网络

我用我的图像数据训练了一个CNN网络,我需要教它来识别不同类型的音乐在声谱图图像中“看起来”是怎样的,所以我使用了音乐流派标签训练它从图像中识别音乐流派。

下面是CNN工作流的可视化图:

首先以上图左上角的声谱图开始,将它转换为一个由表示每个像素中颜色的数字组成的矩阵。从这里开始,数据会经过工作流中的多个层级,每经过一层,矩阵的形状就会被转换,直到最终抵达右下角的softmax分类器。这个分类器是一个由9个数字组成的向量,包含了CNN将9个音乐流派分配给声谱图的概率。

还有一步就是全连接层,这是一个由128个数字组成的向量,它们实质上是在图像经过多个网络层传递后从中提取的128个音乐特征。思考这一层的另一种方法是原始图像中的所有关键信息都已浓缩为“解释”图像的128个数字。

那么我们怎么使用CNN模型呢

经过训练后,模型能够以75的准确率分类音乐流派,我觉得这个准确率还可以,因为划分音乐流派有时是相当主观的,而且音乐有时常常也不止一个流派。下面是模型分配各个流派的准确率:

碎拍音乐:91%

雷鬼乐:90%

慢摇:79%

鼓打贝斯:78%

经典电音:71%

嘻哈乐:71%

极简音乐:70%

摇滚乐: 63%

迷幻舞曲:61%

模型为歌曲分配音乐流派的效果还是很不错的,我怀疑嘻哈乐、鼓打贝斯和慢摇之间可能存在一些交叉,这可能导致了分类准确率降低。由于碎拍乐和其它8种流派区别很大,所以这可能是为何模型分类它的准确率很高的原因。

不过,这些数字对我来说并不是最重要的,我真正关心的是模型能否区分不同类型的音乐。

音乐推荐系统

现在我已经训练了一个能在声谱图上“看”音乐的神经网络,不再需要softmax分类器了,所以移除了这一层,并为数据集中全部18万5千张图像提取了它们的128个音乐特征向量。

每张图像仅表示大约5秒长的音频,样本MP3文件总共长2分钟,我大约有23张图像——因此每个音乐文件会有23个特征向量。我计算了每首歌的平均向量,得到了9000个特征向量,每个对应我最初下载的9000首歌曲中的每一首。

和开头一样,我把这9000个音频文件转换为9000张声谱图,将它们分割为18万5千张更小的声谱图,再用它们训练一个卷积神经网络。然后我从这些图像中提取了18万5千个特征向量,为9000个原始音频文件计算了它们的平均向量。

此时已经从音乐文件中提取了128个特征,这些音乐文件都有不同的音乐特点。那么为了创建能推荐具有相似特点的歌曲的推荐系统,我只需找到哪些向量彼此最相似。要得到这个结果,我需要计算出9000个向量的余弦相似性。

歌曲推荐

最后一步就是随机选择一首歌,然后让模型从我下载的9千首MP3歌曲数据集中返回相似音乐(具有最大余弦相似性的歌曲)的最佳推荐。

下面是模型推荐歌曲的一些示例,第一首歌是我随机选择的,下面三首是模型为我推荐的歌曲,我觉得挺好的,不知你怎么看:

https://youtu.be/H1cN4uzxZZw

https://youtu.be/cPHpr_u62ZM

https://youtu.be/cizXW9vvoRA

https://youtu.be/VDuOu4BMDz8

结语

我觉得整件事情最酷的地方就是完全不用人监督,想象一下,如果你自己一首接一首的听完这9000首歌曲,为它们标记好流派,这得花多长时间啊。假设你有一百万首歌曲呢?

所以我对我创建的这款音乐推荐系统还是很知足的,它能在无需人类事先听取音频的情况下,很好地找到风格很相似的歌曲。

本项目代码地址:

https://github.com/mattmurray/music_recommender

https://github.com/mattmurray/juno_crawler

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180917G0VH7K00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券