把频道 3 年字幕导成本地索引,我踩到的编码坑

手上有个讲嵌入式的小频道,订阅不到两万,三年下来 214 个视频。我想做一件事:把每期视频的字幕全导下来,本地建个索引,写脚本时按关键词查自己以前讲过什么,省得重复讲同一个概念。环境是 Win11 + Python 3.11,网络走代理,字幕源用 yt-dlp 拉自动字幕,数据量不大,214 个 vtt 加起来 6MB 左右。

第一步直接批量拉:

yt-dlp --skip-download --write-auto-subs --sub-langs "zh-Hans,en" \
  --sub-format vtt -o "subs/%(id)s.%(ext)s" \
  --batch-file urls.txt

拉完先别急着解析。我第一版直接 open(f).read() 就崩了,报 UnicodeDecodeError。原因是自动字幕里混了 BOM 和零宽字符,个别文件还是 UTF-16。稳妥写法是先探编码再读:

import codecs
raw = open(p, 'rb').read()
for enc in ('utf-8-sig', 'utf-16', 'utf-8'):
    try:
        text = raw.decode(enc); break
    except UnicodeDecodeError:
        continue
text = text.replace('\u200b', '').replace('\ufeff', '')

解析 vtt 时还有个坑:自动字幕是滚动式的,同一句话会以「追加」形式重复出现好几遍,时间轴还重叠。我一开始按行切,索引里全是重复片段。后来改成按时间戳块聚合并去重,只保留每条 cue 的文本,重叠的用集合去重,索引体积直接掉了一半。

为什么这么折腾:自动字幕的准确率大概八成多,专有名词错得离谱,比如把「中断」听成「中段」。所以我没有把它当逐字稿用,只当检索入口——命中后回原视频对时间点。代价是索引里噪音不少,得靠人工扫一眼,不能全自动出结论。

哪里会失效:一是没开自动字幕的视频直接拉不到,得手动补;二是纯音乐或方言重的期数,字幕质量差到没法用;三是 yt-dlp 版本旧了会拿不到某些新格式字幕,我升级过一次才好。另外别把字幕文件提交到公开仓库,里面可能带作者水印信息。

现在的问题是:你们做本地字幕检索时,是按 cue 粒度存还是整段合并存?我目前按 cue 存,查询结果碎,想听听别人怎么权衡的。

0
赞同度 100% · 0 条评论 · 8 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。