使用librosa库降低采样率报错:resample() takes 1 positional argument but 3 were given
# 定义转换采样率的函数,接收3个变量:原音频路径、重新采样后的音频存储路径、目标采样率
def change_sample_rate(path, new_dir_path, new_sample_rate):
wavfile = path.split('/')[-1] # 提取音频文件名,如“1.wav"
signal, sr = librosa.load(path, sr=None) # 调用librosa载入音频
try:
new_signal = librosa.resample(signal, sr, new_sample_rate) # 调用librosa进行音频采样率转换
except Exception as e:
pass
new_path = os.path.join(new_dir_path, wavfile) # 指定输出音频的路径,音频文件与原音频同名
# new_path = os.path.join(new_dir_path, new_file_name) #若需要改名则启用此行代码
print(new_path)
soundfile.write(new_path, new_signal, new_sample_rate)
if __name__ == '__main__':
# 指定原音频文件夹路径
original_path = "mav_input/"
wav_list = os.listdir(original_path)
# 指定转换后的音频文件夹路径
new_dir_path = "mav_out"
os.makedirs(new_dir_path, exist_ok=True)
# 开始以对原音频文件夹内的音频进行采样率的批量转换 16k
for i in wav_list:
wav_path = os.path.join(original_path, i)
change_sample_rate(wav_path, new_dir_path, new_sample_rate=16000)
报错信息如上,全部走except,搜了相关信息也解决,根据异常信息得到的解决方法如下:
错误消息“TypeError:resample()采用1个位置参数,但给定了3个”表明调用resample函数时参数太多。从代码来看,调用resample()函数时似乎有三个参数:signal、sr和new_sample_rate。然而,根据librosa.resample()的文档,它只需要两个参数:y(相当于signal)和orig_sr(相当于sr)。
要修复此错误,您应该从resample()函数调用中删除new_sample_rate参数,并将其作为第二个参数传递给函数。
同时,我注意到new_signal变量被初始化为None,并且只有在librosa.resample()函数调用成功时才会更新。如果函数调用失败,new_signal在传递给soundfile.write()函数调用时仍将为None,这可能会导致错误。为了避免这种情况,您应该将new_signal初始化为一个空数组,而不是None。
根据此解决办法,越界问题没了,全剩下异常信息了,除此之外"mav_out"文件夹下确实会出现同名wav文件,但是强制转换数据某些参数并没有改变,导致源文件跟转换后的文件格式皆出现问题,无法播放。
就这逐渐抓狂的时候我开始怀疑是librosa库的问题,本机装的python版本为3.10,而librosa库的版本如下:
于是试着降低下版本,pip install librosa == 0.9.2
,
成功执行,且给出得警告信息是
FutureWarning: Pass orig_sr=24000, target_sr=16000 as keyword args. From version 0.10 passing these as positional arguments will result in an error
意思是
未来警告:将orig_sr=24000,target_sr=16000作为关键字args。从版本0.10开始,将这些作为位置参数传递将导致错误
离了个大谱,淦!