把频道 3 年字幕导成本地索引,我踩到的编码坑
频道运营三年,攒了 800 多条视频,字幕文件一直散在后台。想做个本地搜索,方便查旧选题和观众提问。环境是 macOS + Python 3.11,数据量不大,但格式乱得超出预期。
我的做法分三步:先用 yt-dlp 拉字幕,只下自动生成的英文和中文,命令如下:
yt-dlp --write-auto-sub --sub-format vtt --skip-download \
--output "subs/%(id)s.%(ext)s" \
"https://www.youtube.com/playlist?list=PLxxxx"
拉下来发现 vtt 文件里混着 WEBVTT 头、时间轴和重复的行,还有 align:start position:0% 这种样式标记。直接扔进 SQLite 的 FTS5 会全带进去。我先写了个清洗脚本,用正则去掉时间轴和标签,再按行去重:
import re
from pathlib import Path
def clean_vtt(text):
lines = text.splitlines()
out = []
for line in lines:
if '-->' in line or line.strip() == 'WEBVTT' or not line.strip():
continue
line = re.sub(r'<[^>]+>', '', line)
line = re.sub(r'align:start position:0%', '', line)
if out and out[-1] == line.strip():
continue
out.append(line.strip())
return '\n'.join(out)
清洗完再灌进 FTS5,建表时用 tokenize='unicode61',中文能分词但效果一般,英文没问题。代价是清洗会丢掉一些换行信息,导致长句粘连,搜索时得用 NEAR 而不是短语匹配。
失效的地方:自动字幕没有标点,句子边界全靠时间轴,去重后容易把不同人的话拼一起;另外 yt-dlp 拉取时如果视频有地区限制,会静默跳过,得加 --ignore-errors 并记日志。我一开始没加,结果少了 30 多条,后来手动补的。
你们在清洗自动字幕时,怎么处理没有标点的长句?有没有更稳的断句办法?
0
赞同度 100% · 0 条评论 · 7 阅读
0 条评论
还没有评论,写下第一条。