SSA 转 TTML
或者粘贴字幕文本
这次转换会改变什么
有 2 项会被丢弃或需要你决定
- 卡拉 OK
卡拉OK计时(逐音节高亮)
- 格式专有内容
源格式保留在字幕条之外的内容(非字幕块、文件头文字、单条字幕的设置、被注释掉的事件)——目标格式没有地方存放它们
这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。
这一页把 SSA 转成 TTML。TTML 是 XML,每条字幕是一个 <p> 元素,起止写在 begin 与 end 属性里;转换在浏览器里完成,不上传。
这个方向的损失最少:只有卡拉OK 与脚本私有内容没有落点。片段级的强调会变成 TTML 的内联样式——斜体写成 <span tts:fontStyle="italic">,粗体写 tts:fontWeight="bold",下划线写 tts:textDecoration="underline",颜色也有对应属性。样式表里的字体、字号、描边与边距则会丢掉,因为本站只写这一层能读回来的属性。
时间轴精确。SSA 只到百分秒,0:00:04.13 写成 00:00:04.130,补零而不四舍五入;一条 2.9 秒的字幕仍然是 2.9 秒。两行的字幕留在同一个 <p> 里,中间用 <br/>。
产物是一份带 XML 声明、tt 根元素与 body 的文档,按起始时间升序,UTF-8、Unix 换行、无 BOM。[Script Info](包括标题)、Comment: 行与内嵌字体图形都不会出现。可以批量拖入整季,串行完成后打包下载。
示例
一份典型的 SSA 文件转成 TTML
输入
[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
输出
<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling">
<body>
<p begin="00:00:01.000" end="00:00:04.000">Hello there.</p>
<p begin="00:00:05.000" end="00:00:08.000"><span tts:fontStyle="italic">Italic</span> line.</p>
<p begin="00:00:09.000" end="00:00:12.000">Two<br/>lines</p> </body>
</tt>
这份产物丢掉了卡拉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.输出
<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling">
<body>
<p begin="00:00:01.000" end="00:00:04.000"><span tts:fontWeight="bold">Bold</span> and <span tts:textDecoration="underline">underlined</span>.</p>
<p begin="00:00:05.000" end="00:00:08.000">A soft<br/>break and a {\p1}mystery{\p0} code.</p> </body>
</tt>
真实文件里常见的损坏:混合换行、散落的空白、留空的字段。可以对照上面那份干净样例,看看解析器能容忍到什么程度。
常见问题
SSA 转 TTML 后,粗体和斜体写成了什么?
写成了 TTML 的内联样式:斜体是 <span tts:fontStyle="italic">,粗体是 tts:fontWeight="bold",下划线是 tts:textDecoration="underline"。样式表里的字体、字号、描边与边距则不会过去。
SSA 转 TTML 后,卡拉OK 计时还在吗?
不在。\k、\kf、\ko 标记的是每个音节什么时候亮,TTML 的 <p> 记不了一行内部的时刻;标记被去掉,音节作为普通文字留下。
SSA 转 TTML 的时间值需要四舍五入吗?
不需要。SSA 只到百分秒,0:00:04.13 写成 00:00:04.130,补零而不舍入;两边的时刻完全相同,2.9 秒仍然是 2.9 秒。
SSA 转 TTML 后,一条两行字幕怎么放?
放在同一个 <p> 里,两行之间用 <br/>,这是 TTML 的硬换行写法;仍然是一条字幕,播放器会一起显示。
SSA 转 TTML 后,[Script Info] 和标题呢?
都会丢。只有 Dialogue: 行变成 <p>;[Script Info](包括标题)、样式表、Comment: 行,以及 [Fonts]/[Graphics] 里内嵌的内容都没有落点。
SSA 转 TTML 会按起始时间排序吗?
会,最早的 <p> 在前。TTML 按文档顺序读,CSV 那种乱序文件在转换时会被整理成升序,这是对结构的整理而不是内容改动。