把频道 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 条评论

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

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