pytorch-kaldi运行TIMIT教程报错shared_list[0] IndexError:列表索引越界
报错根因说明
你遇到的IndexError: list index out of range直接原因是read_lab_fea函数执行异常,没有向shared_list写入任何返回数据,你排查到的fea_dict与lab_dict无公共元素是根本诱因,本质是特征和标签的utterance ID完全不匹配,导致没有有效样本被加载。
解决步骤
1. 校验配置文件路径正确性
- 确认
TIMIT_MLP_mfcc_basic.cfg中[dataset]模块下的feat_scp、lab_folder两个路径,完全匹配Kaldirun.sh执行完成后生成的特征scp文件、标签文件夹的实际绝对路径,重点排查路径拼写、大小写、层级错误,比如是否多写/漏写了TIMIT数据集根目录层级。 - 确认
feat_scp对应的scp文件非空,lab_folder目录下存在至少上百个标签文件,排除路径指空的低级错误。
2. 验证特征与标签ID匹配性
- 从特征scp文件中随便选取前3个utterance ID,执行命令
grep "选取的ID" 你的lab_folder路径/*,如果找不到对应标签文件,说明ID格式不匹配:Kaldi默认生成的utterance ID是「说话人编号_句子编号」格式,如果你的标签文件命名只有句子编号,就会完全匹配不上。 - 出现ID不匹配问题时,回到Kaldi TIMIT脚本目录,删除之前生成的
data/train、data/test目录,重新执行local/timit_data_prep.sh数据预处理步骤,确保特征提取和标签生成用的是同一套utterance列表,没有中途修改样本过滤规则。
3. 显式捕获数据读取错误
临时修改你贴出的报错代码段,替换多线程逻辑为单线程直接调用,打印具体报错信息:
# ***** Reading the Data******** if processed_first: #Reading all the features and labels for this chunk shared_list = [] # 临时注释多线程逻辑,改为直接调用捕获异常 # p = threading.Thread(target=read_lab_fea, args=(cfg_file, is_production, shared_list, output_folder)) # p.start() # p.join() try: read_lab_fea(cfg_file, is_production, shared_list, output_folder) except Exception as e: print(f"数据读取函数执行错误:{e}") import traceback traceback.print_exc() exit() data_name = shared_list[0] data_end_index = shared_list[1] fea_dict = shared_list[2] lab_dict = shared_list[3] arch_dict = shared_list[4] data_set = shared_list[5]
运行后可以直接看到是特征读取失败、标签读取失败还是样本过滤逻辑把所有样本都过滤了,不用靠空列表推断问题。
4. 校验标签配置一致性
确认cfg文件[labels]模块下的lab_count参数和你使用的TIMIT标签类别数匹配:TIMIT标准可选61类、48类、39类映射规则,如果之前修改过Kaldi的标签映射脚本,要同步修改这个参数,否则不匹配类别的标签会被全部过滤,导致lab_dict为空。
内容的提问来源于stack exchange,提问作者user2956920
相关产品推荐
相关产品推荐

