跳到主要内容
SubtitleMatrix

JSON 转 LRC

或者粘贴字幕文本

这次转换会改变什么

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

  • 时间

    字幕条的结束时间(输出格式只记录字幕条何时开始)

  • 样式

    全部样式(粗体、斜体、颜色、描边、阴影)

  • 定位

    屏幕定位(每条字幕条都会回到默认位置)

  • 卡拉 OK

    卡拉OK计时(逐音节高亮)

  • 精度

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

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

JSON 转 LRC 把字幕变成歌词行:每条 cue 的起始时间写成 `[mm:ss.cc]`,正文跟在方括号后面。LRC 只记“这一行什么时候开始”,没有结束时间字段,所以每条 cue 的 end 都在这一步被丢掉,由下一行的开始时间接管。

时间精度从毫秒降到百分秒:4126 写成 `[00:04.13]`,舍入到最近的 10 毫秒,单条最多偏 5 毫秒。产物按起始时间升序排列;一条两行的 cue 会写成两行时间戳相同的歌词,表示它们属于同一句。

样式、屏幕定位和卡拉OK都没有落点:`styles` 表、行内标签、坐标与音节计时全部去掉,音节文字保留为普通文本。JSON 文档的 title 会写成 `[ti:…]` 元数据行,这是 JSON 在 LRC 里少数还能保留的额外信息。

批量队列与本机处理照旧:文件不离开浏览器,多个结果一起打包下载。

示例

一份典型的 JSON 文件转成 LRC

输入

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

输出

[ti:Fixture: typical]
[00:00.00]Hello world.
[00:00.00]Second line.
[00:02.50]Plain line.
[00:02.50]Styled line.
[00:04.50]Roger: I am here.

这份产物丢掉了结束时间、样式、定位、卡拉OK和毫秒精度;标题写成了 `[ti:]` 元数据。

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

输入

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

输出

[00:00.00]First.
[00:01.00]Second.
[00:02.00]Third.

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

常见问题

JSON 转 LRC 后,每条字幕的结束时间去哪了?

被丢掉了。LRC 只记录一行开始的时间,播放器会让这一行一直显示到下一行开始,所以结束时间是推导出来的,不需要写进文件。每条 JSON cue 的 start 原样保留。

JSON 转 LRC 的时间戳会被舍入吗?

会。LRC 只到百分秒,4126 毫秒写成 `[00:04.13]`,舍入到最近的 10 毫秒,最多偏 5 毫秒;顺序和时长关系都不会被拉伸。

JSON 转 LRC 会保留粗体、斜体和颜色吗?

不会。LRC 只存裸文本,行内标签和 `styles` 表都没有落点,每一行都按普通文字写出;文字本身不变。

JSON 转 LRC 的卡拉OK计时还能用吗?

不能。卡拉OK标记的是行内音节何时亮起,LRC 没有记录“行内某一刻”的语法,标记会被去掉,音节作为普通歌词文本保留。

JSON 转 LRC 时两行一条的字幕怎么表示?

写成两行带相同时间戳的歌词,例如两行都以 `[00:02.50]` 开头。这是 LRC 表示“这两行属于同一句”的方式。

JSON 里的 title 在 LRC 产物里放在哪?

写成 `[ti:标题]` 元数据行,通常排在文件最前面。示例里的 `Fixture: typical` 就输出为 `[ti:Fixture: typical]`。

相关工具