跳到主要内容
SubtitleMatrix

VTT 转 ASS

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

这次转换会改变什么

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

  • 精度

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

  • 格式专有内容

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

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

这一页把 WebVTT 转成 ASS。多数情况是下游流程只认 ASS:本地播放器、字幕特效、压制工具都按 ASS 的样式表与事件行走。整份转换在浏览器里完成,文件不上传,也不需要注册。

两种格式在正文、换行和 cue 顺序上是一致的,所以产物就是同一批字幕换了一种更重的写法。有两处差异值得在动手前知道。ASS 只存到百分秒,`00:00:01.234` 必须写成 `0:00:01.23`,每个时间码取整到最近的 10 毫秒,最多挪 5 毫秒——上方有损说明会先讲清楚,而不是让你在拿它和视频对齐时才发现。ASS 还需要一张样式表,WebVTT 没有对应概念,所以这里会替你补一份 Default 样式:Arial、字号 20、黑描边,之后用任何字幕工具都能改。

带不过来的是 WebVTT 放在 cue 之外的东西:头部那行 `WEBVTT` 与它的注释、`NOTE`/`STYLE`/`REGION` 块,以及时间码后面的 setting,比如 `align:start` 或 `position:10%`。ASS 确实能定位,但要把覆写码写进正文——`\an7` 是左上,`\pos(320,240)` 是精确坐标——这次转换不会替你猜一个落点,而是如实记为丢失。文件加载后,列表旁边还会说清这份文件里到底有几处。

脏文件也能读:缺头部、Windows 换行、时间码前多一行、带 BOM,都不会报错。一次拖进整季文件也可以,队列按顺序串行处理,中途能停,最后打包成一个 ZIP 下载。

示例

一份典型的 VTT 转成 ASS

输入

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, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Events]
Format: Layer, 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, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Events]
Format: Layer, 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 转 ASS 时,毫秒为什么变成了百分秒?

ASS 只存到百分之一秒,WebVTT 存到千分之一秒。所以 `00:00:01.234` 会写成 `0:00:01.23`,每个时间码最多挪 5 毫秒。看视频时察觉不到,但拿这份文件和另一份逐帧对齐时就能看出来。

VTT 转 ASS 后的样式表是从哪来的?

是补出来的。没有样式表的 ASS 文件放不了,所以产物里写了一条名为 Default 的样式:Arial、字号 20、白字黑描边,每条 Dialogue 都指向它。想换成自己的版式,事后在字幕工具里改;重跑这一页会覆盖你的改动。

VTT 时间码后面的 align:start 和 position:10% 到 ASS 里去了吗?

没有。ASS 的定位要靠正文里的覆写码(`\an7`、`\pos(320,240)`),与 WebVTT 的 setting 不是一一对应的关系,这次转换不会猜着映射,而是把 setting 记为丢失。需要精确摆放,得在 ASS 里手工补。

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

都不在。这三类都是 WebVTT 独有的构造,ASS 没有对应段落。其中 STYLE 最值得留意——它可能装着整份文件的版式规则,而不只是一句注释;需要的话得在 ASS 的样式表里重建。

VTT 里的 <i> 斜体在 ASS 产物里怎么写?

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

整季 VTT 能一起转成 ASS 吗?

能。多个文件一次拖入,队列串行处理,中途可以取消,结束后所有 ASS 文件打成一个 ZIP 下载。整个过程在浏览器里跑,脚本不会离开本机。

相关工具