使用python从mp3音频文件中获取振幅数据

Nik*_*391 5 python audio mp3 matplotlib pyaudio

我有一个mp3文件,我想基本上绘制出该音频样本中存在的振幅频谱。我知道如果我们有一个wav文件,我们可以很容易地做到这一点。有很多python软件包可用于处理wav文件格式。但是,我不想将文件转换为wav格式,然后存储然后使用。我要实现的目标是直接获取mp3文件的幅度,即使我必须将其转换为wav格式,脚本也应该在运行时进行广播,而无需实际将文件存储在数据库中。我知道我们可以像下面这样转换文件:

from pydub import AudioSegment
sound = AudioSegment.from_mp3("test.mp3")
sound.export("temp.wav", format="wav")
Run Code Online (Sandbox Code Playgroud)

并创建了预期的temp.wav,但是我们可以仅使用内容而不存储实际文件吗?

Jac*_*cek 6

MP3 是编码波(+ 标签和其他东西)。您需要做的就是使用 MP3 解码器对其进行解码。解码器将为您提供进一步处理所需的完整音频数据。

如何解码mp3?我很震惊 Python 的可用工具如此之少。虽然我在这个问题中找到了一个很好的。它被称为pydub,我希望我可以使用作者的示例片段(我用来自 wiki 的更多信息更新了它):

from pydub import AudioSegment

sound = AudioSegment.from_mp3("test.mp3")

# get raw audio data as a bytestring
raw_data = sound.raw_data
# get the frame rate
sample_rate = sound.frame_rate
# get amount of bytes contained in one sample
sample_size = sound.sample_width
# get channels
channels = sound.channels
Run Code Online (Sandbox Code Playgroud)

请注意,此时raw_data正在“播出”;)。现在由您决定如何使用收集的数据,但该模块似乎为您提供了所需的一切。

  • 如果 _ 是一个样本并且您有 3 个通道,则歌曲 `|_ _ _| |_ _ _| |_ _ _|` 有 6 个样本,3 个帧。每个 _ 的长度都是“sample_size”字节。如果“sample_size = 2 bytes”,那么我的歌曲长度为 12 个字节,并且以 Sample_rate = 6 Hz 播放时长为 1 秒。 (2认同)