跳到主要内容
SubtitleMatrix

JSON 转 TTML

或者粘贴字幕文本

这次转换会改变什么

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

  • 卡拉 OK

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

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

JSON 转 TTML 的产物是一份 XML:每条字幕是一个 `<p>`,`begin` 与 `end` 用毫秒精度的时间码,正文可以带 `<br/>` 换行和 `<span tts:fontStyle>` 之类的行内样式。JSON 的整数毫秒直接写成 `00:00:04.126`,不经过舍入。

这一页只有一项损失:卡拉OK。JSON 用音节 span 记录每个字什么时候亮起,TTML 的时间模型里没有“行内某一刻”的落点,所以标记去掉、音节保留为普通文本。

样式表(字体、字号、颜色、描边、边距)与屏幕定位在 TTML 里都能表达,因此不会出现在有损列表里。两行的 cue 用 `<br/>` 分开,仍是一个 `<p>`;条目按起始时间升序输出。

队列可以一次处理整季,结果打包成 ZIP;解析与写 XML 都在浏览器里,文件不上传。

示例

一份典型的 JSON 文件转成 TTML

输入

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

输出

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling">
  <body>
<p begin="00:00:00.000" end="00:00:02.000">Hello world.<br/>Second line.</p>
<p begin="00:00:02.500" end="00:00:04.000">Plain line.<br/><span tts:fontStyle="italic">Styled</span> line.</p>
<p begin="00:00:04.500" end="00:00:06.000">Roger: I am here.</p>  </body>
</tt>

这份产物只丢掉卡拉OK计时;毫秒时间、样式与换行都写进了 XML。

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

输入

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

输出

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling">
  <body>
<p begin="00:00:00.000" end="00:00:01.000">First.</p>
<p begin="00:00:01.000" end="00:00:02.000">Second.</p>
<p begin="00:00:02.000" end="00:00:03.000">Third.</p>  </body>
</tt>

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

常见问题

JSON 转 TTML 会丢掉什么?

只丢卡拉OK计时。样式表、行内样式、屏幕定位、毫秒时间与多行结构在 TTML 里都有对应的写法,不会进入有损列表。

JSON 转 TTML 的卡拉OK计时去哪了?

被去掉了。卡拉OK标记的是行内音节何时亮起,TTML 没有记录行内时刻的语法;音节文字保留下来,但不再有逐个点亮的时长。

JSON 转 TTML 的时间是毫秒精确的吗?

是。JSON 的 4126 写成 `00:00:04.126`,两边分辨率都是毫秒,转换中没有舍入或平移。

JSON 转 TTML 时两行字幕怎么表示?

用 `<br/>` 分开,两行仍在同一个 `<p>` 元素里。这样它们仍是一条字幕,播放器会一起显示。

JSON 转 TTML 会保留样式和定位吗?

会。TTML 的样式属性与区域模型能承载 JSON 的样式表和 cue 坐标,所以有损说明里没有这两项。

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

输出固定是 UTF-8、Unix 换行符、不带 BOM,XML 声明里也写着 UTF-8。输入 JSON 若是别的编码,会先解码。

相关工具