跳到主要内容
SubtitleMatrix

SMI 转 ASS

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

这次转换会改变什么

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

  • 精度

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

  • 格式专有内容

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

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

SMI 转 ASS:把 SAMI 的 SYNC 块变成 ASS 的 `Dialogue:` 行。读入时按 SYNC 起点切分,下一条 SYNC 的起点就是上一条的终点;正文里的 `<br>` 变成换行,`<P>` 里的行内强调按 ASS 的覆盖码保留。

这一对的代价是精度与格式私有内容。SMI 写到毫秒(`Start=4126`),ASS 只写到百分秒(`0:00:04.13`),所有时间码四舍五入到 10 毫秒,单条最多移动 5 毫秒,不会拉伸或重排。`<STYLE>` 块、`<TITLE>`、`Class=ENCC` 这类段落标记没有落点,会被丢弃。

行内强调仍然可用:SMI 写在 `<P>` 里的粗体、斜体、下划线与颜色,会映射成 ASS 覆盖码;两条 SMI 行合成一条 ASS cue 时用 `\N` 连接。产物按开始时间升序排列,原文件乱序会被纠正。

输出固定为 UTF-8、LF 换行、无 BOM;进来的 UTF-16 或 Windows 单字节文件会先解码。转换全程在浏览器里,不上传、不注册;整季文件可以一次拖入,串行处理后可取消,最后打包成 ZIP。

示例

一份典型的 SMI 文件转成 ASS

输入

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

输出

[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:03.00,Default,,0,0,0,,Hello there.
Dialogue: 0,0:00:03.50,0:00:06.00,Default,,0,0,0,,How are you?\NFine, thanks.

产物丢了毫秒精度与格式私有内容;其余部分逐行一致。

同一转换遇到一份脏文件

输入

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

输出

[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:02.50,0:00:09.00,Default,,0,0,0,,Line one\NLine two
Dialogue: 0,0:00:09.00,0:00:12.00,Default,,0,0,0,,Tom &amp; Jerry

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

常见问题

SMI 转 ASS 时,毫秒时间码会怎么处理?

ASS 只写到百分秒,所以 `Start=4126` 会四舍五入成 `0:00:04.13`;单条最多移动 5 毫秒,不拉伸也不重排。

SMI 转 ASS 后,`<STYLE>` 块和 `Class=ENCC` 还在吗?

不在。ASS 存的是 cue 而不是一份 HTML 文档,`<STYLE>` CSS、`<TITLE>` 和段落上的 Class 标记都没有落点,会被丢弃。

SMI 里的粗体和颜色在 ASS 产物里保得住吗?

能。写在 `<P>` 正文里的 `<b>`、`<i>`、`<u>`、`<font color>` 会映射成 ASS 覆盖码;丢的是文件级样式表,不是行内强调。

SMI 的一条两行字幕转成 ASS 是什么样子?

仍然是同一条 cue,两行之间用 `\N` 连接,播放器会把它们一起显示。

SMI 转 ASS 会改变字幕顺序吗?

如果原文件乱序,会按开始时间升序重排;原本有序的文件顺序不变。这是结构修正,不改变文字内容。

SMI 转 ASS 的输出是什么编码?

固定 UTF-8、LF 换行、无 BOM;输入的 UTF-16 或 Windows 单字节文件会先解码,结果面板会提示发生过解码。

相关工具