Python新手运行CTL-MTNet遇FileNotFoundError问题咨询
解决CTL-MTNet中SAVEE/EMODB数据集的FileNotFoundError问题
这个错误的核心是代码预期的情感文件夹结构(比如angry)和你实际数据集的命名规则不匹配——SAVEE和EMODB都是通过文件名前缀/字符区分情感,而非按情感分类的文件夹。你有两种解决思路:
方案1:整理数据集为代码预期的文件夹结构
- 在你的数据集根目录下,创建代码中指定的情感文件夹(比如
angry、happy、neutral等,对应Utils.py里元组的内容) - 针对SAVEE数据集:
- 把所有文件名包含
a前缀的愤怒语音(比如a01、a02开头的文件)移动到angry文件夹 - 同理,将
h开头的文件移到happy,n开头移到neutral,按代码里的情感名称对应整理
- 把所有文件名包含
- 针对EMODB数据集:
- 把文件名最后一个字符为
A的愤怒语音(比如03a01A.wav这类)移动到angry文件夹 - 对应其他情感:
H→happy、N→neutral、S→sad、U→surprise、F→fear、D→disgust,分别归类到对应文件夹
- 把文件名最后一个字符为
方案2:修改Utils.py适配数据集命名规则(更推荐,无需改动原始数据)
这种方法不用移动文件,直接修改代码的情感识别逻辑:
- 找到Utils.py中定义情感文件夹的元组(比如类似
EMOTIONS = ('angry', 'happy', ...)的代码块) - 替换为按文件名解析情感的函数,示例如下:
# 解析SAVEE文件名的情感标签 def parse_savee_emotion(filename): # SAVEE文件名格式示例:DC_a01.wav,取下划线后第一个字符 code = filename.split('_')[1][0] code_map = { 'a': 'angry', 'h': 'happy', 'n': 'neutral', 'sa': 'sad', 'su': 'surprise', 'f': 'fear', 'd': 'disgust' } return code_map.get(code, 'unknown') # 解析EMODB文件名的情感标签 def parse_emodb_emotion(filename): # EMODB文件名格式示例:03a01A.wav,取文件名最后一个字符 code = filename.split('.')[0][-1] code_map = { 'A': 'angry', 'H': 'happy', 'N': 'neutral', 'S': 'sad', 'U': 'surprise', 'F': 'fear', 'D': 'disgust' } return code_map.get(code, 'unknown') - 找到代码中遍历文件夹读取文件的部分,改为遍历所有音频文件,调用上面的函数获取情感标签,替代原来按文件夹名称获取情感的逻辑
注意事项
- 确认代码中数据集的路径配置正确,避免因路径错误导致的文件找不到问题
- 如果代码有区分SAVEE和EMODB的逻辑,要确保对应的解析函数只对目标数据集生效,避免混淆
内容的提问来源于stack exchange,提问作者RMD
相关产品推荐
相关产品推荐

