0

我正在该样本中存在的每一帧绘制一个音频样本幅度,如下所示:

sound = AudioSegment.from_mp3("test.mp3")
print(len(sound))
print(len(sound.raw_data))
data = np.fromstring(sound.raw_data, dtype=np.int16)
left, right = data[0::2], data[1::2]
plt.plot(left)

在此过程中,我注意到声音 AudioSegment 的长度与声音 raw_data 不同,为什么会这样?

而且随着 test.mp3 持续时间变长,x 轴上的刻度线会达到几百万,所以我的疑问是我们如何以较低的采样率绘制数据,或者换句话说,如何减少数据数组中的样本数量?

这是我的第一个想法:计算音频数据数组中前 10 或 20 个样本的平均值,并将它们表示为一个点,这样我们就可以减少样本数量。但是,这可能会导致一些信息丢失和性能问题。

python有没有其他方法可以做到这一点?

4

1 回答 1

0

在 pydub 中,len(sound)是以毫秒为单位的持续时间,其中len(sound.raw_data)将是总音频数据的字节数。

如果您正在使用 CD 质量的声音(44.1kHz,16 位,立体声),您预计每毫秒大约有 44 个样本(44100 / 1000),每个样本两个字节(16 位),左/右再翻倍渠道。所以大约每毫秒 176 个字节。

要创建您在许多音频编辑器中看到的绘图,最常见的方法是获取音频的 rms 块。

如果你想要一个 400px 宽的图,你可以这样做……</p>

from pydub import AudioSegment
sound = AudioSegment.from_file("...")

num_chunks = 400 #px
chunk_size = int(len(sound) / num_chunks #ms))

loudness_over_time = []
for i in range(0, len(sound), chunk_size):
    chunk = sound[i:i+chunk_size]
    loudness_over_time.append(chunk.rms)

注意,我没有测试过这段代码

于 2016-08-12T13:20:15.007 回答