美文网首页Python与机器学习
用Python分析俞丽拿的梁祝协奏曲

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

作者: Jeru_d39e | 来源:发表于2018-02-12 08:26 被阅读225次

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

音频也是一样可以拆成很多的帧,上一节讲到在机器的眼里,一幅画就是无数个像素在二维空间上的组合,每个像素都是坐标与颜色组成。而在音乐的世界里,对于纯音乐而言一首曲子就是很多个帧在一维空间的有序向量,每帧代表一个频率,频率越高则音调越高。音频的单位为赫兹,一赫兹意味着一秒仅振动一次,人耳能听到声音的范围是在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, 可以从任意油画生成音乐。

相关文章

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

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

  • 对话梁祝——纪念小提琴协奏曲《梁祝》首演60周年音乐会

    新年的第一场星期广播音乐会,正逢小提琴协奏曲《梁祝》首演六十周年纪念,这次星广会特别邀请了《梁祝》首演者俞丽拿老师...

  • 读书丨《梁祝》的诞生

    晚上打开视频,随着小提琴协奏曲权威演奏家俞丽娜的一曲《梁祝》开始今晚的学习。《梁祝》的故事,在中国早就是家喻户晓。...

  • 梁祝欣赏

    1959年5月27日,由何占豪、陈钢作曲的小提琴协奏曲《梁祝》在上海兰心大戏院首次公演,俞丽拿担任小提琴独奏。这支...

  • 梁祝

    总会戴上耳机 听着俞丽娜老师的小提琴协奏曲---《梁祝》 总会在喜欢的一本书中---《穆斯林的葬礼》 在其中寻觅着...

  • 听曲

    中午,插上耳机 听俞丽拿《梁祝》 音乐似淙淙流水 将记忆无限回溯 鄂西北边踵小镇 父亲用一台唱片机 黑胶唱片 开启...

  • 希望天下人有情人终成眷属

    当我第一次欣赏小提琴协奏曲《梁祝》的时候是在上人文艺术,它是在当时就读于上海音乐学院管弦系的学生何占豪、陈钢、俞丽...

  • 此夜曲中闻梁祝

    作者:钱大江 我买过盛中国先生的一盘磁带,为了对比也买了一盘俞丽拿的,对比的曲目就是《梁祝》,但终...

  • 儿子在高中时的作品

    小提琴协奏曲《梁祝》

  • 也听“梁祝”小提琴协奏曲

    也听“梁祝”小提琴协奏曲 最早听到“梁祝”小提琴协奏曲还是在30多年前,当时的一个同学家里,偶然听到卡带播放的,应...

网友评论

    本文标题:用Python分析俞丽拿的梁祝协奏曲

    本文链接:https://www.haomeiwen.com/subject/irkrtftx.html