使用librosa、sklearn训练语音情绪识别模型单元测试报IndexError如何解决
问题根因
- 索引越界报错核心原因是测试用音频文件名和训练集命名规则不匹配:你训练阶段使用的是RAVDESS这类标准情绪音频数据集,文件名遵循
{标识位}-{标识位}-{情绪编码}-xxx.wav的规则,用-拆分后列表长度至少为3,取下标为2的元素可以拿到情绪编码。但你测试用的what.wav拆分后得到的列表是['what', 'wav'],长度只有2,调用[2]取第三个元素自然触发索引越界。 - 测试代码还有两个隐性错误:一是提取特征时调用的
file变量未定义,你只写了文件路径没有赋值给file变量,后续会报变量未定义错误;二是continue只能用在循环体中,你这段测试代码没有外层循环,运行到continue会触发语法错误。
修复方案
场景1:测试音频为带标注、符合训练集命名规则的文件
直接替换测试段代码即可:
a,b = [],[] # 先定义完整测试文件路径 test_file = "data/what.wav" file_name = os.path.basename(test_file) # 先做规则校验避免索引越界 name_parts = file_name.split("-") if len(name_parts) >=3 and name_parts[2] in emotions: emotion = emotions[name_parts[2]] if emotion in observed_emotions: feature = extract_feature(test_file, mfcc=True, chroma=True, mel=True) a.append(feature) b.append(emotion) # 输出测试结果 if a: y_pred = model.predict(a) print(f"预测情绪:{y_pred[0]},实际标注情绪:{b[0]}")
场景2:测试音频为无标注的任意文件
不需要走标注读取逻辑,直接提取特征做预测即可:
test_file = "data/what.wav" # 直接提取音频特征 feature = extract_feature(test_file, mfcc=True, chroma=True, mel=True) # 模型预测情绪 pred_emotion = model.predict([feature])[0] print(f"该音频预测情绪为:{pred_emotion}")
兼容优化(可选)
如果运行时报melspectrogram() takes 0 positional arguments but 2 were given错误,是因为新版本librosa不再支持位置传参,把extract_feature函数中mel特征提取行修改为关键字传参即可:
mel=np.mean(librosa.feature.melspectrogram(y=X, sr=sample_rate).T,axis=0)
内容的提问来源于stack exchange,提问作者Deepak Kumar
相关产品推荐
相关产品推荐

