resample() takes 1 positional argument but 3 were given

使用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)

resample() takes 1 positional argument but 3 were given_第1张图片
报错信息如上,全部走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库的版本如下:

resample() takes 1 positional argument but 3 were given_第2张图片

于是试着降低下版本,pip install librosa == 0.9.2
resample() takes 1 positional argument but 3 were given_第3张图片
成功执行,且给出得警告信息是

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开始,将这些作为位置参数传递将导致错误

离了个大谱,淦!

你可能感兴趣的:(踩坑合集,python,开发语言)