You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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=来指定音频信号,不能再用位置参数直接传入。旧版本的写法(直接传位置参数)在新版本中会触发参数不匹配错误。

另外代码里还有两处逻辑问题:

  1. 加载第一个音频文件后,用了之前生成的随机signal变量提取梅尔频谱,而不是加载得到的y变量,导致处理的不是目标音频数据。
  2. 标签拼接逻辑错误:y = np.empty((0,10))和label = np.array([1,0,0])维度不匹配,且未为每个增强样本生成对应标签。

解决办法

  1. 修改所有melspectrogram调用:将音频信号参数改为关键字参数y=传入
  2. 修复变量混淆问题:加载音频后,用正确的变量(加载得到的y或循环内的signal)提取频谱
  3. 修复标签拼接逻辑:统一标签维度,并为每个增强样本生成对应标签

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:27:58