音乐分析与可视化
我对用Python编写音乐可视化程序很感兴趣。
第一个问题是,怎么从音乐中获取信息呢?比如音量、频率、转速等等。这些信息是从声卡获取,还是从实际的音乐文件中获取呢?
我猜应该是从声卡获取,但我该如何访问声卡以及获取这些信息呢?最好是能在不同的平台上都能用(Linux是必须的)。我已经读了一些关于傅里叶变换的资料,但不确定这是否是最好的方法。
我考虑过用OpenGL来做可视化,但我也欢迎其他建议。
我已经看过那些维基页面,但还没有找到答案:
http://wiki.python.org/moin/Audio/
http://wiki.python.org/moin/PythonInMusic
3 个回答
这个答案已经不再适用,因为Echo Nest API已经不再可用了. 保留这个内容只是为了历史原因
可以考虑一下Echo Nest API,它和Python配合得很好,可以返回每分钟的节拍数(这可能是你想要的,而不是转速),平均音量,甚至是任何音频文件的“舞动感”。使用这个API需要一个密钥,不过除此之外,它是免费的,效果也不错。
它还提供了处理音乐的代码,使用的是他们的Echo Nest Remix包。下面是他们的示例代码:
"""Reverse a song by playing its beats
forward starting from the end of the song"""
import echonest.audio as audio
# Easy around wrapper mp3 decoding and Echo Nest analysis
audio_file = audio.LocalAudioFile("NeverGonnaTellIt.mp3")
# You can manipulate the beats in a song as a native python list
beats = audio_file.analysis.beats
beats.reverse()
# And render the list as a new audio file!
audio.getpieces(audio_file, beats).encode("NeverGonnaTellItBackwardsByBeat.mp3")
另一个可以用来处理音频的工具是 librosa。它除了提供一些基本操作外,还可以进行 节拍跟踪,帮助你获取每分钟的节拍数(bpm)。根据教程,进行节拍跟踪时:
import librosa
audio_path = librosa.util.example_audio_file()
# or uncomment the line below and point it at your favorite song:
# audio_path = '/path/to/your/favorite/song.mp3'
y, sr = librosa.load(audio_path)
y_percussive = librosa.effects.hpss(y)
tempo, beats = librosa.beat.beat_track(y=y_percussive, sr=sr)
正如 @dionyziz 也提到的,
节拍会以帧的形式出现。你可以使用
librosa.frames_to_time(beats)
我还没有尝试过这个。
如果你在找一个可以跨平台使用的音频库,我强烈推荐使用FMOD,这个库真的很棒。还有一个封装库可以在Python中使用(不过我自己没用过)。
它会提供一些现成的功能,比如获取音频的频谱。
如果你想分析音频文件,我推荐的算法是节拍频谱。这个算法通过比较音乐中的每个短样本与其他样本,来计算一个相似度矩阵。一旦相似度矩阵计算完成,就可以得到每对样本在每个时间间隔T的平均相似度 {S(T);S(T+1)}:这就是节拍频谱。
这个算法可以帮助你得到音频序列的每分钟节拍数(BPM),而且还能做更多事情,比如识别音乐的不同部分,找到相似样本之间的过渡。我不太清楚你所说的“可视化音频”具体指什么,但我觉得这个算法应该能给你提供足够的信息,帮助你开始将图像与音频同步(如果这正是你想做的)。