使用librosa重采样音频至16kHz后输出异常问题求助
代码问题分析与修复方案
核心错误点
- 未执行实际重采样操作:你调用
librosa.load()时传入的sr是原音频采样率,加载得到的音频数组y还是32000Hz采样率的序列,后续直接调用soundfile.write()时指定samplerate=16000,相当于把原采样序列按更低的采样率强制解读,会出现声音变慢、时长翻倍、音调异常的问题,就是你所说的损坏。 - 输出文件名固定导致覆盖:循环遍历所有音频文件时,输出路径的文件名固定为
output_resampled_audio.wav,所有输入文件的结果会互相覆盖,最终仅保留最后一个文件的处理结果,还可能出现写入冲突导致文件损坏。 - 变量未定义:代码中使用的
zoom_loc变量没有提前赋值,会导致路径拼接失败,输出文件写入路径错误甚至无法写入。 - 文件名拆分逻辑错误:用
file.split(".")拆分文件名和后缀的方式不适用于名称含多个点的文件,应该用os.path.splitext()做后缀拆分。
修复后代码
import os import librosa import soundfile as sf # 提前定义缺失的变量,根据你实际的路径修改 zoom_loc = "这里替换成你自己的zoom_loc实际路径" folder_name = "trial_sess" input_dir = os.path.join("process", folder_name) # 提前创建输出目录避免写入报错 output_dir = os.path.join(zoom_loc, "sessions", folder_name) os.makedirs(output_dir, exist_ok=True) for file in os.listdir(input_dir): # 拆分后缀的正确方法 nm, ext = os.path.splitext(file) ext = ext.lower() if ext in (".m4a", ".mp4", ".mp3"): file_path = os.path.join(input_dir, file) # 加载时直接指定目标采样率,librosa会自动完成重采样 y, sr = librosa.load(file_path, sr=16000) # 输出文件名和原文件对应,避免覆盖 output_path = os.path.join(output_dir, f"{nm}_resampled.wav") sf.write(output_path, data=y, samplerate=16000)
可选优化方案
如果不想在加载时重采样,也可以加载原采样率音频后调用librosa.resample显式重采样:
y, sr = librosa.load(file_path, sr=None) # 加载原采样率音频 y_16k = librosa.resample(y, orig_sr=sr, target_sr=16000) sf.write(output_path, data=y_16k, samplerate=16000)
内容的提问来源于stack exchange,提问作者imantha
相关产品推荐
相关产品推荐

