본문으로 바로 가기
SubtitleMatrix

TTML을 ASS로 변환

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

이 변환에서 달라지는 것

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

  • 정밀도

    타이밍 정밀도 — 결과물의 시계가 더 거칠어 모든 타임스탬프가 가장 가까운 10 ms로 반올림됩니다

  • 형식 고유 내용

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

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

TTML 파일을 ASS로 바꾸면 자막의 글자와 순서는 그대로 남지만, 시간은 0.01초 단위로 반올림되고 TTML 머리말의 스타일·레이아웃 표는 ASS에 들어갈 자리가 없어 사라집니다. 이 페이지는 그 손실을 파일을 열기 전에 알려 주고, 결과를 .ass 파일로 내려 줍니다.

두 형식 모두 시간을 직접 적지만 정밀도가 다릅니다. TTML은 begin과 end에 00:00:04.126처럼 밀리초까지 적고, dur=2s나 1.5s 같은 오프셋, 25fps에서의 프레임 표기 00:00:07:00도 읽습니다. ASS는 Dialogue 줄에 0:00:04.13을 적으므로 값이 10ms 단위로 맞춰집니다. 4.126초는 4.13초가 되고, 한 자막이 5ms 넘게 움직이지는 않습니다.

TTML의 <styling> 표와 <layout> 표는 ASS로 넘어가지 않습니다. 글꼴 이름, 크기, 외곽선, 그림자, 여백처럼 문서 전체에 선언한 값과 XML 선언, 네임스페이스, <metadata>, <p>의 style·region 참조가 여기 해당합니다. 반대로 문단 안쪽의 <span>으로 준 기울임이나 색은 ASS의 태그로 옮겨집니다. 두 줄짜리 자막은 \N 하나로 이어집니다.

파일 하나만 넣어도 되고, 시즌 전체를 한 번에 넣어도 됩니다. 대기열이 순서대로 처리하고 결과는 ZIP 하나로 묶여 내려옵니다. 변환은 브라우저 안에서만 실행되며 파일은 어디에도 업로드되지 않습니다.

예시

일반적인 TTML 파일을 ASS로 변환

입력

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

결과물

[Script Info]
ScriptType: v4.00+

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:03.50,Default,,0,0,0,,Hello {\i1}there{\i0}.
Dialogue: 0,0:00:03.50,0:00:06.00,Default,,0,0,0,,How are you?\NFine, 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>

결과물

[Script Info]
ScriptType: v4.00+

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.50,0:00:03.50,Default,,0,0,0,,Loaded from an offset and a duration.
Dialogue: 0,0:00:04.00,0:00:06.50,Default,,0,0,0,,A coarser clock spelling.
Dialogue: 0,0:00:07.00,0:00:08.48,Default,,0,0,0,,Frames, at 25fps.
Dialogue: 0,0:00:09.00,0:00:11.00,Default,,0,0,0,,{\c&H000000FF&}Half-open{\c} and Tom &amp; Jerry.

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

자주 묻는 질문

TTML을 ASS로 바꾸면 타임코드가 왜 달라지나요?

ASS는 시간을 0:00:04.13처럼 0.01초까지 적고 TTML은 00:00:04.126처럼 0.001초까지 적습니다. 그래서 모든 값이 가장 가까운 10ms로 반올림됩니다. 00:00:04.126은 4.13초가 되고, 자막이 늘어나거나 순서가 바뀌지는 않으며 어느 cue도 5ms 넘게 움직이지 않습니다. 다른 파일과 초 단위로 맞춰야 하는 작업이라면 이 지점이 유일하게 정확도가 떨어지는 곳입니다.

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

사라집니다. TTML은 문서 머리에 이름 있는 스타일(tts:color, tts:fontWeight)과 이름 있는 영역(tts:origin, tts:extent)을 선언하고 <p>가 그것을 이름으로 가리키는데, XML 선언과 네임스페이스, <metadata>, style·region 참조까지 ASS로 옮겨지지 않습니다. 다만 문단 안쪽의 <span>으로 준 강조는 글자에 붙은 정보라 ASS 태그로 남습니다.

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

ASS답게 cue 번호가 없습니다. 자막마다 [Events] 구역의 Dialogue 줄 하나가 되고, SRT가 번호를 두는 자리에 레이어 필드가 옵니다. TTML의 cue 하나가 ASS의 cue 하나가 되며 순서와 글자는 같습니다.

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

두 줄 사이에 \N이 들어간 한 자막으로 나옵니다. ASS가 강제 줄 바꿈을 적는 방식이고, 두 줄이 같은 자막이라는 사실은 그대로 유지되어 재생기가 함께 보여 줍니다.

TTML 자막의 순서는 ASS에서도 유지되나요?

유지되며, 변환 과정에서 시작 시간이 이른 것부터 다시 정렬됩니다. TTML 파일이 cue를 뒤섞어 나열했다면 ASS 결과는 순서를 바로잡습니다. 내용이 아니라 파일 구조를 바꾸는 일이며 의도된 동작입니다.

ASS를 다시 TTML로 바꾸면 이 방향에서 잃은 것이 돌아오나요?

돌아오지 않습니다. ASS에서 TTML로 가는 방향은 그 자체로 노래방 타이밍과 형식 고유 정보를 잃고, 이 방향에서 버린 스타일 표와 영역 선언은 ASS 파일 어디에도 기록되지 않기 때문입니다. 왕복하려면 원본 TTML을 보관하는 편이 낫습니다.

관련 도구