Python与机器学习

用Python分析俞丽拿的梁祝协奏曲

2018-02-12  本文已影响225人  Jeru_d39e

前几天看到篇文章讲到如何将小电影中的女主角换脸,其实这还是一个图片的加工转化,将视频分解为帧,对每一个出现了女主角的画面进行替换,再还原成视频。

音频也是一样可以拆成很多的帧,上一节讲到在机器的眼里,一幅画就是无数个像素在二维空间上的组合,每个像素都是坐标与颜色组成。而在音乐的世界里,对于纯音乐而言一首曲子就是很多个帧在一维空间的有序向量,每帧代表一个频率,频率越高则音调越高。音频的单位为赫兹,一赫兹意味着一秒仅振动一次,人耳能听到声音的范围是在30hz-16000hz之间。比如小提琴的四根弦从粗到细在空弦发出的声音频率分别是196hz, 293.7hz, 440hz, 659.2hz, 琴弦越细震动自然越高频。

KTV有个对演唱打分的功能,评分的实现原理是什么?一首歌唱的好不好,除了看音准,还要看节奏,也许还有分贝吧,这一切信息都可以用数字或波形图来还原呈现。通过数字化的方式对原唱歌曲和你唱的歌曲进行比对,找出其相似度,就能量化一首歌唱的好坏程度了。

我在网上找了俞丽拿老师的梁祝协奏曲来做为样本,这也是我最喜欢的一个版本。下载格式是mp3, 首先要给它转成wav。转成wav有两种方式,一个是下载MPG123这个软件,然后用python去调一下启动命令,更好的方法是利用pydub这个开源框架来处理。使用pydub必须要先安装avconv或者ffmpeg二选一的分帧解码工具,我推荐安装ffmpeg,以前做性能自动化测试的时候用过它来对视频进行分帧。

我在Anaconda下安装,prompt命令窗口中输入
conda install -c https://conda.anaconda.org/menpo ffmpeg
强烈建议找梯子,否则速度极慢,七八个小时也不出奇。装好了ffmpeg就可以写几行代码来转格式了,运行下面三行即可看到新的wav生成。

wav文件其实就是RIFF格式中的一种,Chunk是最小组成单位,存储着视频或者音频中的一帧。
看看下图的描述,文件有三部分数据组成,头部数据,格式定义和真正的音频数据。

头部数据,直接用file形式打开音频,读取前12位打印出来就能看到相关信息
格式部分可以引入WAVE库读取更方便,我也挑几个打印出来看看这个音频文件是双声道的(stereo),总共有8007552帧数据,一秒采样44khz, 保真度挺高达到CD标准。

代码 输出

最后,我调用scipy中提供的方法读取data, 再用plot打印出来。这里一定要设置一下画布大小figsize,否则根本看不清。

代码 输出

生成的波形图中有两种颜色,因为是左右声道的叠加,而且虽然scipy的包很强大,可以一行搞定波形绘制,但是细节隐藏在黑盒里,还是多写几行代码一探究竟,顺便把双声道拆解开来展示。这里可以尝试把左右声道的数组都保存到文件里看看,各是8007552行数据,正好和前面的frames的数量能对的上。用总帧数8007552除以采样率44100等于181,这意味着这首曲子正好是三分钟播放时间,这也是波形图中横坐标的含义。纵坐标代表振幅或频率,就是那八百多万行的数字 [1.765000000000000000e+03, 1.883000000000000000e+03, 1.969000000000000000e+03 ...]

左右声道的帧是交替穿插记录的,所有先把原有数组一切为二(line 23),再做一个矩阵置换(line 25)就把数据分离开了。

代码

这样两张独立的左右声道波形图就绘制出来了,仔细观察下它们的pattern还是略有差异的。

输出

打开单通道的mono文件,里面有不少音频为0,还有很多超过10000。前面说到人耳能识别的音频上限是16000,而对于小提琴而言,音频范围在192到4400之间,原本我想尝试把这些记录删除掉,后来感觉没这么简单,因为采样率会被破坏。

接下来考虑能不能把音频数据还原成五线谱呢? 有一个很强大的工具叫lilypond, 只要输入音符序列就能自动生成五线谱图片,所以问题简化为如何从音频数据转化成音符。我找到了一张音符与频率的对照表,理论上把音频数据切片后映射成音符就可以了。好像也没什么人干过这事,搜了半天也没有看到有用的资料。

映射表

问题是如何切片呢? 假如一拍时长算一秒,四分一拍就是四分一秒,即44100/4,于是又写了几行代码把181*4个音频平均数计算出来,再往音阶上去靠。这个想法也许很不靠谱,实际计算出来的值倒是在有效音阶范围内,但也有点偏大,还需要继续研究,不过今天就先到这里。

代码 输出得到一些这样的结果

还有一件事情可以尝试,图片是二维矩阵,音频是一维向量,将二维矩阵映射到一维向量,再加上点乐理知识做一下tuning, 可以从任意油画生成音乐。

上一篇下一篇

猜你喜欢

热点阅读