본문으로 바로 가기
SubtitleMatrix

TTML을 JSON으로 변환

형식 변환TTML / DFXP
또는 자막 텍스트를 붙여넣으세요

이 변환에서 달라지는 것

1가지가 버려지거나 결정이 필요합니다

  • 형식 고유 내용

    원본 형식이 자막 블록 밖에 두는 내용(자막 블록이 아닌 구획, 머리말 텍스트, 자막 블록별 설정, 주석 처리된 이벤트) — 대상 형식에는 들어갈 자리가 없습니다

이 목록은 불러온 특정 파일이 아니라 두 형식의 기능 행렬에서 나옵니다. 어떤 파일은 형식이 허용하지만 행렬이 모델링하지 않는 기능을 쓰고 있다면 더 많이 잃을 수 있습니다.

TTML을 JSON으로 옮기면 시간과 글자, 문단 안 강조가 구조화된 필드로 그대로 살아남습니다. 다만 TTML 문서 머리가 선언한 스타일·레이아웃 표는 JSON의 styles 객체로 번역되지 않으므로 결과에서 빈 객체로 보입니다.

TTML은 begin과 end에 00:00:04.126을 적고, dur나 1.5s, 00:00:07:00 같은 프레임 표기도 받아들입니다. JSON은 같은 순간을 4126이라는 밀리초 정수로 적습니다. 두 값은 정확히 같고 반올림이 없습니다.

잃는 것은 형식 고유 정보 한 가지입니다. XML 선언, 네임스페이스, <styling>, <layout>, <metadata>, <p>의 style·region 참조는 JSON에 대응하는 자리가 없습니다. 반면 <span>으로 준 기울임·색은 각 줄의 tags 배열에 들어가고, 두 줄 자막은 lines 배열의 두 항목이 됩니다.

여러 파일을 한 번에 넣으면 대기열이 차례로 변환하고 결과를 ZIP 하나로 묶어 줍니다. 처리는 모두 브라우저 안에서 이루어지며 원본 파일은 서버로 전송되지 않습니다.

예시

일반적인 TTML 파일을 JSON으로 변환

입력

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling" xml:lang="en">
  <head>
    <styling>
      <style xml:id="s1" tts:color="#FFFF00" tts:fontWeight="bold"/>
    </styling>
    <layout>
      <region xml:id="bottom" tts:origin="10% 80%" tts:extent="80% 20%"/>
    </layout>
  </head>
  <body>
    <div>
      <p begin="00:00:01.000" end="00:00:03.500" region="bottom" style="s1">Hello <span tts:fontStyle="italic">there</span>.</p>
      <p begin="00:00:03.500" end="00:00:06.000" region="bottom">How are you?<br/>Fine, thanks.</p>
    </div>
  </body>
</tt>

결과물

{
  "version": 1,
  "cues": [
    {
      "start": 1000,
      "end": 3500,
      "lines": [
        {
          "text": "Hello there.",
          "tags": [
            {
              "kind": "italic",
              "start": 6,
              "end": 11
            }
          ]
        }
      ]
    },
    {
      "start": 3500,
      "end": 6000,
      "lines": [
        "How are you?",
        "Fine, thanks."
      ]
    }
  ]
}

이 결과에서 사라지는 것: 형식 고유 정보. 나머지는 줄 단위로 같습니다.

까다로운 입력에 같은 변환 적용

입력

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling"
    xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
    ttp:frameRate="25" xml:lang="en">
  <body>
    <div>
      <p begin="1.5s" dur="2s">Loaded from an offset and a duration.</p>
      <p begin="4s" end="00:00:06.50">A coarser clock spelling.</p>
      <p begin="00:00:07:00" end="00:00:08:12">Frames, at 25fps.</p>
      <p begin="9s"><span tts:color="#FF0000">Half-open</span> and Tom &amp; Jerry.</p>
    </div>
  </body>
</tt>

결과물

{
  "version": 1,
  "cues": [
    {
      "start": 1500,
      "end": 3500,
      "lines": [
        "Loaded from an offset and a duration."
      ]
    },
    {
      "start": 4000,
      "end": 6500,
      "lines": [
        "A coarser clock spelling."
      ]
    },
    {
      "start": 7000,
      "end": 8480,
      "lines": [
        "Frames, at 25fps."
      ]
    },
    {
      "start": 9000,
      "end": 11000,
      "lines": [
        {
          "text": "Half-open and Tom &amp; Jerry.",
          "tags": [
            {
              "kind": "color",
              "start": 0,
              "end": 9,
              "value": "#FF0000"
            }
          ]
        }
      ]
    }
  ]
}

실제 파일에서 흔한 손상입니다. 줄 바꿈이 섞이고, 공백이 남고, 빈 필드가 있습니다. 위의 깔끔한 예시와 비교해 파서가 무엇을 넘겨주는지 보세요.

자주 묻는 질문

TTML의 <styling>·<layout> 표는 JSON에서 어떻게 되나요?

JSON 출력에는 styles 객체와 줄마다 tags 배열이 있지만, TTML 머리말의 표는 그 styles 객체로 번역되지 않습니다. 그래서 XML 선언, 네임스페이스, 이름 있는 스타일과 영역, metadata, <p>의 style·region 참조는 버려지고 styles는 빈 채로 나옵니다. 문단 안쪽 span의 강조는 줄의 일부이므로 tags 배열에 들어갑니다.

TTML을 JSON으로 바꾸면 결과가 어떻게 생겼나요?

id, start, end를 각자 가진 cue 객체의 배열입니다. TTML의 cue 하나가 JSON의 cue 하나가 되고, 순서와 글자는 같습니다. 시각은 4126 같은 밀리초 정수로 적힙니다.

TTML 시간값은 JSON에서 정확한가요?

밀리초까지 정확합니다. TTML의 00:00:04.126은 JSON의 4126이 되고, 두 형식 모두 그보다 더 잘게 나누지 않습니다. 반올림이나 이동이 없어 2.9초짜리 자막은 그대로 2.9초입니다.

두 줄짜리 TTML 자막은 JSON에서 어떻게 되나요?

cue의 lines 배열에 두 항목으로 들어갑니다. 두 줄이 같은 자막이라는 사실은 유지되며, 다시 자막 형식으로 바꿔도 한 cue로 읽힙니다.

TTML cue 순서는 JSON에서도 유지되나요?

유지되고, 변환 과정에서 시작 시간이 이른 순서로 정렬됩니다. 원본 TTML이 cue를 뒤섞어 두었다면 JSON 쪽에서 순서가 바로잡히며, 이는 내용이 아니라 구조를 바꾸는 일입니다.

JSON을 다시 TTML로 바꾸면 무엇을 잃나요?

노래방 타이밍을 잃습니다. JSON은 음절이 언제 켜지는지 담지만 TTML은 cue의 시작과 끝만 기록하므로, 되돌리는 방향에서는 그 표시가 사라집니다. 이 방향에서 잃은 머리말 정보는 JSON에 기록이 없어 복원되지 않습니다.

관련 도구