音乐分析与可视化

18

我想用Python编写一个音乐可视化程序。

首先问题是如何获取音乐信息,比如音量、频率、转速等等,要从哪里获取?从声卡还是实际的音乐文件中获取?

我的猜测是从声卡中获取,但我该如何访问声卡并获取所需信息呢?最好以跨平台的方式实现(Linux是必须的)。我已经读了一些关于傅里叶变换的资料,但我不确定这是否是最好的方法。

我考虑使用OpenGL进行可视化,但我仍然愿意听取其他建议。

我已经查看了这些维基页面,但还没有找到答案: http://wiki.python.org/moin/Audio/
http://wiki.python.org/moin/PythonInMusic

3个回答

15
如果你正在寻找跨平台的音频库,我强烈建议使用FMOD,这个库非常棒。同时也有一个用于python的wrapper可用(尽管我从未使用过)。
它将提供诸如开箱即用的频谱获取等功能。
如果你想分析音频文件,我的选择算法是beat spectrum。它通过将音乐的每个短样本与其他所有样本进行比较来计算相似性矩阵。一旦计算出相似性矩阵,就可以在每个时间间隔T中获取每个样本对{S(T);S(T+1)}的平均相似度:这就是节拍谱。
它允许获取音频序列的BPM,但还可以做更多的事情,比如识别音乐的不同部分,定位类似样本之间的转换。我不知道你所说的“可视化音频”具体是什么意思,但我认为这个算法应该为你提供足够的信息来开始将图像与音频同步(如果这是你想要做的)。

他的意思是像Traktor / Serato中的波形一样的波形。 - Josh Usre

7

另一个工具是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所说,这个

beats will be in frames. You can convert them to actual time using

librosa.frames_to_time(beats)

我没有尝试过这个。


1
请注意,您需要使用HPSS滤波器从y中提取y_percussivey_harmonic,y_percussive = librosa.effects.hpss(y)。此外,您返回的节拍将以帧为单位。您可以使用librosa.frames_to_time(beats)将它们转换为实际时间。 - dionyziz

2

自从Echo Nest API不再可用,这个答案已经不再适用。仅保留出于历史原因。

考虑使用Echo Nest API,它可以完美地与Python配合使用,并返回有关每分钟节拍数(可能是您想要的而不是RPM)、平均振幅甚至“舞蹈性”的任何音频文件的信息。您需要一个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")

2
啊,提到商业产品就典型的被踩了。 - Michael Scott Asato Cuthbert
2
看起来这个不再可用了,现在是一个Spotify API。 - russellaugust

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接