JSON 转 SMI
或者粘贴字幕文本
这次转换会改变什么
有 2 项会被丢弃或需要你决定
- 样式
除粗体和斜体之外的全部样式(颜色、描边、阴影、边距)
- 卡拉 OK
卡拉OK计时(逐音节高亮)
这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。
JSON 转 SMI 写出的是一份 SAMI 文档:`<SYNC Start=…>` 标记每条字幕出现的毫秒时刻,正文放在下面的 `<P>` 里,末尾再用一个 `<P> ` 把屏幕清空。JSON 的整数毫秒直接写进 Start 属性,不损失精度。
行内强调能保留:粗体、斜体、下划线、颜色写成 `<b>`、`<i>`、`<u>`、`<font color>`,浏览器会按 HTML 解释。丢的是 JSON 的全局样式表——字体、字号、描边、阴影、边距都不在产物里,嵌入页用自己的 CSS 决定这些;卡拉OK的音节计时同样没有落点。
两行的 cue 用 `<br>` 连成一段,仍属同一条字幕。由于 SYNC 会替换屏幕上现有内容,每条字幕结束后都跟一个空白 `<P>`,这样下一条出现前不会残留上一行。
文件在浏览器里读写,不上传;整季可以一次拖入,串行处理并打包下载。
示例
一份典型的 JSON 文件转成 SMI
输入
{
"version": 1,
"title": "Fixture: typical",
"fps": 25,
"styles": {
"Default": {
"name": "Default",
"fontFamily": "Arial",
"fontSize": 20,
"primaryColor": "#FFFFFF",
"bold": false,
"italic": false
}
},
"generator": "subtitlematrix fixtures",
"cues": [
{
"id": "1",
"start": 0,
"end": 2000,
"lines": [
"Hello world.",
"Second line."
],
"style": "Default",
"position": {
"x": 100,
"y": 200,
"align": "center"
}
},
{
"id": "2",
"start": 2500,
"end": 4000,
"lines": [
"Plain line.",
{
"text": "Styled line.",
"tags": [
{
"kind": "italic",
"start": 0,
"end": 6
}
]
}
]
},
{
"id": "3",
"start": 4500,
"end": 6000,
"lines": [
"Roger: I am here."
],
"speaker": "Roger"
}
]
}
输出
<SAMI>
<HEAD>
<STYLE TYPE="text/css">
<!--
P { text-align: center; font-family: Arial, sans-serif; }
-->
</STYLE>
</HEAD>
<BODY>
<SYNC Start=0>
<P>Hello world.<br>Second line.
<SYNC Start=2000>
<P>
<SYNC Start=2500>
<P>Plain line.<br><i>Styled</i> line.
<SYNC Start=4000>
<P>
<SYNC Start=4500>
<P>Roger: I am here.
<SYNC Start=6000>
<P>
</BODY>
</SAMI>
这份产物丢掉了全局样式表和卡拉OK;毫秒时间、行内强调与换行都保留,每条字幕后面跟着清屏块。
同一转换遇到结构松散的 JSON
输入
[
{ "start": 0, "end": 1000, "lines": ["First."] },
{ "start": 1000, "end": 2000, "text": "Second." },
"not an object",
{ "start": 2000, "end": 3000, "lines": ["Third."], "class": "top" }
]
输出
<SAMI>
<HEAD>
<STYLE TYPE="text/css">
<!--
P { text-align: center; font-family: Arial, sans-serif; }
-->
</STYLE>
</HEAD>
<BODY>
<SYNC Start=0>
<P>First.
<SYNC Start=1000>
<P>
<SYNC Start=1000>
<P>Second.
<SYNC Start=2000>
<P>
<SYNC Start=2000>
<P>Third.
<SYNC Start=3000>
<P>
</BODY>
</SAMI>
真实文件常有混合换行、多余空白、空字段,也会混入非 cue 的数组元素。可以对照上面那份干净样例,看看解析器能容忍到什么程度。
常见问题
JSON 转 SMI 会保留哪些行内样式?
粗体、斜体、下划线和颜色会写成 `<b>`、`<i>`、`<u>`、`<font color>` 标签,嵌在 `<P>` 的正文里,浏览器会照常渲染。
JSON 转 SMI 的字体和字号去哪了?
被丢掉了。JSON 的 `styles` 表在 SMI 里没有等价字段,产物只带一段默认的 `P` 排版规则;嵌入字幕的页面用自己的 CSS 决定字体、字号、描边和边距。
JSON 转 SMI 的时间会舍入吗?
不会。JSON 的 4126 毫秒直接写成 `<SYNC Start=4126>`,SAMI 的时间就是毫秒整数,转换中没有精度损失。
JSON 转 SMI 的卡拉OK计时会保留吗?
不会。卡拉OK标记的是行内音节何时亮起,SMI 没有记录行内时刻的语法;音节文字保留,只会带上通用的 `<c>` 容器,不再有逐个点亮的时长。
JSON 转 SMI 时为什么每条字幕后面都有空白的 P?
因为 `<SYNC>` 会替换屏幕上现有的全部内容。转换器在每条字幕结束后写一个 `<P> ` 块,显式把屏幕清空,避免字幕在结束时间之后继续残留。
JSON 转 SMI 的输出用什么编码?
输出固定是 UTF-8、Unix 换行符、不带 BOM。输入 JSON 若是别的编码,会先解码并在结果面板里说明。