跳到主要内容
SubtitleMatrix

SMI 字幕格式

格式转换SAMI(SMI)

这种格式能表达什么

文本样式
粗体与斜体
屏幕定位
是
卡拉 OK 计时
否
字幕条内换行
是
时间轴
每条字幕都有开始与结束时间
时间精度
1 毫秒
时间以帧号存储
否
从右到左的文字
是

示例

一份典型的 SAMI 文件,以及从中读出的内容

文件

<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>

从中读出了什么

2 cues, 3 lines of text

  Start=1000  =  00:00:01.000 → 00:00:03.000
    Hello there.
    [Class=ENCC]
  Start=3500  =  00:00:03.500 → 00:00:06.000
    How are you?
    Fine, thanks.
    [Class=ENCC]

Outside the cues:
  head       a <STYLE> block with CSS for the paragraphs, kept as it came in
  cue ends   the next <SYNC> tag — a SAMI file writes no end time of its own
  clearing   a <P>&nbsp; block blanks the screen; the two here are kept as clearing blocks, not turned into cues

右侧不是转换产物,而是本站从左栏文件里读出的内容,也是这个文件任何一次转换的起点。

一份别扭的 SAMI 文件,仍然能读出什么

文件

<SAMI>
<BODY>
<SYNC Start=abc>
<P Class=ENCC>this block's start cannot be read
<SYNC Start=2000>
<SYNC Start=4000>
<P>no attributes here<br>second line
<SYNC Start="6000">
some loose text before any P
</BODY>
</SAMI>

从中读出了什么

3 cues, 3 lines of text

  Start=2000  =  00:00:02.000 → 00:00:04.000
    (no text)
  Start=4000  =  00:00:04.000 → 00:00:06.000
    no attributes here
    second line
  Start=6000  =  00:00:06.000 → 00:00:08.000
    some loose text before any P

Outside the cues:
  head       no <STYLE> block and no <TITLE> — just the <SAMI> and <BODY> tags
  cue ends   the next <SYNC> tag; the last cue has none after it, so its end time was given a default
  loose text text between two <SYNC> tags that belongs to no <P> is kept and attached to the cue open at that point

Reported while reading — repaired or skipped, never silently:
  1 × SYNC blocks whose start time could not be read (they were skipped)
  1 × the last cue has no following timestamp, so its end time was generated

真实文件会带 BOM、Windows 换行、读不出开始时间的 SYNC、没有 start 的块;这些都不会抛错,读不出的部分会被报告,而不是静默丢弃。

把 SAMI (SMI) 转成其他格式

每一个都完全在你的浏览器里运行。标签标明了那个方向要付出什么代价,打开之前就能看到。

转换为此格式

SMI(SAMI,Microsoft Synchronized Accessible Media Interchange)是 RealPlayer 与 Windows Media Player 时代的字幕格式。它把字幕写成一段 HTML:每个 `<SYNC Start=1000>` 标签代表一个时刻,后面的 `<P Class=ENCC>` 块就是从那一刻起显示在屏幕上的文字。时间戳以毫秒为单位,`Start=4126` 就是 4.126 秒。

这一页是这个格式的说明书,不是转换器。上面的能力表把 SMI 能表达和不能表达的东西逐行列出:它能写行内粗体、斜体、下划线和颜色,也能在 `<STYLE>` 块里给段落写 CSS;但字号、描边、边距与卡拉OK逐字计时都不在文件里,而由播放器决定。表里写“否”的那一行,就是转成 SMI 时会丢掉的东西。

SMI 的结束时间不是显式字段:一条字幕的终点就是下一个 `<SYNC>` 的开始。`<P>&nbsp;` 这样的空段落常被用来清屏,读取时会认成清屏块,而不会当成一条有文字的字幕。语言轨靠 Class 名区分,常见的是 ENCC(英语)与 KRCC(韩语)。

下面 11 个方向每个都有自己的有损清单:SMI 转 SRT 丢样式与定位,转 ASS 或 SSA 还会丢毫秒精度,转 LRC 连结束时间一起丢,转 TXT 则连时间轴都不留。先看清单再选目标,比先选格式再发现丢了东西要好。

所有转换都在浏览器里完成,文件不上传、不需要注册;一次拖入整季文件会逐条串行处理,可以中途取消,最后打包成一个 ZIP 下载。

常见问题

SMI 文件里的 `<SYNC Start=…>` 和 `<P Class=…>` 分别表示什么?

SYNC 标记一个时刻,后面的段落从那一刻起显示到下一个 SYNC 出现;P 是那一刻的文字块,Class 指向 head 里的一条 CSS 规则,常见的是 ENCC(英语)或 KRCC(韩语)。

SMI 的结束时间是文件里写好的吗?

不是。SAMI 没有结束字段,一条字幕的终点就是下一个 `<SYNC>` 的开始;`<P>&nbsp;` 这样的空段落常被用来提前清屏。

SMI 能保存哪些样式?

行内的 `<b>`、`<i>`、`<u>`、`<font color="…">` 属于文字本身,能保存;字号、描边、边距与卡拉OK计时不在文件里,由播放器决定,head 的 `<STYLE>` 块只能提供 CSS。

SMI 的时间精度是多少?

毫秒。`Start=4126` 就是 4.126 秒,数值精确,不会像 ASS 那样只到百分秒。

SMI 转成哪种格式损失最小?

转 JSON 或 TTML 只丢格式私有内容;转 SRT、CSV、SBV 还会丢样式与定位;转 LRC 连结束时间一起丢。每一页自己的有损清单写了具体项。