跳到主要内容
SubtitleMatrix

VTT 转 SSA

格式转换WebVTT(VTT)
或者粘贴字幕文本

这次转换会改变什么

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

  • 精度

    时间精度——输出的时间刻度更粗,因此每个时间戳都会四舍五入到最接近的 10 毫秒

  • 格式专有内容

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

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

SSA 是 ASS 的前身,两者结构相近:`[Script Info]`、样式表、`[Events]` 里的 `Dialogue:` 行。把 WebVTT 转成 SSA,适合下游只认 SSA v4.00 的旧工具链。

正文、换行与 cue 顺序都保留,行内斜体写成 `{\i1}…{\i0}`。SSA 需要一张样式表,WebVTT 没有对应概念,所以这里补一份 Default 样式,每条字幕通过 `Dialogue:` 行引用它。`[Events]` 用 `Marked` 字段站在 SRT 序号的位置,这里写 0,因为 SSA 的排序与图层由时间码和图层字段决定。

唯一的时间代价是精度:SSA 只存到百分秒,`00:00:04.126` 会被取整成 `0:00:04.13`,每条最多挪 5 毫秒。除此之外,带不过去的是 WebVTT 的文档层——`WEBVTT` 头部与注释、`NOTE`/`STYLE`/`REGION` 块、cue 标识符、时间码后的 `align` 与 `position` setting。SSA 能表达定位和样式,但用的是它自己的覆写码与样式字段,这次转换不会替你猜一组映射。

cue 会按开始时间排序。整季文件一次拖入,串行处理、可取消、打包成 ZIP;转换在浏览器里完成,文件不上传。

示例

一份典型的 VTT 转成 SSA

输入

WEBVTT

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

00:00:04.500 --> 00:00:08.000 align:start position:10%
Second line with <i>italics</i>.

输出

[Script Info]
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
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello there.
Dialogue: 0,0:00:04.50,0:00:08.00,Default,,0,0,0,,Second line with {\i1}italics{\i0}.

这份产物丢掉了精度与格式私有内容;其余部分逐行一致。

同一转换遇到一份不规范但可读的输入

输入

a stray comment line
cue-id-1
00:00:01.000 --> 00:00:02.000
No header, two lines before the timecode.

输出

[Script Info]
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
Dialogue: 0,0:00:01.00,0:00:02.00,Default,,0,0,0,,No header, two lines before the timecode.

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

常见问题

VTT 转 SSA 时,时间码为什么会取整?

SSA 只存到百分之一秒,WebVTT 存到千分之一秒,所以 `00:00:04.126` 写成 `0:00:04.13`,每条最多挪 5 毫秒。顺序与时长都不拉伸,只是这一层取整无法避免。

VTT 转 SSA 后,Dialogue 行里的 Marked 字段是什么?

那是 SSA 里站 SRT 序号位置的一个字段。这个转换写 0,因为 SSA 的播放顺序由时间码与图层字段决定,不靠序号;SRT 则必须有一个数字计数器。

VTT 里两行的字幕转成 SSA 后怎么写?

用 `\N` 连接,写成一条 Dialogue 事件里的两行。归属关系保留,播放器会分两行显示;`\N` 是 SSA 写硬换行的方式。

VTT 的 NOTE、STYLE、REGION 块转成 SSA 后还在吗?

不在。这三类都是 WebVTT 独有的构造,SSA 没有对应段落,`align`、`position` 这类 cue setting 也一样。SSA 自己的样式表是补出来的 Default,不是从这些块翻译的。

VTT 转 SSA 后,斜体是怎么写进 Dialogue 的?

写成覆写码 `{\i1}斜体{\i0}`,包住那一段文字。粗体同理是 `{\b1}…{\b0}`。文字本身一个字符不改,只把行内标签换成了 SSA 的写法。

整季 VTT 一次转成 SSA 可以吗?

可以。文件一次拖入、串行处理、中途可取消,结束后打成一个 ZIP 下载。每份产物都带同样的 Default 样式表,要改版式就事后在字幕工具里统一改。

相关工具