音频文件预处理函数报错:librosa.feature.rms参数传递错误
问题解决:音频预处理函数的TypeError错误
错误原因
你遇到的TypeError: rms() takes 0 positional arguments but 1 positional argument (and 4 keyword-only arguments) were given是因为Librosa版本更新后,librosa.feature.rms的参数传递方式改变了。新版本的rms函数要求音频数据必须通过关键字参数y传递,不能直接用位置参数传入。
修复后的代码
修改预处理函数中调用Librosa特征提取函数的部分,将音频数据final_x通过关键字参数y传入:
def preprocess(file_path, frame_length = 2048, hop_length = 512): ''' 预测前对.wav音频文件进行的处理流程。 参数: - file_path - 音频文件的系统路径。 - frame_length - 计算语音特征的帧长,默认值:2048 - hop_length - 每帧前进的样本数,默认值:512 返回: 'X_3D'变量,单文件的形状为:(batch, timesteps, feature)(batch = 1)。 ''' # 获取采样率 _, sr = librosa.load(path = file_path, sr = None) # 加载音频文件 rawsound = AudioSegment.from_file(file_path, duration = None) # 归一化至5 dBFS normalizedsound = effects.normalize(rawsound, headroom = 5.0) # 将音频文件转换为样本的np数组 normal_x = np.array(normalizedsound.get_array_of_samples(), dtype = 'float32') # 降噪 final_x = nr.reduce_noise(normal_x, sr=sr, use_tensorflow=True) # 修改:用y=final_x传递音频数据 f1 = librosa.feature.rms(y=final_x, frame_length=frame_length, hop_length=hop_length, center=True, pad_mode='reflect').T # 能量 - 均方根(Root Mean Square) f2 = librosa.feature.zero_crossing_rate(y=final_x, frame_length=frame_length, hop_length=hop_length,center=True).T # 过零率(ZCR) f3 = librosa.feature.mfcc(y=final_x, sr=sr, S=None, n_mfcc=13, hop_length = hop_length).T # 梅尔频率倒谱系数(MFCC) X = np.concatenate((f1, f2, f3), axis = 1) X_3D = np.expand_dims(X, axis=0) return X_3D
额外说明
- 不止
rms,Librosa 0.10.x版本后,大部分特征提取函数(比如zero_crossing_rate、mfcc)都要求音频数据通过y关键字参数传入,不再支持位置参数传递。 - 若需兼容旧版本Librosa,可先检查版本(执行
import librosa; print(librosa.__version__)),如果是0.9.x及以下,原代码可正常运行;如果是0.10+,必须使用关键字参数传递音频数据。
内容的提问来源于stack exchange,提问作者Rithesh VR
相关产品推荐
相关产品推荐

