最近迷上了林俊杰的歌,尤其是《伟大的渺小》,听得我热血沸腾,就想着用代码把它可视化一下。说干就干!
第一步:当然是找数据!
我先是想看看能不能直接爬取网易云音乐的评论,看看大家对这首歌的感受,结果发现反爬机制有点厉害,搞了半天也没搞定。后来一想,算了,先把歌曲本身的音频数据搞到手再说。于是我用Python的Librosa库,把《伟大的渺小》的音频文件加载进来。
第二步:音频特征提取!
Librosa真是个好东西,几行代码就把歌曲的各种特征提取出来了,像是梅尔频谱、色度图、节奏等等。当时我看的眼花缭乱的,心想:哇,原来一首歌里面藏了这么多信息!
第三步:数据可视化!
拿到数据之后,就开始琢磨怎么可视化。梅尔频谱看起来像是声纹,颜色越深的地方,声音能量越高。我试着用Matplotlib把梅尔频谱画出来,结果…emmm…怎么说,就是一张彩色的图,完全看不出歌曲的节奏和情绪变化。不死心!我又尝试把色度图画出来,这个看起来像是音符的分布,但还是太抽象了。
第四步:另辟蹊径,寻找灵感!
折腾了一天,发现直接用Librosa提取的特征来可视化,效果不太我就开始在网上找资料,看看别人是怎么做音乐可视化的。结果发现,很多人会用FFT(快速傅里叶变换)把音频信号转换成频域信号,然后再进行可视化。我心想这方法靠谱!
第五步:FFT变换,频域分析!
我用NumPy库实现了FFT变换,把音频信号转换成频域信号。然后,我把频率和幅度画在一张图上,这回看起来有点意思了!能看到歌曲的主要频率成分,还有一些峰值。但是,这还是不够直观,没法反映歌曲的情绪变化。
第六步:动态可视化,让音乐动起来!
我就想,能不能做一个动态的可视化,让画面随着音乐的播放而变化?于是我开始学习Pygame库,想做一个简单的音乐播放器,然后把FFT变换的结果实时显示出来。这个过程真是痛苦,Pygame的文档看得我头昏脑胀,各种bug层出不穷。不过最终我还是搞定了一个简单的播放器,能够加载音频文件,并且实时显示频谱图。
第七步:色彩映射,赋予画面情感!
为了让画面更有感觉,我给频谱图加上了色彩映射。高频部分用暖色调,低频部分用冷色调,这样看起来就更有层次感了。而且我还让颜色随着音乐的节奏而变化,这样画面就动起来了。
第八步:最终成果,小小的感动!
经过几天的折腾,我终于把《伟大的渺小》可视化出来了!虽然画面很简单,就是一个简单的频谱图,但是它能够随着音乐的播放而变化,颜色也会跟着节奏跳动。看着自己的成果,我感到一种小小的感动。原来,代码也能表达音乐的情感!
- 这回实践让我对音乐和代码都有了更深的理解。
- 学会了使用Librosa、NumPy、Matplotlib、Pygame等Python库。
- 更重要的是,我体会到了从无到有,解决问题的乐趣。
虽然这回可视化的效果还比较简单,但是我会继续努力,探索更多的音乐可视化方法,把更多喜欢的歌曲用代码呈现出来!