Перейти к основному содержимому
SubtitleMatrix

Формат субтитров JSON

Что умеет этот формат

Оформление текста
Шрифты, цвет, обводка, тень
Положение на экране
Да
Тайминг караоке
Да
Переносы строк внутри реплики
Да
Таймлайн
Начало и конец для каждой реплики
Точность тайминга
1 мс
Тайминг хранится в номерах кадров
Нет
Текст справа налево
Да

Примеры

Типичный файл JSON и то, что сайт из него читает

Файл

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

Что в нём

3 cues, 5 lines of text

  0 ms → 2000 ms
    Hello world.
    Second line.
    [Default; position 100,200 (center)]
  2500 ms → 4000 ms
    Plain line.
    Styled line.   [italic ×1]
  4500 ms → 6000 ms
    Roger: I am here.
    [speaker Roger]

Outside the cues:
  styles     Default
  other keys version, title, fps, generator — carried through untouched

Правая колонка — не результат конвертации, а то, что сайт извлекает из левого файла: реплики, интервалы, оформление и всё, что осталось за пределами реплик.

Неаккуратный файл JSON: что всё равно читается

Файл

{
    "cues": [
        { "start": "0:00:01,5", "end": "0:00:03,0", "text": "Unpadded timecode." },
        { "start": 4000.5, "end": 5000, "lines": ["Fractional start.", { "text": "Second.", "tags": [] }] },
        { "start": 9000, "end": 8000, "lines": ["End before start."] },
        { "start": "nope", "end": 12000, "lines": ["No readable start."] },
        { "start": 13000, "lines": ["No end at all."] }
    ],
    "generator": "subtitlematrix boundary",
    "styles": {},
    "title": "Fixture: boundary"
}

Что в нём

3 cues, 4 lines of text

  1500 ms → 3000 ms
    Unpadded timecode.
  4001 ms → 5000 ms
    Fractional start.
    Second.
  9000 ms → 9001 ms
    End before start.

Outside the cues:
  other keys generator, title — carried through untouched

Reported while reading — repaired or skipped, never silently:
  2 × entries with no readable start and end time (they are not cues, so they were skipped)
  1 × cue times that were not whole milliseconds (they were rounded to the nearest millisecond)
  1 × cues whose end time was not after their start time (they were given a 1ms duration)

Второй файл намеренно неаккуратный: BOM, смешанные переводы строк и пустые поля. Сайт всё равно дочитывает его до конца, а пропущенные фрагменты перечисляет в отчёте.

Конвертировать SubtitleMatrix JSON в другой формат

Каждая страница работает целиком в вашем браузере. Подписи говорят, чего стоит это направление, ещё до того, как вы его откроете.

JSON → MICRODVD в браузере. Потери: стили, позиции, караоке, fps.
  • Оформление
  • Позиционирование
  • Караоке
  • Частота кадров
JSON → TXT в браузере. Потери: тайминг, стили, позиции, караоке, переносы.
  • Тайминг
  • Оформление
  • Позиционирование
  • Караоке
  • Переносы строк

Конвертация в этот формат

JSON — внутренний формат сайта, который хранит полную модель субтитров. Внутри файла — объект с версией и массивом cues, где у каждой реплики есть id, start, end и lines; время записывается как "start": 1000, то есть целые миллисекунды в полях start и end.

JSON хранит полную внутреннюю модель: время в миллисекундах, строки, теги, стили, позицию и караоке — больше, чем любой другой формат сайта. Ни один байт субтитров не уходит в сеть, а очередь можно остановить в любой момент.

Частые вопросы

Что хранит JSON помимо текста реплик?

Структура JSON: объект с версией и массивом cues, где у каждой реплики есть id, start, end и lines. Дополнительно: вне реплик — только объект styles и meta. Оформление — все возможности внутренней модели: стили, позиция, караоке и теги в строке.

Как JSON записывает начало и конец реплики?

JSON пишет время как "start": 1000 (целые миллисекунды в полях start и end). Полный интервал выглядит так: "start": 1000, "end": 3500.

Насколько богатое оформление поддерживает JSON?

Оформление JSON — все возможности внутренней модели: стили, позиция, караоке и теги в строке. Сильнее всего это заметно при сравнении с ASS: там есть шрифт, цвет, обводка, тень и караоке, а JSON такие поля либо не хранит, либо записывает упрощённо.

Что теряется при переводе JSON в более простой формат?

При переводе JSON в более простые форматы теряется ровно то, чего целевой формат не умеет: оформление, позиция, караоке или концы реплик.

Можно ли перевести JSON в другие форматы в браузере?

Да: на сайте открыто 11 направлений перевода из JSON — в SRT, VTT, ASS, SSA, SBV, SMI, LRC, MicroDVD, TTML, TXT, CSV. Файл разбирается и записывается в текущей вкладке, не отправляется на сервер, а пакет можно скачать одним архивом.

Как JSON читает повреждённый файл?

JSON требует корректного синтаксиса: битый файл не читается частично, зато нечитаемые поля пропускаются с записью в отчёт, а не подменяются догадками.