跳到主要内容
SubtitleMatrix

SRT 转 JSON

格式转换SubRip(SRT)
或者粘贴字幕文本

这次转换会改变什么

这个方向不会丢失内容 —— 源格式的每一项特性在目标格式里都有地方可去。

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

这一页把字幕变成结构化数据:一份 JSON 文档,逐条列出 cue 的起止时间与文本。适合交给脚本、做 diff,或者放进版本库。

schema 是本站自有的,刻意做小:一个版本号加一个 cues 数组,时间用整数毫秒而不是时间码。最细的精度是一毫秒,整数不会因为逗号或点的书写约定被读错。没有格式的行是普通字符串;带斜体、粗体或颜色的行变成对象,文本之外还有一个 tags 数组,每个标签记录类型与覆盖的字符区间。

把这个文件转回去能拿回字幕,所以往返本身就是一次校验。它不依赖第三方库,也没有隐藏元数据;整个方向不丢信息。

多个文件可以一次拖入,队列串行处理、随时可取消,结果打包成 ZIP;转换在浏览器里完成,文件不上传。一条两行字幕仍在同一条 cue 的 lines 数组里,两个元素属于同一条字幕;cue 的 id 按顺序生成,读回时不需要它。输出统一为 UTF-8、Unix 换行、无 BOM。

示例

一份典型的 SRT 文件转成 JSON

输入

1
00:00:01,000 --> 00:00:03,500
Hello there.

2
00:00:03,500 --> 00:00:06,000
<i>Whispering</i> now.
And a second line.

3
00:00:06,000 --> 00:00:09,250
<b>Bold</b> statement.

输出

{
  "version": 1,
  "cues": [
    {
      "id": "1",
      "start": 1000,
      "end": 3500,
      "lines": [
        "Hello there."
      ]
    },
    {
      "id": "2",
      "start": 3500,
      "end": 6000,
      "lines": [
        {
          "text": "Whispering now.",
          "tags": [
            {
              "kind": "italic",
              "start": 0,
              "end": 10
            }
          ]
        },
        "And a second line."
      ]
    },
    {
      "id": "3",
      "start": 6000,
      "end": 9250,
      "lines": [
        {
          "text": "Bold statement.",
          "tags": [
            {
              "kind": "bold",
              "start": 0,
              "end": 4
            }
          ]
        }
      ]
    }
  ]
}

这个方向没有丢东西:时间、文本与行内标签都能从 JSON 还原。

同一转换遇到一份脏文件

输入

1
0:00:01,00 --> 0:00:03,500
<B>Bold</B> and <I>italic</I>.


2
00:00:03,500 --> 00:00:06,000


3
00:00:08,000 --> 00:00:09,000
Last one.

输出

{
  "version": 1,
  "cues": [
    {
      "id": "1",
      "start": 1000,
      "end": 3500,
      "lines": [
        {
          "text": "Bold and italic.",
          "tags": [
            {
              "kind": "bold",
              "start": 0,
              "end": 4
            },
            {
              "kind": "italic",
              "start": 9,
              "end": 15
            }
          ]
        }
      ]
    },
    {
      "id": "2",
      "start": 3500,
      "end": 6000,
      "lines": []
    },
    {
      "id": "3",
      "start": 8000,
      "end": 9000,
      "lines": [
        "Last one."
      ]
    }
  ]
}

空行、混合换行与多余空白不会改变 schema;可疑条目被修复或记进有损说明,产物仍是合法 JSON。

常见问题

SRT 转 JSON 用的是什么 schema?

本站自有的小 schema:一个版本号加一个 cues 数组,每条 cue 有 id、start、end(整数毫秒)与 lines。不依赖第三方库,也没有隐藏字段。

SRT 转 JSON 为什么用毫秒而不是时间码?

整数毫秒可以直接比较、排序和相加,不需要先解析字符串;逗号或点的书写约定也就不会把时间读错。

SRT 转 JSON 后斜体字怎么表示?

带格式的行变成对象,包含 text 与 tags 数组;每个 tag 记录类型和它在文本里覆盖的起始、结束位置。

SRT 转 JSON 后还能转回字幕吗?

能。把 JSON 转回 SRT 或其它格式时,时间与格式标签都会还原,往返本身可以用来检查文件有没有改坏。

SRT 转 JSON 会保留字幕顺序吗?

会,按起始时间升序。原文件乱序时,产物是排好序的数组。

SRT 转 JSON 的文件能直接交给脚本用吗?

可以。读 cues 数组,把 start 与 end 当数字用,行是字符串或带 text 字段的对象,不需要额外解析器。

相关工具