我正在绘制该样本中存在的每个帧的音频样本幅度,如下所示:
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有没有其他方法可以做到这一点?
答案 0 :(得分:0)
在pydub中,len(sound)
是以毫秒为单位的持续时间,其中len(sound.raw_data)
是总音频数据的字节数。
如果您正在处理CD质量的声音(44.1kHz,16位,立体声),您可能希望每个毫秒大约44个样本(44100/1000),每个样本两个字节(16位),再次加倍左/右声道。所以大约每毫秒176个字节。
要创建一个你在许多音频编辑器中看到的情节,最常见的方法是以音素的形式获得音频的有效值。
如果你想要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)
请注意,我还没有测试过此代码