使用 python 从 mp3 音频文件中获取幅度数据
Posted
技术标签:
【中文标题】使用 python 从 mp3 音频文件中获取幅度数据【英文标题】:get the amplitude data from an mp3 audio files using python 【发布时间】:2016-12-12 09:11:11 【问题描述】:我有一个 mp3 文件,我想基本上绘制该音频样本中存在的幅度谱。 我知道如果我们有一个 wav 文件,我们可以很容易地做到这一点。有很多 python 包可用于处理 wav 文件格式。但是,我不想将文件转换为 wav 格式然后存储它然后使用它。 我想要实现的是直接获取 mp3 文件的幅度,即使我必须将其转换为 wav 格式,脚本也应该在运行时进行广播,而无需将文件实际存储在数据库中。 我知道我们可以按如下方式转换文件:
from pydub import Audiosegment
sound = AudioSegment.from_mp3("test.mp3")
sound.export("temp.wav", format="wav")
它创建了它应该创建的 temp.wav,但我们可以只使用内容而不存储实际文件吗?
【问题讨论】:
嗯,我有一个代码来获取 wav 文件的幅度。但是我不确定python中是否有类似的包来处理mp3格式 我认为这个问题没有任何问题。我在这个网站上看到了很多问题,程序员询问是否存在解决特定问题的替代方法。 【参考方案1】:MP3 是编码波形(+ 标签和其他东西)。您需要做的就是使用 MP3 解码器对其进行解码。解码器将为您提供进一步处理所需的完整音频数据。
如何解码 mp3?我很震惊,Python 的可用工具如此之少。虽然我在this 问题中找到了一个很好的答案。它被称为pydub,我希望我可以使用作者提供的示例 sn-p(我使用来自 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
请注意,raw_data
此时正在“播出”;)。现在由您决定如何使用收集到的数据,但这个模块似乎可以为您提供所需的一切。
【讨论】:
@PaulNicolashunter 函数返回的原始数据是字符串格式,您只需使用类似np.fromstring(raw_data, dtype=np.int16)
的numpy将其转换为整数格式@
您需要sample_size
和channels
将raw_data
解释为声波。每个帧的长度为channels*sample_size
字节。因此,如果音频是单声道(通道 = 1)且 sample_size = 2 字节,则需要从 raw_data
中取出前 2 个字节,从中取出 2 字节整数,然后得到第一帧的幅度。
如果 _ 是一个样本并且你有 3 个通道,那么歌曲 |_ _ _| |_ _ _| |_ _ _|
有 6 个样本,3 帧。每个 _ 的长度为 sample_size
字节。如果sample_size = 2 bytes
,那么我的歌曲长度为 12 字节,以 sample_rate = 6 Hz 播放的持续时间为 1 秒。
是的,channels = 2 表示音频为立体声。每个帧都有要发送到每个通道的信息,因此通道始终同步在一起。
“我应该如何做到这一点?”这是另一个问题的问题,如何处理 Python 语言中的字节串。也许这可以帮助***.com/questions/22824539/…以上是关于使用 python 从 mp3 音频文件中获取幅度数据的主要内容,如果未能解决你的问题,请参考以下文章