跳到主要内容
SubtitleMatrix

SMI 转 TTML

格式转换SAMI(SMI)
或者粘贴字幕文本

这次转换会改变什么

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

  • 格式专有内容

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

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

SMI 转 TTML 把 SYNC 块变成 XML 里的 `<p begin="…" end="…">` 元素:时间是 `00:00:04.126`,多行用 `<br/>`,整份文档带 XML 声明。TTML 是广播与流媒体常用的结构化字幕格式。

时间轴无损:两边都能到毫秒,`Start=4126` 原样写成 `00:00:04.126`,不经过舍入。cue 按开始时间升序,原来乱序的文件会被纠正。

唯一的损失是格式私有内容:SAMI 的 `<STYLE>` CSS、`<TITLE>`、`Class=ENCC` 段落属性在 TTML 里没有对应结构,会被丢弃;行内强调保留在 `<p>` 的正文里。清屏块没有文字,不会生成空的 `<p>`。

产物是 UTF-8 XML,转换完全在浏览器里运行,不上传、不注册,适合受 NDA、病历或播出禁运约束的素材。批量拖入后逐条处理、可取消,结果打包下载。

示例

一份典型的 SMI 文件转成 TTML

输入

<SAMI>
<HEAD>
<STYLE TYPE="text/css">
<!--
P { text-align: center; font-family: Arial; }
.ENCC { Name: English; lang: en-US; }
-->
</STYLE>
</HEAD>
<BODY>
<SYNC Start=1000>
<P Class=ENCC>Hello there.
<SYNC Start=3000>
<P Class=ENCC>&nbsp;
<SYNC Start=3500>
<P Class=ENCC>How are you?<br>Fine, thanks.
<SYNC Start=6000>
<P Class=ENCC>&nbsp;
</BODY>
</SAMI>

输出

<?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:03.000">Hello there.</p>
<p begin="00:00:03.500" end="00:00:06.000">How are you?<br/>Fine, thanks.</p>  </body>
</tt>

产物只丢了格式私有内容;毫秒时间与两行分组都保留。

同一转换遇到一份脏文件

输入

<SAMI>
<HEAD>
<TITLE>Episode 1</TITLE>
<STYLE TYPE="text/css">
<!--
.ENCC { Name: English; }
-->
</STYLE>
</HEAD>
<BODY>
<sync start="00:00:02,500">
<P Class=ENCC>Line one<br>Line two
<sync start=9000>
<P Class=ENCC>Tom &amp; Jerry
<SYNC Start=12000>
<P Class=ENCC>&nbsp;
</BODY>
</SAMI>

输出

<?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:02.500" end="00:00:09.000">Line one<br/>Line two</p>
<p begin="00:00:09.000" end="00:00:12.000">Tom &amp; Jerry</p>  </body>
</tt>

真实文件常见的损坏:BOM、混合换行、无效的 Start、散落的文本。解析器不抛异常,读不出的部分记进有损说明。

常见问题

SMI 转 TTML 后,时间精度会变吗?

不会。两边都能到毫秒,`Start=4126` 写成 `begin="00:00:04.126"`,不经过舍入。

SMI 的 `<STYLE>` CSS 在 TTML 里能保留吗?

不能。`<STYLE>` 块、`<TITLE>` 与 `Class=ENCC` 都属于格式私有内容,TTML 产物里没有对应结构,会丢弃。

SMI 转 TTML 时,一条两行字幕怎么表示?

放在同一个 `<p>` 里,两行之间用 `<br/>`,因此仍是一条字幕。

SMI 转 TTML 的产物为什么有 XML 声明?

TTML 是 XML 文档,产物以 `<?xml version="1.0" encoding="UTF-8"?>` 开头,时间放在 `<p>` 的 `begin` 与 `end` 属性里。

SMI 转 TTML 会保留清屏块吗?

不会。`<P>&nbsp;` 没有文字,读取时作为清屏处理,不生成 `<p>` 元素。

SMI 转 TTML 输出什么编码?

UTF-8 XML,LF 换行、无 BOM;cue 按开始时间升序排列。

相关工具