如何使用SciPy在不同采样率下读取.wav文件?

6

默认情况下,scipy.io.wavfile.read 每秒采样44100个样本。是否可以更改此值,使其每秒获取较少的样本数?


3
scipy.io.wavfile.read 返回的采样率是文件中实际的采样率,不总是每秒44100个样本。你需要先读取整个文件,再进行下采样处理。 - Warren Weckesser
1个回答

8

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,该软件包实现了高效的采样率转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接