运行Common Voice处理Python脚本出现UnicodeDecodeError问题求助
错误根因定位
该UnicodeDecodeError和pydub音频转换逻辑无关,报错发生在脚本读取TSV文本元数据的阶段,核心触发原因如下:
- Python在Windows环境下以文本模式打开文件时,未显式指定编码会默认调用系统本地charmap编码做解码,这类编码无法覆盖Common Voice数据集内包含的多语言特殊字符。
- Common Voice数据集的所有TSV元数据文件统一采用UTF-8编码存储,当脚本用本地默认编码读取时,遇到无映射的字节(本次报错中的0x81)就会直接抛出解码异常。
- 脚本本身存在多处编码相关疏漏:两次打开TSV元数据文件时未指定UTF-8编码,后续写入JSON文件时同样未指定编码,且
json.dumps默认开启ASCII转义,会导致多语言文本被转为不可读的转义序列。
针对性修复步骤
- 修正所有TSV文件的读取逻辑,在
open()调用中显式增加encoding='utf-8'参数:- 统计TSV总行数的读取代码,同时修正原代码里的变量拼写错误(原代码将line写为ine):
with open(file_path, encoding='utf-8') as f: lenght = sum(1 for line in f)- 读取CSV内容的读取代码:
with open(file_path, newline='', encoding='utf-8') as csvfile: - 修正所有JSON文件的写入逻辑,避免Windows环境下再次触发编码错误:
- 所有写入JSON的
open()调用增加encoding='utf-8'参数 - 调用
json.dumps时增加ensure_ascii=False参数,保证多语言文本可以正常写入,不被转义为不可读的ASCII编码序列
- 所有写入JSON的
- 修复脚本传参的隐性bug:
parse_known_args()返回值为「解析得到的参数命名空间、未识别的参数列表」组成的二元组,原代码直接将整个元组传给main()函数时,访问args.convert属性会直接报错,需要修改为:args, _ = parser.parse_known_args() - 清理冗余代码:原代码中提前单独
open(train.json)/open(test.json)的操作属于无意义冗余,且会造成文件句柄泄漏,可直接删除,仅保留with上下文管理器的写入逻辑即可。
内容的提问来源于stack exchange,提问作者user15309583
相关产品推荐
相关产品推荐

