
本文详解 librosa 0.10.1+ 版本中 `librosa.resample` 的调用规范,重点解决因参数传递方式错误(如误用位置参数)导致的 “takes 1 positional argument but 3 were given” 报错,并提供完整、健壮的多通道音频重采样实践代码。
在使用 librosa 对音频进行重采样(如将原始采样率统一为 16 kHz 以适配 wav2vec2 模型输入)时,一个常见且易被忽视的陷阱是:新版 librosa(≥0.8.0,尤其 0.10.1+)已将 resample 函数改为仅接受关键字参数(keyword-only arguments)。这意味着 orig_sr 和 target_sr 必须显式以命名参数形式传入,而不能再像旧版那样作为位置参数顺序传递。
你遇到的报错:
resample() takes 1 positional argument but 3 were given
正是源于以下错误写法:
librosa.resample(audio_signal, original_sr, 16000) # ❌ 错误:后两个参数被当作位置参数
而正确调用方式必须严格遵循函数签名(注意 * 分隔符):
librosa.resample(y=audio_signal, orig_sr=original_sr, target_sr=16000) # ✅ 正确 # 或简写(y 是第一个参数,可省略名称;但 orig_sr/target_sr 必须带名) librosa.resample(audio_signal, orig_sr=original_sr, target_sr=16000) # ✅ 推荐
以下是修复后的完整、生产就绪的重采样代码(兼容单/双通道,含异常处理与类型安全):
import librosa
import numpy as np
# 假设 database['audio'] 是 list of np.ndarray(每个元素为 waveform),database['psr'] 是原始采样率列表
new_sr = []
resampled_audios = []
for i, (audio_signal, original_sr) in enumerate(zip(database['audio'], database['psr'])):
try:
# 确保输入为 numpy 数组且为浮点型(librosa.resample 要求)
audio_signal = np.asarray(audio_signal, dtype=np.float64)
# 处理多通道:逐通道重采样并堆叠
if audio_signal.ndim > 1:
resampled_channels = []
for ch in audio_signal:
ch_res = librosa.resample(ch, orig_sr=original_sr, target_sr=16000)
resampled_channels.append(ch_res)
resampled_audio = np.stack(resampled_channels, axis=0)
else:
# 单通道直接重采样
resampled_audio = librosa.resample(audio_signal, orig_sr=original_sr, target_sr=16000)
resampled_audios.append(resampled_audio)
new_sr.append(16000)
except Exception as e:
print(f"⚠️ 索引 {i} 音频重采样失败(原始采样率 {original_sr} Hz): {e}")
# 可选:保留原音频或跳过,此处设为 None 便于后续排查
resampled_audios.append(None)
new_sr.append(None)
# 更新数据库
database['audio'] = resampled_audios
database['newsr'] = new_sr✅ 关键注意事项:
- 永远显式指定 orig_sr= 和 target_sr= —— 这是避免报错的核心;
- librosa.resample 默认使用高质量重采样器(soxr_hq),无需额外配置即可满足 ASR 模型训练需求;
- 若原始音频为整型(如 int16),务必先转为 float32/float64,否则可能引发数值溢出或静音;
- 对于立体声等多通道音频,不可直接对整个二维数组调用 resample(它不支持 batch 维度),必须按通道循环处理;
- 如需更高性能批量处理,建议改用 torchaudio.transforms.Resample(PyTorch 原生,GPU 加速支持)替代。
掌握这一参数规范,不仅能解决当前报错,更是安全集成 librosa 到语音预处理流水线的重要基础。










