如何使用 python 减少音频数据数组中的样本数

How to reduce the number of samples in audio data array using python

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

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 轴上的刻度数达到几百万,所以我怀疑我们如何以较低的采样率绘制数据,或者换句话说,我如何减少data 数组中的样本?

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

python 有其他方法吗??

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

如果您使用的是 CD 质量的声音(44.1kHz,16 位,立体声),您会期望每毫秒大约有 44 个样本(44100 / 1000),每个样本两个字节(16 位),加倍再次为 left/right 个频道。所以大约每毫秒 176 个字节。

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

如果你想要一个 400px 宽的图,你会做类似...

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)

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