默认情况下,scipy.io.wavfile.read 每秒采样44100个样本。是否可以更改此值,使其每秒获取较少的样本数?
scipy.io.wavfile.read
的第一个返回值是采样率,它来自于音频文件头。如果你想改变采样率,你需要进行一些采样率转换。
下面是一些基本代码,用于通过插值改变采样率。请注意,只有在原始采样率低于新采样率时,这才是无害的。反过来,如果音频文件包含高于奈奎斯特频率的频率,则可能会引入混叠。如果情况确实如此,则应在插值之前应用滤波器。
import numpy as np
from scipy.io import wavfile
from scipy import interpolate
NEW_SAMPLERATE = 48000
old_samplerate, old_audio = wavfile.read("test.wav")
if old_samplerate != NEW_SAMPLERATE:
duration = old_audio.shape[0] / old_samplerate
time_old = np.linspace(0, duration, old_audio.shape[0])
time_new = np.linspace(0, duration, int(old_audio.shape[0] * NEW_SAMPLERATE / old_samplerate))
interpolator = interpolate.interp1d(time_old, old_audio.T)
new_audio = interpolator(time_new).T
wavfile.write("out.wav", NEW_SAMPLERATE, np.round(new_audio).astype(old_audio.dtype))
编辑:您可以查看Python软件包resampy
,该软件包实现了高效的采样率转换。
scipy.io.wavfile.read
返回的采样率是文件中实际的采样率,不总是每秒44100个样本。你需要先读取整个文件,再进行下采样处理。 - Warren Weckesser