如何用Python将44100采样率WAV转22050且不改变音高速度
解决WAV采样率转换后听感异常的问题
问题根源
你的代码存在关键错误:librosa.load() 默认会把音频文件重采样到22050Hz(librosa的默认采样率),而你后续又指定 orig_sr=44100 调用 librosa.resample(),相当于对已经转成22050Hz的音频再次错误执行降采样,最终导致音频失真、听感异常。
修正方案
方案1:保留原始采样率加载后重采样
加载音频时指定 sr=None,让librosa读取原始44100Hz的采样率数据,再执行正确的重采样:
import os import librosa import soundfile as sf # 提前创建目标目录,避免写入失败 os.makedirs("wavs", exist_ok=True) # 遍历目录下的WAV文件,跳过非WAV格式 for filename in os.listdir("All_wavs"): if not filename.endswith(".wav"): continue # 加载原始采样率的音频数据 y, sr = librosa.load(f"All_wavs/{filename}", sr=None) # 校验原始采样率,避免处理不符合要求的文件 if sr != 44100: print(f"跳过:{filename} 采样率不为44100") continue # 执行重采样 resampled_data = librosa.resample(y, orig_sr=sr, target_sr=22050) # 保存转换后的文件 sf.write(f"wavs/{filename}", resampled_data, samplerate=22050)
方案2:用SoundFile直接读取原始数据(更精准)
绕过librosa的默认采样率处理,直接用soundfile读取原始音频数据,再进行重采样:
import os import librosa import soundfile as sf os.makedirs("wavs", exist_ok=True) for filename in os.listdir("All_wavs"): if not filename.endswith(".wav"): continue # 读取原始音频数据与采样率 y, sr = sf.read(f"All_wavs/{filename}") if sr != 44100: print(f"跳过:{filename} 采样率不为44100") continue # 重采样 resampled_data = librosa.resample(y, orig_sr=sr, target_sr=22050) sf.write(f"wavs/{filename}", resampled_data, samplerate=22050)
额外提示
- 若处理多声道音频(如立体声),上述代码会自动保留声道信息,不会改变声道数量。
- 建议先备份原始音频文件,避免操作失误导致数据丢失。
内容的提问来源于stack exchange,提问作者Max Melichov
相关产品推荐
相关产品推荐

