본문으로 바로 가기
SubtitleMatrix

TTML 자막 형식 안내

형식 변환TTML / DFXP

이 형식이 표현할 수 있는 것

텍스트 스타일
글꼴, 색, 외곽선, 그림자
화면 위치 지정
예
가라오케 타이밍
아니요
자막 블록 안의 줄 바꿈
예
시간축
모든 자막 블록의 시작과 종료 시간
타이밍 해상도
1 ms
시간을 프레임 번호로 저장
아니요
오른쪽에서 왼쪽으로 쓰는 텍스트
예

예시

일반적인 TTML 파일과 그 파일에서 읽어 낸 것

파일

<?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>

담긴 내용

2 cues, 3 lines of text

  00:00:01.000 → 00:00:03.500
    Hello there.   [italic ×1]
    [region="bottom" style="s1"]
  00:00:03.500 → 00:00:06.000
    How are you?
    Fine, thanks.
    [region="bottom"]

Outside the cues:
  prolog     an XML declaration and the namespace bindings, kept as they came in
  styling    1 × <style> — "s1", the colour and weight a paragraph points at by name
  layout     1 × <region> — "bottom", the origin and extent a paragraph points at by name
  resolved   the head is kept as it was written and is not applied here — a paragraph's style="s1" region="bottom" stays an attribute, not a colour or a screen position

오른쪽은 변환된 파일이 아니라 이 사이트가 왼쪽 파일에서 읽어 낸 내용이며, 그 파일을 변환할 때 모든 방향이 출발하는 지점입니다.

까다로운 TTML 파일과 그래도 읽어 낸 것

파일

<?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>
    <div begin="00:00:01.000" end="00:00:05.000">
      <p>Inherits its timing from the div, which we do not resolve.</p>
      <p begin="00:00:06.000" end="00:00:07.000">This one has its own timing.</p>
    </div>
    <!-- <p begin="00:00:08.000" end="00:00:09.000">commented out</p> -->
    <div>
      <p begin="00:00:10.000"/>
      <p begin="00:00:11.000" end="00:00:12.000">Last one.</p>
    </div>
  </body>
</tt>

담긴 내용

3 cues, 2 lines of text

  00:00:06.000 → 00:00:07.000
    This one has its own timing.
  00:00:10.000 → 00:00:12.000
    (no text)
  00:00:11.000 → 00:00:12.000
    Last one.

Outside the cues:
  prolog     an XML declaration and the namespace bindings, kept as they came in
  head       none — no <styling> and no <layout>, and no paragraph points at one either
  comments   the commented-out <p> stays a comment, in the place it was written
  divs       the timings on an enclosing <div> are not pushed down onto the paragraphs inside it

Reported while reading — repaired or skipped, never silently:
  1 × paragraphs with no readable begin time of their own (they were skipped — see the note about timing inherited from an enclosing div)
  1 × paragraphs with neither an end time nor a duration of their own (their end times were generated)

실제 파일에는 BOM, Windows 줄 바꿈, 타임코드 앞의 엉뚱한 줄, 아예 읽을 수 없는 타임코드가 들어 있습니다. 그래도 예외를 던지지 않고, 이해하지 못한 것은 조용히 버리지 않고 보고합니다.

TTML (Timed Text) → 다른 형식으로 변환

각 페이지는 전부 브라우저 안에서 실행됩니다. 라벨은 그 방향에서 무엇을 잃는지 미리 알려 줍니다.

이 형식으로 변환하기

TTML은 방송과 스트리밍에서 쓰는 XML 기반 자막 형식입니다. 이 페이지는 TTML이 무엇을 담을 수 있고 무엇은 담지 못하는지, 그리고 여기서 TTML로 또는 TTML에서 변환할 수 있는 모든 형식을 정리한 참고 페이지입니다.

TTML은 head에 이름 있는 스타일과 영역을 선언하고, body의 <p> 요소가 실제 자막이 됩니다. begin과 end는 00:00:04.126처럼 밀리초까지 적으며 dur, 1.5s, 프레임 표기도 읽습니다. 스타일과 화면 위치는 지원하지만 음절 단위 노래방 타이밍은 담지 않습니다.

위 표가 전부이며 숨은 기능 목록은 없습니다. 어떤 행이 아니오라면 TTML로 변환할 때 정확히 그만큼 잃는다는 뜻이고, 아래 변환 페이지마다 파일을 열기 전에 같은 내용을 알려 줍니다. 노래방 타이밍을 담지 못하는 점이 TTML의 가장 큰 제약입니다.

모든 변환은 브라우저 안에서 실행됩니다. 업로드도 계정도 필요 없어서 비밀 유지 계약이 걸린 자료, 환자 기록, 방송 금지 시점의 자료도 기기 밖으로 나가지 않습니다.

자주 묻는 질문

TTML 파일이란 무엇인가요?

확장자 .ttml은 방송과 스트리밍 업계가 자막을 적는 XML 기반 timed text 형식입니다. <head>가 이름 있는 스타일과 영역을 선언하고 <p> 요소가 자막 하나하나가 됩니다. 스트리밍 자막 파이프라인이 이 형식을 쓰며 SMPTE-TT와 IMSC 프로파일도 TTML 위에 만들어졌습니다.

TTML은 스타일을 저장하나요?

저장하며 다른 형식보다 많이 담습니다. 글꼴, 크기, 색, 외곽선, 여백을 정하는 스타일 표와 문단 안쪽의 서식 코드가 있어 이름 있는 스타일 없이도 한 줄을 굵고 색 있게 배치할 수 있습니다. 다만 음절이 언제 켜지는지 적는 노래방 타이밍은 담지 않습니다. 여기서 두 표는 <head>의 <styling>과 <layout>이고, <p>는 style과 region 속성으로 그것을 이름으로 가리킵니다.

TTML cue마다 시작과 끝이 모두 있나요?

그렇습니다. TTML에서 한 순간은 00:00:04.126처럼 적히고 밀리초까지 정확합니다. cue가 짧든 길든, 다음 cue와 겹치든 형식이 따로 제약을 걸지 않습니다. dur나 1.5s 같은 다른 표기도 읽어서 같은 시계 값으로 환산합니다.

TTML은 어떤 형식으로 변환해야 하나요?

TTML이 담는 모든 것을 그대로 받는 형식은 이 사이트에 없으므로 공짜 방향은 없습니다. 각 변환 페이지가 자기 손실 목록을 제시하니, 가장 자주 쓰는 형식이 아니라 그 목록을 감당할 수 있는지로 대상을 고르세요.

TTML 파일은 cue 밖에 무엇을 담나요?

XML 선언과 <head> 전체를 담습니다. 이름 있는 스타일 표(<styling>), 이름 있는 영역 표(<layout>), <metadata>가 여기 들어가고 각 <p>가 그것을 이름으로 참조합니다. 그래서 한 항목만 고쳐도 모든 자막의 모양을 바꿀 수 있으며, 이런 참조를 담지 못하는 형식으로 변환하면 손실로 보고됩니다.