跳到主要内容
SubtitleMatrix

JSON 转 ASS

或者粘贴字幕文本

这次转换会改变什么

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

  • 精度

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

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

这一页把本站的 JSON 字幕文档写成 ASS 脚本。JSON 用整数毫秒记录每条字幕的起止,例如 4126 表示 4.126 秒;ASS 的时间码只到百分秒,写作 `0:00:04.13`。因此转换会把每个边界舍入到最近的 10 毫秒:单条最多移动 5 毫秒,先后顺序不变,时间轴也不会被拉伸。

JSON 的样式、屏幕定位和卡拉OK都能在 ASS 里找到落点。`styles` 表写进 `[V4+ Styles]`,字体、字号、主色和粗斜体落在 Style 行;带坐标的 cue 输出为带 `{\pos(x,y)}` 前缀的 Dialogue 行;一条 cue 的多行正文用 `\N` 连成一条。

解析接受两种 JSON 形状:本站写出的“版本号 + cues 数组”,以及直接由 cue 对象组成的数组。每条 cue 只要 start、end 和文本齐全就能读;读不出来的条目会被跳过或修复并计数,不会让整份文件失败。

与转 SRT 的方向相比,这一边只丢一项:时间精度。其余内容(样式表、行内斜体粗体、定位)在 ASS 里都有对应写法,不会被压平。有损列表在文件框上方,打开文件之前就能看到这一项。

一个文件可以,一整季也可以:队列按顺序串行处理,结束的产物打包成一个 ZIP 下载。全部在浏览器里完成,文件不会上传。

示例

一份典型的 JSON 文件转成 ASS

输入

{
  "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"
    }
  ]
}

输出

[Script Info]
Title: Fixture: typical
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,,,,0,0,,,,,,,,,,,,,,

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:02.00,Default,,0,0,0,,{\pos(100,200)}Hello world.\NSecond line.
Dialogue: 0,0:00:02.50,0:00:04.00,Default,,0,0,0,,Plain line.\N{\i1}Styled{\i0} line.
Dialogue: 0,0:00:04.50,0:00:06.00,Default,,0,0,0,,Roger: I am here.

这份产物只丢精度;其余内容与源文件逐行对应。

同一转换遇到结构松散的 JSON

输入

[
    { "start": 0, "end": 1000, "lines": ["First."] },
    { "start": 1000, "end": 2000, "text": "Second." },
    "not an object",
    { "start": 2000, "end": 3000, "lines": ["Third."], "class": "top" }
]

输出

[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:00.00,0:00:01.00,Default,,0,0,0,,First.
Dialogue: 0,0:00:01.00,0:00:02.00,Default,,0,0,0,,Second.
Dialogue: 0,0:00:02.00,0:00:03.00,Default,,0,0,0,,Third.

真实文件常有混合换行、多余空白、空字段,也会混入非 cue 的数组元素。可以对照上面那份干净样例,看看解析器能容忍到什么程度。

常见问题

JSON 转 ASS 后,毫秒级时间戳会变成什么?

ASS 的时间只到百分秒,所以 4126 毫秒会写成 `0:00:04.13`,舍入到最近的 10 毫秒。单条字幕的边界最多移动 5 毫秒,顺序不变;如果把这份 ASS 与另一份文件逐帧比对,这里是唯一不精确的地方。

JSON 转 ASS 时,屏幕定位会保留吗?

会。JSON 里带坐标的 cue 在 ASS 里写成 `{\pos(x,y)}` 前缀,位置随脚本交给播放器。这也是它和 JSON 转 SRT 的关键差别之一。

JSON 转 ASS 支持哪几种 JSON 文件结构?

两种:本站写出的“版本号 + cues 数组”,以及文件本身就是 cue 数组的形式。每条 cue 需要 start、end 和文本,其余键会被忽略而不是报错。

JSON 转 ASS 时一条两行的字幕怎么输出?

写成一条 Dialogue,两行之间用 `\N` 连接,这是 ASS 的硬换行写法。两行仍属于同一条字幕,播放器会一起显示。

JSON 转 ASS 会把样式表里的字体和颜色带过去吗?

会。`styles` 对象里的每种样式输出成一行 Style,字体、字号、主色、粗体和斜体都有对应字段。JSON 里没有的字段留空,由播放器或后续编辑补齐。

JSON 转 ASS 的输出用什么编码?

输出固定是 UTF-8、Unix 换行符、不带 BOM,与输入 JSON 原来的编码无关。输入若是 UTF-16 或 Windows 单字节编码,会先解码,结果面板会说明这一点。

相关工具