将 WebVTT(.vtt)转换为 Advanced SubStation Alpha
把一个 .vtt 字幕文件变成一条带样式的 .ass 字幕轨道,拥有规范的样式定义和百分之一秒精度的时间码,可直接用于需要 ASS 格式的播放器和编辑软件。全程无需上传。
你的文件绝不会接触任何服务器。 本页面的每一次转换都使用 JavaScript 的 FileReader API 在你的浏览器本地完成。不会上传、记录或存储任何内容。可安全用于机密的 Zoom/Teams 录制内容、未发布的视频、以及法律访谈记录。
VTT 转 ASS 的转换原理
WebVTT(.vtt)是为浏览器字幕而设计的格式:以一个 WEBVTT 头部开始,随后将字幕块表示为 HH:MM:SS.mmm --> HH:MM:SS.mmm 时间码范围,加上一两行文本,还可以附带字幕块设置或 <v 说话人> 语音标签。Advanced SubStation Alpha(.ass),这是 Aegisub、许多字幕组以及 MPV、VLC 等高级播放器使用的格式,结构则截然不同:一个 [Script Info] 头部、一个定义字体、颜色、轮廓和屏幕位置的 [V4+ Styles] 区块,以及一个逐行引用这些样式的 [Events] 区块。
SubToolDesk 的 VTT 转 ASS 转换器会在你的浏览器本地解析 WebVTT 字幕块,丢弃 WEBVTT 头部和任何语音标签,将每一个时间码转换为 ASS 的百分之一秒 H:MM:SS.cc 格式,并输出一个完整、有效的 .ass 文件,包含一个可用的 [Script Info] 区块、一个单一的Default样式,以及每个字幕块对应一行 Dialogue:。
如何将 VTT 转换为 ASS(分步说明)
- 将你的
.vtt文件拖到上方的转换器中,或点击「上传文件」来浏览选择。 - 检查自动检测到的格式徽章显示为 VTT。
- 如果你的源文件带有
<v 说话人>标签或行首的名称标签而你不想保留它们,打开去除说话人标签。 - 点击下载以保存一个有效的
.ass文件,文件名与你的原始文件一致。
为什么要把 VTT 转换成 ASS
一个 .vtt 字幕文件是为浏览器原生播放器设计的,不是为能渲染样式文本的编辑软件设计的。转换为 ASS 几乎总是因为目标播放器或编辑软件需要对这些文本做更多事情:
- 为字幕组制作卡拉OK式的时间效果:ASS 的逐音节覆盖标签是字幕组和动画发布组制作卡拉OK效果的标准方式,即使源字幕最初是作为浏览器导出的 WebVTT 轨道存在的。
- 在屏幕上为对话定位:ASS 可以通过边距和对齐覆盖,把一行字幕放置在画面的任意位置,这是对 WebVTT 自身的
align/position字幕块设置更灵活的替代方案,而本转换器不会自动保留这些设置。 - 为可访问性或风格添加带颜色或轮廓的文字:本转换器自动写入的带颜色、带轮廓的 Default 样式,在明亮或画面繁杂的视频上也能保持清晰可读,而普通的 WebVTT 文本无法保证这一点。
- Aegisub、MPV 和 VLC 工作流程:Aegisub 是专门围绕 ASS 格式构建的,MPV 和 VLC 都能渲染它的样式覆盖,因此从这些软件开始的项目需要的是 ASS,而不是浏览器字幕文件。
- 逐行的字体和大小覆盖:ASS 允许单独的 Dialogue 行在不改动基础样式的情况下覆盖字体、大小或颜色,这是 WebVTT 的字幕块设置无法表达的。
- 拥有一个可以继续构建的样式化基础文件:转换会先搭建好
[Script Info]、[V4+ Styles]和[Events]的结构,这样在 Aegisub 中剩下唯一要做的工作就是添加样式本身。
转换前后对比:一个真实示例
一段简短的两块 WebVTT 节选,包含一个字幕块设置、一个语音标签和一个斜体标签,在开启去除格式标签、关闭去除说话人标签(本页面的默认状态)的情况下进行转换:
WEBVTT 00:00:03.500 --> 00:00:06.120 align:start position:10% <v Jordan>谢谢大家今天加入这次通话。 00:00:06.500 --> 00:00:09.800 <v Priya><i>当然,我们开始吧。</i>
[Script Info] Title: SubToolDesk Export ScriptType: v4.00+ ... [V4+ Styles] Format: Name, Fontname, Fontsize, ... Style: Default,Arial,20,&H00FFFFFF,... [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:03.50,0:00:06.12,Default,,0,0,0,,Jordan: 谢谢大家今天加入这次通话。 Dialogue: 0,0:00:06.50,0:00:09.80,Default,,0,0,0,,Priya: 当然,我们开始吧。
WEBVTT 头部和 align:start position:10% 字幕块设置都消失了;本转换器没有与字幕块设置对应的 ASS 等效物,因此它们会被丢弃,而不是被转换。每个时间码都从 WebVTT 的句点分隔毫秒格式变成了 ASS 的句点分隔百分之一秒格式(00:00:03.500 变成了 0:00:03.50)。<i> 标签消失了,因为去除格式标签已开启。<v Jordan> 和 <v Priya> 语音标签也消失了,但因为去除说话人标签已关闭,每个名字都被保留并以Name:前缀的形式折叠进了对话文本,而不是被直接丢弃;由于没有单独的 ASS Name 字段可以把它移过去,那个字段保持为空。
生成的 .ass 文件包含什么内容
输出结果是一个完整、可直接用于播放器的 ASS 文件。它包括一个真正的 [Script Info] 区块、一个 [V4+ Styles] 区块,其中包含一个名为Default的样式(白色文字,带有细描边和阴影以便在视频上保持清晰可读,底部居中),以及一个 [Events] 区块,其中每个字幕块对应一行 Dialogue:。之后你可以在 Aegisub 中打开结果来调整字体、颜色或位置。
WebVTT 专属功能会发生什么
WebVTT 的字幕块设置(例如 align:start position:10%)和 <v 说话人姓名> 语音标签,在本转换器的输出中没有直接对应的 ASS 等效物;字幕块设置会被丢弃,语音标签则由去除说话人标签开关去除,这与本站其他每一个转换器的处理方式相同。如果你在 ASS 中需要同样的信息,它在那里会以不同的方式表达,通过逐行的 MarginL/MarginR/MarginV 覆盖或专门的样式,而这一步需要在你拥有基础文件之后手动完成。
为什么 ASS 中的时间码看起来不一样
WebVTT 以句点分隔符精确到毫秒(00:00:09.400);ASS 精确到百分之一秒,即一秒的百分之一,小时位不补零(0:00:09.40)。转换器会自动处理这种舍入,因此源文件中从 9.4 秒开始的字幕块,在输出结果中会落在正确的百分之一秒位置。
为什么人们会从 VTT 转向 ASS
- 字幕组和动画发布组,在这里 ASS 的样式和定位覆盖是事实标准,即使源字幕是以 WebVTT 格式导出的。
- 在 Aegisub 中工作的编辑人员,Aegisub 期望得到的是原生的 ASS 项目格式,而不是一个普通的 VTT 导入文件。
- 渲染样式覆盖的播放器和处理流程,例如 MPV 或某些流媒体编码器,在这些场合 WebVTT 的字幕块设置无法映射到 ASS 所提供的同等定位和字体控制。
- 从网页导出的字幕轨道开始制作带样式的字幕项目,使用这个转换器先得到一个结构有效的 ASS 文件,再手动添加样式。
架构层面的隐私保护,而非仅是政策承诺
解析 VTT 和写入 ASS 文件都是通过运行在你浏览器标签页中的 JavaScript 完成的。这项功能根本没有可供访问的上传接口,无论源文件是一份公开的 YouTube 字幕导出文件,还是一份机密的录音记录,这一点都同样重要。
这个转换器会保留什么、去除什么
会保留:
- 口语对话文本中的每一个字词,保持原有的顺序和标点。
- 每个字幕块的时间信息,从 WebVTT 的毫秒精度重新格式化为 ASS 的百分之一秒精度,且不会产生偏差。
- 每个源字幕块对应一行
Dialogue:,顺序与它们在 VTT 文件中出现的顺序相同。 - 当去除说话人标签关闭时,保留像
Jordan这样的语音标签名称,并将其折叠为对话文本的前缀。
会去除:
WEBVTT头部行,以及任何NOTE、STYLE或REGION区块。- 时间戳行上的字幕块设置,例如
align:start position:10%;在本转换器的输出中,ASS 没有直接对应的等效物。 - 开启去除格式标签后,去除
<i>、<b>、<u>之类的行内格式标签。 - 开启去除说话人标签后,连名字一起去除像
<v 说话人姓名>这样的语音标签。
常见问题及解决方法
- 输出中的对话文本里仍然有
<i>或<b>标签:打开去除格式标签;只有在你没有改动过它的情况下,它才会默认开启。 - 像
Jordan:这样的名字仍然粘在对话文本上:打开去除说话人标签;本页面中它默认是关闭的,所以语音标签中的名字会以文本前缀的形式原样保留,除非你主动开启它。 - 字幕块的定位或对齐方式似乎消失了:这是正常现象,WebVTT 的
align/position字幕块设置不会自动带入 ASS;如果需要,请在 Aegisub 中用边距或对齐覆盖重新创建这种定位。 - 在 Aegisub 中,每一行都以相同的字体、大小和颜色呈现:这是正常现象,本转换器只写入单一的 Default 样式;之后在 Aegisub 中打开文件来创建额外的样式或逐行覆盖。
- 转换后字幕看起来稍微不同步: ASS 只保存百分之一秒的精度,因此一个精确到毫秒的字幕块可能会偏移最多百分之一秒,这远低于可察觉的范围;如果偏差比这更大,请检查原始 VTT 的时间码。
- 带声调符号的字母或非英文文本显示为乱码,例如
é:说明源.vtt文件没有以 UTF-8 编码保存;请重新导出或以 UTF-8 重新保存后再上传。
这个工具有意不做的事情
它只写入一个 Default 样式,不会尝试猜测卡拉OK时间、按角色分配颜色或定位覆盖,这些需要在你拥有一个有效的基础文件之后,手动(或借助 Aegisub)完成。它也不会自动把 WebVTT 的字幕块设置转换为 ASS 的边距或对齐覆盖;这种映射并非一一对应,如果你需要,需要由你自己有意识地去应用。
常见问题
如何把 VTT 文件转换为 ASS?
将你的 .vtt 文件拖到上方的转换器中,或将其内容粘贴到左侧面板。一旦格式徽章确认为 VTT,点击下载。一个完整、有效的 .ass 文件会在你的浏览器中生成。
这个 ASS 文件能在 Aegisub、VLC 或 MPV 中正确打开吗?
可以。输出结果包含一个有效的 [Script Info] 头部、一个带有 Default 样式的 [V4+ Styles] 区块,以及一个带有格式正确的 Dialogue 行的 [Events] 区块,这正是这三者都需要的结构。
WebVTT 的语音标签和字幕块定位会发生什么?
像 <v 说话人姓名> 这样的语音标签会被去除说话人标签开关去除。字幕块定位设置(例如 align 或 position)不会自动带入;ASS 以不同的方式表达这种信息,通过样式和逐行的边距覆盖。
为什么 ASS 输出中的时间码看起来不一样?
ASS 使用百分之一秒精度,格式也与 WebVTT 的毫秒时间码不同(0:00:09.40,而不是 00:00:09.400)。转换器会自动处理这种转换。
进行这次转换时,我的字幕文件会被上传到任何地方吗?
不会。解析 VTT 和生成 ASS 文件完全在你浏览器的 JavaScript 引擎中进行。没有任何内容会发送到服务器。
YouTube 或 Vimeo 会接受 .ass 字幕文件吗?
不会。大多数上传表单,包括 YouTube 和 Vimeo,接受 SRT 或 VTT,不接受 ASS。为能渲染其样式的编辑软件和播放器(Aegisub、MPV、VLC)转换为 ASS,但为平台上传保留一份 VTT 或 SRT 版本。
ASS 比 VTT 更好吗,还是我应该直接坚持用 VTT?
这取决于你的需求。ASS 支持定位、卡拉OK时间,以及 VTT 的字幕块设置无法完全表达的逐行字体与颜色覆盖;而 VTT 是浏览器和 HTML5 <track> 元素实际要求使用的格式。当你的工作流程确实需要在像 Aegisub 或 MPV 这样的播放器中使用样式时,使用 ASS;网页播放则使用 VTT。