跳到主要内容
SubtitleMatrix

SSA 转 VTT

格式转换SubStation Alpha(SSA)
或者粘贴字幕文本

这次转换会改变什么

有 4 项会被丢弃或需要你决定

  • 样式

    除粗体和斜体之外的全部样式(颜色、描边、阴影、边距)

  • 定位

    屏幕定位(每条字幕条都会回到默认位置)

  • 卡拉 OK

    卡拉OK计时(逐音节高亮)

  • 格式专有内容

    源格式保留在字幕条之外的内容(非字幕块、文件头文字、单条字幕的设置、被注释掉的事件)——目标格式没有地方存放它们

这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。

这一页把 SSA 转成 WebVTT,也就是网页 <track> 用的字幕格式;转换在浏览器里完成,文件不上传。

片段级的强调会保留成 VTT 里的标签:粗体 <b>、斜体 <i>、下划线 <u>、颜色 <font color="…">,浏览器会照着渲染。样式表里的全局设置则过不去——字体、字号、描边、阴影和边距都没有落点,嵌入字幕的页面用自己的 CSS 决定外观。屏幕定位和卡拉OK 也丢:\pos、\an、\move 与 \k 系列指令在离开 SSA 时被去掉。

还有一类东西是 VTT 装不下的:SSA 在 cue 列表之外保存的内容,包括 [Script Info],以及内嵌播放器所需字体与图片的 [Fonts] 和 [Graphics] 段。这些不会以任何形式出现在产物里。

时间轴精确。SSA 的 0:00:04.13 写成 00:00:04.130,补零而不四舍五入;两行的字幕仍然在同一条 cue 里,产物按起始时间升序,UTF-8、Unix 换行、无 BOM,可以批量转换后打包下载。

示例

一份典型的 SSA 文件转成 VTT

输入

[Script Info]
Title: Example SSA
ScriptType: v4.00
Collisions: Normal

[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,1,2,2,2,10,10,10,0,1

[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: Marked=0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello there.
Dialogue: Marked=0,0:00:05.00,0:00:08.00,Default,,0,0,0,,{\i1}Italic{\i0} line.
Dialogue: Marked=0,0:00:09.00,0:00:12.00,Default,,0,0,0,,Two\Nlines

输出

WEBVTT

00:00:01.000 --> 00:00:04.000
Hello there.

00:00:05.000 --> 00:00:08.000
<i>Italic</i> line.

00:00:09.000 --> 00:00:12.000
Two
lines

这份产物丢掉了样式表、定位、卡拉OK 与脚本内容;强调标签与时间轴保留。

同一转换遇到一份脏文件

输入

[Script Info]
Title: Dirty SSA
ScriptType: v4.00

[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,1,2,2,2,10,10,10,0,1

[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Comment: Marked=0,0:00:00.00,0:00:01.00,Default,,0,0,0,,not a subtitle
Dialogue: Marked=0,0:00:01.00,0:00:04.00,Default,,0,0,0,,{\b1}Bold{\b0} and {\u1}underlined{\u0}.
Dialogue: Marked=0,0:00:05.00,0:00:08.00,Default,,0,0,0,,A soft\nbreak and a {\p1}mystery{\p0} code.

输出

WEBVTT

00:00:01.000 --> 00:00:04.000
<b>Bold</b> and <u>underlined</u>.

00:00:05.000 --> 00:00:08.000
A soft
break and a {\p1}mystery{\p0} code.

真实文件里常见的损坏:混合换行、散落的空白、留空的字段。可以对照上面那份干净样例,看看解析器能容忍到什么程度。

常见问题

SSA 转 VTT 后,粗体和斜体怎么保留?

写成 VTT 正文里的标签:<b>、<i>、<u>,颜色写成 <font color="…">。这些是片段级格式,VTT 装得下;样式表里的字体、字号、描边、阴影和边距则没有落点。

SSA 转 VTT 后,[Script Info] 和 [Fonts] 段去哪了?

都不会出现。VTT 只保存 cue 与文件头,SSA 在 cue 列表之外保存的 [Script Info]、[Fonts]、[Graphics] 以及 Comment: 行都没有落点,会被报告为格式私有内容的损失。

SSA 转 VTT 后,屏幕定位还在吗?

不在。\pos、\an、\move 在离开 SSA 时就被丢掉,每条字幕回到播放器的默认位置;VTT 没有能表达 SSA 坐标的字段。

SSA 转 VTT 后,卡拉OK 计时还能保留吗?

不能。\k、\kf、\ko 标记的是每个音节什么时候亮,VTT 记不了一行内部的时刻;标记被去掉,音节作为普通文字留下。

SSA 转 VTT 后,时间码会变吗?

数值不变。SSA 的 0:00:04.13 写成 00:00:04.130,补零而不四舍五入;起止时间与原来同一时刻,2.9 秒仍然是 2.9 秒。

SSA 转 VTT 后,一条两行字幕怎么放?

放进同一条 cue,两行上下排列;播放器会一起显示,不会拆开。VTT 的 cue 标识行是可选的,产物不一定给每条编号。

相关工具