求助:Librosa melspectrogram触发TypeError参数错误
问题分析与解决:Librosa melspectrogram TypeError错误
错误信息
Traceback (most recent call last):
mel_spectrogram = librosa.feature.melspectrogram(signal, sr=sr, n_mels=128, fmax=8000)
TypeError: melspectrogram() takes 0 positional arguments but 1 positional argument (and 1 keyword-only argument)
错误原因
这个错误是Librosa版本兼容性问题导致的:在Librosa 0.10.0及以上版本中,librosa.feature.melspectrogram的音频输入参数从位置参数改为了关键字-only参数,必须通过y=来指定音频信号,不能再用位置参数直接传入。旧版本的写法(直接传位置参数)在新版本中会触发参数不匹配错误。
另外代码里还有两处逻辑问题:
- 加载第一个音频文件后,用了之前生成的随机
signal变量提取梅尔频谱,而不是加载得到的y变量,导致处理的不是目标音频数据。 - 标签拼接逻辑错误:
y = np.empty((0,10))和label = np.array([1,0,0])维度不匹配,且未为每个增强样本生成对应标签。
解决办法
- 修改所有
melspectrogram调用:将音频信号参数改为关键字参数y=传入 - 修复变量混淆问题:加载音频后,用正确的变量(加载得到的
y或循环内的signal)提取频谱 - 修复标签拼接逻辑:统一标签维度,并为每个增强样本生成对应标签
修改后的完整代码
import numpy as np import librosa from scipy.io import wavfile from sklearn.model_selection import train_test_split from sklearn.neural_network import MLPClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import confusion_matrix, accuracy_score, roc_curve, auc from sklearn.metrics import accuracy_score import tensorflow as tf import librosa.display sr = 16000 # 生成测试音频文件 signal = np.random.randn(sr*5) file_name = 'file1.wav' signal_int = np.int16(signal/np.max(np.abs(signal)) * 32767) wavfile.write(file_name, sr, signal_int) audio_files = ['file1.wav', 'file2.wav', 'file3.wav'] # 修复变量错误和参数写法 y, sr = librosa.load(audio_files[0], sr=16000) y = librosa.util.normalize(y) mel_spectrogram = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128, fmax=8000) log_mel_spectrogram = librosa.power_to_db(mel_spectrogram, ref=np.max) # 数据增强函数 def add_noise(data): noise = np.random.randn(len(data)) data_noise = data + 0.005 * noise return data_noise def shift(data): return np.roll(data, int(len(data)/10)) def stretch(data, rate=0.8): return librosa.effects.time_stretch(data, rate) # 初始化数据集和标签(修复维度不匹配问题) X = np.empty((0, 128, 44)) y_labels = np.empty((0, 3)) label = np.array([1, 0, 0]) for file in audio_files: signal, sr = librosa.load(file, sr=16000) signal = librosa.util.normalize(signal) # 修改melspectrogram参数写法 mel_spectrogram = librosa.feature.melspectrogram(y=signal, sr=sr, n_mels=128, fmax=8000) log_mel_spectrogram = librosa.power_to_db(mel_spectrogram, ref=np.max) # 生成增强数据 signal_noise = add_noise(signal) signal_shift = shift(signal) signal_stretch = stretch(signal) # 为增强数据提取梅尔频谱(修复直接赋值错误,先提取频谱再转对数刻度) mel_noise = librosa.feature.melspectrogram(y=signal_noise, sr=sr, n_mels=128, fmax=8000) log_mel_noise = librosa.power_to_db(mel_noise, ref=np.max) mel_shift = librosa.feature.melspectrogram(y=signal_shift, sr=sr, n_mels=128, fmax=8000) log_mel_shift = librosa.power_to_db(mel_shift, ref=np.max) mel_stretch = librosa.feature.melspectrogram(y=signal_stretch, sr=sr, n_mels=128, fmax=8000) log_mel_stretch = librosa.power_to_db(mel_stretch, ref=np.max) # 扩展维度以匹配数据集格式 log_mel_spectrogram = np.expand_dims(log_mel_spectrogram, axis=0) log_mel_noise = np.expand_dims(log_mel_noise, axis=0) log_mel_shift = np.expand_dims(log_mel_shift, axis=0) log_mel_stretch = np.expand_dims(log_mel_stretch, axis=0) # 拼接数据集和标签(为每个增强样本生成对应标签) X = np.concatenate((X, log_mel_spectrogram, log_mel_noise, log_mel_shift, log_mel_stretch), axis=0) y_labels = np.concatenate((y_labels, np.tile(label, (4, 1))), axis=0)
内容的提问来源于stack exchange,提问作者IRedScarface
相关产品推荐
相关产品推荐

