如何从 SRT 或 VTT 字幕文件中提取纯文本
从字幕文件中提取纯对话文本听起来很简单,直到你遇到序号、时间码,以及被截断在句子中间的情况。本文介绍正确的做法。
字幕文件把三种信息交织在一起:序号、时间范围,以及实际的文字内容。如果你只想要文字(用于博客引用、文章、搜索索引,或者输入到另一个工具里),时间码和编号就只是需要去掉的噪音。
手动处理的方法,以及它会在哪里出问题
用一个匹配时间码行的正则表达式(\d{2}:\d{2}:\d{2}[,.]\d{3}\s*-->\s*...)做查找替换,可以处理明显的情况。但在以下情况会出问题:
- 看起来像文字的序号。 单独一行的
42可能是 cue 序号,也有极少数情况下是对话内容本身(比如角色念出一个数字)。简单粗暴的清除方式在规模化处理时无法可靠区分这两种情况。 - 被拆分到多个 cue 的句子。 字幕是按屏幕可读性切分的(大约每几秒一行),而不是按语法切分的。一句话经常会跨越两到三个连续的 cue。只去掉时间码行而不把这些片段重新拼接起来,结果就是一堆断断续续、互不相连的句子碎片,而不是流畅的文字。
- 行内格式标签。
<i>、<b>,以及 VTT 的说话人/颜色标签(<v Speaker>、<c.colorname>)也需要去掉,否则它们会以尖括号文字的形式原样出现在输出里。 - 换行符不统一。 从不同工具或操作系统导出的文件,有时会混用
\r\n和\n,这会破坏只假设其中一种的正则表达式。
好的提取结果应该是什么样子
正确提取出来的文本读起来就像正常的文章:完整的句子,在自然停顿处分段,没有多余的数字或时间码残留,没有留下任何标签。目标是让这份文档读起来就像有人直接把对话转录下来一样,完全看不出它原本是字幕格式。
不用手动清理也能做到
我们的SRT 转 TXT 转换器(以及对应的VTT 转 TXT 转换器)会自动完成这一切:去掉序号和时间码,去掉标签,把被拆分到多个 cue 的句子重新拼接成连贯的段落。整个过程完全在你的浏览器里运行,文件内容不会上传到任何地方。