利用python爬虫爬取网站音乐
最近我想在网站上下载几首音乐放到我的u盘里听,但是上网上一找,各大音乐网站下载歌曲(尤其是好听的歌曲)都需要vip。
对于像我这样的穷人来说,肯定是不会花几十块钱去下载几首音乐啦,而且作为程序员,充钱去下载音乐那也是不可能的,于是我花了一天时间,上网找了各种资料来学习一下怎样才能不花钱白嫖到网站上的音乐。
当然,方法还是有很多种的,最后我还是选择了一种最简单,最方便的一种方法: python爬虫。下面,我就跟大家分享一下我在用python爬虫时遇到的坑。
- 音乐从哪里来?—网站的服务器里
- 怎么从网址里得到音乐?—向网站发起网络请求
- 删选音乐文件
- 下载音乐文件
1. 引入发送网络请求的第三方库
安装方法
- 引入数据解析第三方库
安装方法
- 某易云音乐网站列表url为\’https://music.163.com/#/discover/toplist?id=3778678\’
- 发送请求获取页面数据
- 解析数据
- 获取所有歌曲标签集合( a标签 )
- 下载歌曲
以上的方法我是从一个视频里学到的,那个视频是半年前出的,可能当时这种方法还好使,但是今天我在用这种方法下载音乐文件的时候突然就报错了。
首先,编辑器报错找不到 music_name 和 music_id ,我仔细一看,获取的id_list集合里(也就是标签集合里)的id根本不是id,是代码,估计在这里音乐网站也做了相应的反扒机制。
其次,我自己在网站里找到了一首音乐获取了它的id并把id赋值给music_id,结果当用外链下载音乐时报错460,显示网络拥挤,估计下载音乐的网址也不好使了。
{\”msg\”:\”网络太拥挤,请稍候再试!\”,\”code\”:-460,\”message\”:\”网络太拥挤,请稍候再试!\”}e
最后,我打印出music_url,点击进去,还是可以听歌和下载的,不知道这是为什么了
music.163.com/song/media/…
现在的网站技术更新太快,很多网站都有了高级反爬机制,毕竟嘛,有些东西还是不能随随便便就给你的,我写这篇文章主要是跟大家分享一下我学习python爬虫时的一些经验,同时,我也想请教各位大神,像遇到了我这种问题了,我应该怎么办才能将这个网站的音乐文件爬到我的本地电脑里,还请各大神指点一二。
程序员闯祸!虾米音乐代码注释出现"穷逼vip"
近日,某技术论坛出现了一篇讨论阿里旗下虾米音乐客户端的帖子,引发了网友争议。发帖人称,虾米音乐客户端的程序员竟然称一些短期VIP客户为“穷逼”VIP。
据悉,虾米音乐时常会推出各种领取VIP优惠活动,这种VIP实际上跟常规的包月付费VIP在使用上应该没什么不同,但时间上有限制,短期使用。
而据发帖的网友称,虾米音乐Mac版客户端中关于VIP会员代码的注释,上面的图片中出现了所谓的“穷逼VIP(活动送的那种)”。据了解,其他VIP还有普通VIP和超级VIP。
实际上,在写代码的时候,为了让同事看懂这串代码的作用,程序员会对这行代码进行注释。如此看来,这位程序员小哥是顺手给这些短期VIP用户起了一个名字,叫做“穷逼vip”。
有意思的是,该程序员可能怕自己忘记,特意写明了这类vip 的使用对象:活动送的那种……
此外,在其他的代码注释里,程序员还标明了“乞丐vip”和“beggar vip”。
为此有网友表示,虽然赠送的VIP的确是免费或者花费很少的钱获得的,但不得不说该程序员的代码注释太“简单粗暴”了;也有网友试图从程序员的角度出发,认为这只是程序员沉闷工作下的一种寻找乐趣的手段。更有网友调侃道,这充分说明了, 现阶段程序开发的主要矛盾, 是日益增长的开发需求同编译型语言开发速度低下之间的矛盾。
随后,针对此事件,该程序员在知乎上做出了回应,表示:今后我老老实实写代码,正正经经写注释。他说,在自以为是的“吐槽”中丧失了对客户的敬畏,对所有虾米用户,以及互联网用户表示道歉。
据该程序员透露,因为家庭原因,他早一月前就已经离职。
“当晚就从前同事那里听到了消息,得知他们都在加班删除我写的注释,重新打包发布程序,我感觉十分愧疚。”其表示,本意并没有任何歧视意思,只是想吐槽一些活动规则的复杂。“但是,不管如何,错了就是错了,我认错。”据了解,这是由于代码检查不到位导致的不当用语外露。
另外在“事发当晚”,虾米音乐有关负责人在阿里巴巴内网回复,第一时间做了复盘,替换了有问题的应用包,彻底去除了不当用语,同时修复文件混淆失效的BUG。
该负责人称,希望大家严于律己、引以为戒,始终把“客户第一”牢记心头,真正去服务客户,而不是挂在嘴边。
你想用深度学习谱写自己的音乐吗?这篇指南来帮助你!(附代码)
作者:ARAVIND PAI
翻译:吴金笛
校对:和中华
本文长度为6800字,建议阅读15分钟
本文手把手带你使用python编写一个自动生成音乐的模型。
总览
- 学习如何开发一个自动生成音乐的端到端模型
- 理解WaveNet架构并使用Keras从零开始实现它
- 在建立自动音乐生成模型的同时,比较了WaveNet和Long-Short-Term Memory的性能
介绍
“如果我不是物理学家,我可能会成为音乐家。我经常在音乐中思考。我活在音乐的白日梦里。我从音乐的角度来看待我的生活。”——阿尔伯特·爱因斯坦
我可能不是爱因斯坦先生那样的物理学家,但我完全同意他对音乐的看法!我不记得有哪一天我没有打开音乐播放器。我上下班都伴随着音乐的旋律,老实说,它帮助我专注于工作。
我一直梦想着作曲,但却不懂乐器。直到我遇到了深度学习,这一切都成了过去。使用某些技术和框架,我能够在不了解任何乐理的情况下创作自己的原创音乐乐谱!
这是我最喜欢的专业项目之一。我结合了两个爱好——音乐和深度学习——创建了一个自动的音乐生成模型。梦想成真了!
我很高兴与你分享我的方法,包括使你也能够生成原创音乐的全部代码!首先,我们将快速理解自动音乐生成的概念,然后再深入了解用于执行此操作的不同方法。最后,我们将启用Python并设计我们自己的自动音乐生成模型。
目录
1. 什么是音乐自动生成?
2. 音乐的组成要素是什么?
3. 生成音乐的不同方法
- 使用WaveNet架构
- 使用Long-Short-Term Memory(LSTM)
4. 实现——使用python进行自动作曲
什么是音乐自动生成?
“音乐是一种艺术,是一种通用的语言。”
我把音乐定义为不同频率的音调的集合。因此,自动音乐生成是一个用最少的人为干预来创作一首短曲的过程。
产生音乐最简单的形式是什么?
这一切都是从随机选择声音并将它们组合成一段音乐开始的。1787年,莫扎特为这些随机声音的选择提出了骰子游戏。他手动合成了近272个音调!然后,他根据两个骰子点数之和选择一个音调。
另一个有趣的想法是利用音乐语法来生成音乐。
“音乐语法是指对音乐声音的合理安排和组合以及对音乐作品的正确表现所必需的知识”
-《音乐语法基础》
在20世纪50年代早期,Iannis Xenakis使用统计学和概率的概念来创作音乐——通常被称为随机音乐(Stochastic Music)。他将音乐定义为偶然出现的一系列元素(或声音)。因此,他用随机理论来表述它。他对元素的随机选择完全依赖于数学概念。
最近,深度学习架构已经成为自动音乐生成的最新技术。在本文中,我将讨论使用WaveNet和LSTM(Long-Short-Term Memory)架构来实现自动作曲的两种不同方法。
注意:本文需要对一些深度学习概念有基本的理解。我建议阅读以下文章:
- 从头开始学习卷积神经网络(CNNs)的全面教程
https://www.analyticsvidhya.com/blog/2018/12/guide-convolutional-neural-network-cnn/?utm_source=blog&utm_medium=how-to-perform-automatic-music-generation
- 深度学习要领:长短期记忆(LSTM)入门
https://www.analyticsvidhya.com/blog/2017/12/fundamentals-of-deep-learning-introduction-to-lstm/?utm_source=blog&utm_medium=how-to-perform-automatic-music-generation
- 学习序列建模的必读教程
https://www.analyticsvidhya.com/blog/2019/01/sequence-models-deeplearning/?utm_source=blog&utm_medium=how-to-perform-automatic-music-generation
音乐的组成要素是什么?
音乐本质上是由音符和和弦组成的。让我从钢琴的角度来解释这些术语:
- 音符:单键发出的声音称为音符
- 和弦:由两个或更多的键同时发出的声音称为和弦。一般来说,大多数和弦包含至少3个键音
- 八度:重复的模式称为八度。每个八度包含7个白键和5个黑键
自动生成音乐的不同方法
我将详细讨论两个基于深度学习的自动生成音乐的架构——WaveNet和LSTM。但是,为什么只有深度学习架构?
深度学习是一个受神经结构启发的机器学习领域。这些网络自动从数据集中提取特征,并能够学习任何非线性函数。这就是为什么神经网络被称为泛函逼近器(感觉泛函在数学上的定义不适合这里,网上也有人翻译为 万能函数拟逼近器,因为最早有一篇关于 Universal Approximation Theorem的论文)。
因此,深度学习模型是自然语言处理(NLP)、计算机视觉、语音合成等各个领域的最新技术。让我们来看看如何构建这些作曲模型。
方法一:使用WaveNet
“WaveNet是谷歌DeepMind开发的一种基于深度学习的原始音频生成模型。”
WaveNet的主要目的是从原始的数据分布中生成新的样本。因此,它被称为生成模型。
“WaveNet就像是NLP中的一种语言模型。”
在语言模型中,给定一个单词序列,该模型试图预测下一个单词。与语言模型类似,在WaveNet中,给定一系列样本,它试图预测下一个样本。
方法二:使用Long-Short-Term Memory(LSTM)模型
Long-Short-Term Memory (LSTM)是递归神经网络(RNNs)的一种变体,能够捕获输入序列中的长期依赖关系。LSTM在序列到序列(Seq2Seq)建模任务中有广泛的应用,如语音识别、文本摘要、视频分类等。
让我们详细讨论如何使用这两种方法训练我们的模型。
WaveNet:训练阶段
“这是一个多对一的问题,其中输入是一系列振幅值,输出是后续值。”
让我们看看如何准备输入和输出序列。
WaveNet的输入:
WaveNet将原始音频波的小块作为输入。原始音频波是指波在时间序列域中的表示。
在时间序列域中,音频波以不同时间间隔音符的振幅值的形式表示:
WaveNet的输出:
给定振幅值的序列,WaveNet试图预测连续的振幅值。
让我们通过一个示例来理解。考虑一个5秒的音频波,采样率为16,000(即每秒16,000个样本)。现在,我们有8万个样本在5秒内以不同的时间间隔记录下来。让我们把音频分成相同大小的块,比如1024(这是一个超参数)。
下图展示了模型的输入和输出序列:
前3个块的输入和输出
对于其余的块,我们可以遵循类似的过程。
从上面我们可以推断出,每个块的输出只依赖于过去的信息(即以前的时间步长),而不依赖于未来的时间步长。因此,该任务称为自回归任务,该模型称为自回归模型。
推理阶段
在推理阶段,我们将尝试生成新的样本。让我们看看怎么做:
1. 选择一个随机的样本值数组作为建模的起点
2. 现在,模型输出所有样本的概率分布
3. 选择概率最大的值并将其追加到先前的样本值数组中
4. 删除第一个元素并作为下一个迭代的输入传入模型
5. 重复步骤2和4,进行一定次数的迭代
理解WaveNet架构
WaveNet的基本结构是因果扩散的一维卷积层。首先让我们了解相关概念的重要性。
为什么使用卷积,什么是卷积?
“使用卷积的一个主要原因是从输入中提取特征。”
例如,在图像处理的情况下,用过滤器对图像进行卷积可以得到一个特征图。
卷积是一种结合了两个函数的数学运算。在图像处理的情况下,卷积是图像的某些部分与核(kernel)的线性组合。
你可以浏览下面的文章阅读更多关于卷积的知识:
- 卷积神经网络(CNNs)结构的解密
https://www.analyticsvidhya.com/blog/2017/06/architecture-of-convolutional-neural-networks-simplified-demystified/?utm_source=blog&utm_medium=how-to-perform-automatic-music-generation
什么是一维卷积?
一维卷积的目标类似于长短期记忆模型。它用于解决类似于LSTM的任务。在一维卷积中,核或者叫过滤器只沿着一个方向运动:
卷积的输出取决于核的大小、输入形状、填充类型和步长。现在,我将带领你们了解不同类型的填充来理解使用扩张的1D因果卷积层的重要性。
当我们将填充设置为valid时,输入和输出序列的长度会发生变化。输出长度小于输入长度:
当我们将填充设置为same时,在输入序列的两侧填充零以使输入和输出的长度相等:
一维卷积的优点:
- 捕获输入序列中出现的序列信息
- 与GRU或LSTM相比,训练的速度要快得多,因为它们没有循环性的连接
一维卷积的缺点:
- 当填充设置为same时,在时间步长t处的输出也与之前的t-1和未来的时间步长t+1进行卷积。因此,它违反了自回归原则
- 当填充被设置为valid时,输入和输出序列的长度会发生变化,这是计算残差连接所需要的(后面会讲到)
这为因果卷积扫清了道路。
注意: 我在这里提到的利弊是针对于此问题的。
什么是一维因果卷积?
它被定义为这样一种卷积,即t时刻的输出仅与t时刻以及前一层更早的元素进行卷积。
简单地说,正常卷积和因果卷积的区别仅仅在于填充。在因果卷积中,仅在输入序列的左边加0,以保持自回归的原则:
因果一维卷积的优点:
- 因果卷积没有考虑未来的时间步长,而这是建立生成模型的一个标准
因果一维卷积的缺点:
- 因果卷积不能回溯到序列中过去发生的时间步长。因此,因果卷积的接受域非常低。网络的接受域是指影响输出的输入数量:
如你所见,输出只受5个输入的影响。因此,网络的接受域为5,非常低。网络的接受域也可以通过增加大尺寸的核来增加,但是要记住,这样一来计算复杂度也会增加。
这将为我们引出扩张一维因果卷积的绝佳概念。
什么是扩张一维因果卷积?
“在核的值之间有孔或空缺的因果一维卷积层称为扩张的一维卷积。”
所增加的空缺数由扩张率决定。它定义了网络的接受域。大小为k、扩张率为d的核在核k的每个值之间都有d-1个孔。
如你所见,将一个3 * 3的核与一个7 * 7的输入,以扩张率为2进行卷积,最终接受域为5 * 5。
扩张一维因果卷积的优点:
- 扩张的一维卷积网络通过指数增加每一隐藏层的扩张率来增加接受域:
如你所见,输出受所有输入的影响。因此,网络的接受域为16。
WaveNet的残差块:
为了加速模型的收敛,添加了残差连接和跳跃连接的构件:
WaveNet的工作流程:
- 输入进入一个因果一维卷积
- 输出然后进入到2个不同的扩张一维卷积层并使用sigmoid和tanh激活
- 两个不同激活值逐元素相乘导致跳跃连接
- 而跳跃连接和因果一维输出的逐元素相加会导致残差
Long Short Term Memory (LSTM)方法
另一种自动生成音乐的方法是基于长短期记忆(LSTM)模型。输入和输出序列的准备类似于WaveNet。在每一个时间步长,一个振幅值被输入到长短期记忆单元-然后它计算隐藏的向量,并把它传递到下一个时间步。
基于当前的输入a(t)和先前的隐藏向量h(t-1)来计算当前时间的隐藏向量h(t)。序列信息在任何循环(一般recursive会翻译为递归)神经网络中都是这样捕获的:
LSTM的优点:
- 捕获输入序列中出现的顺序信息
LSTM的缺点:
- 由于它是按顺序处理输入信息的,所以它在训练上会花费大量的时间
实现-使用Python进行自动音乐生成
等待结束了!让我们开发一个用于自动生成音乐的端到端模型。启动你的Jupyter
notebook或Colab(或任何你喜欢的IDE)。
下载数据集:
我从众多资源中下载并组合了多个数字钢琴(译者注:Digital piano与电钢琴Electric Piano的区别在于音源的产生方式)的古典音乐文件。你可以从这里下载最终的数据集。
(https://drive.google.com/file/d/1qnQVK17DNVkU19MgVA4Vg88zRDvwCRXw/view)
导入库:
Music 21是MIT开发的用于理解音乐数据的Python库。MIDI是存储音乐文件的一种标准格式。MIDI代表乐器数字接口。MIDI文件包含说明而不是实际的音频。因此,它只占用很少的内存。这就是为什么它在传输文件时通常是首选的。
读取音乐文件:
我们直接定义一个函数来读取MIDI文件。它返回音乐文件中存在的音符和和弦的数组。
现在,将MIDI文件加载到我们的环境中
理解数据:
在本节中,我们将探索数据集并对其进行详细了解。
输出:304
如你所这里见,不重复音符的数量是304。现在,让我们看一下音符的分布。
输出:
从上图可以看出,大多数音符的频率都很低。因此,我们保留最常用的音符,而忽略低频率的音符。在这里,我将阈值定义为50。不过,这个参数是可以更改的。
输出:167
如你在这里看到的,经常出现的音符大约有170个。现在,让我们准备新的音乐文件,其中仅包含最常见的音符
准备数据:
如文章中所述准备输入和输出序列:
现在,我们将为每个音符分配一个唯一的整数:
我们将为输入数据准备整数序列
同样,也为输出数据准备整数序列
让我们保留80%的数据用于训练,其余20%的用于评估:
构建模型
我在这里定义了2种架构– WaveNet和LSTM。请尝试两种架构,以了解WaveNet架构的重要性。
我简化了WaveNet的架构,没有添加残差连接和跳跃连接,因为这些层的作用是提高收敛速度(WaveNet以原始音频波作为输入)。但在我们的例子中,输入是一组音符和和弦,因为我们在生成音乐:
定义回调以在训练期间保存最佳模型:
mc=ModelCheckpoint(\’best_model.h5\’, monitor=\’val_loss\’, mode=\’min\’, save_best_only=True,verbose=1)
让我们使用128的批大小将模型训练50个epoch:
history = model.fit(np.array(x_tr),np.array(y_tr),batch_size=128,epochs=50,validation_data=(np.array(x_val),np.array(y_val)),verbose=1, callbacks=[mc])
导入最好的模型:
是时候创作我们自己的音乐了。我们将按照推断阶段中提到的步骤进行预测。
现在,我们将整数还原为音符。
最后一步是将预测结果转换回MIDI文件。让我们定义一个函数来完成此任务。
将预测结果转换为音乐文件:
convert_to_midi(predicted_notes)
奥利给,对吗,但你的学习不该止步于此。请记住,我们已经构建了一个基准(baseline)模型。
有很多方法可以进一步提高模型的性能:
- 由于训练数据集的规模较小,我们可以对预训练的模型进行微调,以建立一个鲁棒的系统
- 尽可能多地收集训练数据,因为深度学习模型在更大的数据集上泛化更好
结语
深度学习在我们的日常生活中有着广泛的应用。解决任何问题的关键步骤都是理解问题陈述、阐明并定义解决问题的结构。
我在这个项目中得到了很多乐趣(和学习)。音乐是我的激情所在,将深度学习与之结合是非常有趣的。
原文链接:
https://www.analyticsvidhya.com/blog/2020/01/how-to-perform-automatic-music-generation/
原文题目:
Want to Generate your own Music using Deep Learning? Here’s a Guide to do just that!
编辑:于腾凯
校对:洪舒越
译者简介
吴金笛,雪城大学计算机科学硕士一年级在读。迎难而上是我最舒服的状态,动心忍性,曾益我所不能。我的目标是做个早睡早起的Cool Girl。
—完—
想要获得更多数据科学领域相关动态,诚邀关注清华-青岛数据科学研究院官方微信公众平台“ 数据派THU ”。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。