SRT 파일의 구성
SRT 파일은 번호가 매겨진 블록의 목록입니다. 각 블록은 번호, 시:분:초,밀리초 형식의 시작·종료 시간, 한두 줄의 텍스트로 이루어지며, 빈 줄로 블록이 끝납니다.
329
00:24:22,584 --> 00:24:23,784
absence ...
비디오 플레이어는 시간만 읽습니다. 시작 시간부터 종료 시간까지 텍스트를 보여 줄 뿐, 나머지는 신경 쓰지 않습니다. 그래서 번역문은 완벽하게 읽히는데도 재생해 보면 어색할 수 있습니다. 단어는 올바른데 엉뚱한 시간에 붙어 있기 때문입니다.
번역이 타이밍을 깨뜨리는 세 가지 방식
아래 사례는 긴 작업 네 가지를 비교한 테스트에서 가져온 것입니다. 이 테스트에서는 채팅 모델 세 개가 1,200줄, 85분 분량의 동일한 SRT 파일을 한 번의 답변으로 스페인어로 번역했습니다.
1. 한 줄이 앞줄에 합쳐집니다. 원본의 328번 줄은 "...take advantage of Lady Bracknell's temporary", 329번 줄은 "absence ..."였습니다. 한 모델이 문장 전체를 328번 줄에 넣고 329번 줄을 삭제했습니다. 그 결과 화면에는 "absence"가 1초 일찍 나타나고, 329번 줄의 시간 구간은 비어 버립니다.
2. 줄이 빠지면 그 뒤의 번호가 모두 다시 매겨집니다. 같은 모델은 이후 파일 전체를 329번부터 빈틈없이 이어서 번호를 매겼습니다. 357번 줄에서 한 번 더 합쳐진 뒤에는 1,200줄 중 870줄의 번호가 원본과 달라졌습니다. 파일은 여전히 재생됩니다. 하지만 본인이나 편집자가 번역본과 원본을 줄 번호로 대조하면 329번 이후의 모든 줄이 엉뚱한 줄과 짝지어집니다.
3. 타임코드의 숫자 하나가 바뀝니다. 다른 모델은 원래 00:54:45,839 --> 00:54:51,039였던 줄을 00:54:55,839 --> 00:54:51,039로 썼습니다. 이 줄은 시작하기 전에 끝나게 됩니다. 플레이어에 따라 건너뛰거나, 한순간도 표시되지 않고 깜빡이거나, 파일이 아예 불러와지지 않습니다.
첫 줄부터 모든 줄이 같은 만큼 어긋나는 전체 밀림은 다른 문제입니다. 자막이 영상의 다른 편집본이나 프레임 레이트에 맞춰 만들어진 것이며, 번역이 원인은 아닙니다.
2분 점검법
원본과 번역본을 아무 텍스트 편집기에서나 나란히 열어 보세요.
- 마지막 줄. 두 파일의 맨 끝으로 이동합니다. 마지막 번호와 마지막 타임코드가 똑같아야 합니다. 원본은 1,200번에서 끝나는데 번역본이 1,198번에서 끝난다면, 두 줄이 합쳐졌거나 누락된 것입니다.
- 중간 지점 세 줄. 원본에서 대략 4분의 1, 절반, 4분의 3 지점의 타임코드 세 개를 골라 번역본에서 검색해 보세요. 두 파일에서 같은 번호가 나와야 합니다. 번호가 처음으로 어긋나는 곳이 바로 줄이 사라진 지점입니다.
- 불가능한 시간. 종료 시간이 시작 시간보다 앞서는 줄이 있는지 찾아보세요. 긴 파일이라면 간단한 스크립트나 자막 편집기의 오류 검사 기능으로 즉시 찾아낼 수 있습니다.
- 마지막 10분. 번역본을 플레이어에 불러와 끝부분 근처로 이동해 보세요. 그곳에서 자막이 제때 나온다면 파일은 문제없을 가능성이 매우 높습니다.
Python을 쓰신다면 이 짧은 스크립트로 어떤 파일 쌍이든 1~3번 점검을 실행할 수 있습니다(python3 srtcheck.py original.srt translated.srt). 저희 테스트의 번역본 세 개에 실행했더니 위에서 설명한 오류가 정확히 그대로 보고되었습니다.
import re, sys
def cues(path):
text = open(path, encoding="utf-8-sig").read().replace("\r", "")
return re.findall(r"^(\d+)\n(\d\d:\d\d:\d\d,\d{3}) --> (\d\d:\d\d:\d\d,\d{3})", text, re.M)
a, b = cues(sys.argv[1]), cues(sys.argv[2])
print(f"lines: {len(a)} original, {len(b)} translated")
print(f"last: {a[-1]} vs {b[-1]}")
times = {(s, e): n for n, s, e in a}
renumbered = sum(1 for n, s, e in b if (s, e) in times and times[(s, e)] != n)
changed = [n for n, s, e in b if (s, e) not in times]
broken = [n for n, s, e in b if e <= s]
missing = [n for n, s, e in a if (s, e) not in {(s2, e2) for _, s2, e2 in b}]
print(f"renumbered: {renumbered}, changed time codes: {changed[:10]}, "
f"end before start: {broken[:10]}, original lines missing: {missing[:10]}")
번역본이 네 가지 점검을 모두 통과하면 그대로 사용하세요. 하나라도 통과하지 못했다면, 파일을 직접 고치는 것보다 타이밍을 그대로 유지하는 도구로 다시 번역하는 편이 대개 더 빠릅니다.
줄 길이는 별도로 확인하세요
스페인어, 독일어, 프랑스어로 번역하면 영어보다 길어지는 경우가 많습니다. Netflix의 영어(미국) 스타일 가이드는 한 줄에 42자, 자막 하나당 두 줄까지 허용합니다. 저희 테스트에서 42자를 넘는 줄이 있는 번역 줄의 수는 모델에 따라 1,200줄 중 32줄에서 447줄까지 다양했습니다. 저희 도구는 105줄이었으니, 어떤 도구를 쓰든 확인해 볼 만합니다. 줄이 길면 읽기는 불편하지만 타이밍이 깨지지는 않습니다.
문제를 피하는 방법
위와 같은 오류는 모델에게 번역문과 함께 번호와 시간까지 다시 써 달라고 요청하기 때문에 생깁니다. 번호와 시간은 모델의 손에 맡기지 않는 것이 좋습니다. 저희 자막 번역기는 .srt 또는 .vtt 파일을 읽어 텍스트만 최대 60줄씩 묶어 보내고, 누락되어 돌아온 줄은 다시 요청하며, 모든 번호와 시간은 원본에서 그대로 복사합니다. 같은 1,200줄짜리 테스트 파일에서 1,200줄 전체가 번호와 타임코드까지 완전히 동일하게 돌아왔습니다.
모든 작업의 첫 부분 무료이며 회원가입 없이 이용할 수 있습니다. 영화 한 편이나 시즌 전체, 즉 최대 30개 파일에 최대 5,000줄까지는 $5, 1회 결제입니다. 인기 있는 언어는 별도 페이지가 있습니다: SRT 스페인어 번역, 아랍어, 페르시아어.
방법 및 데이터
출처
- SubRip (SRT file format) — Wikipedia
- English (USA) Timed Text Style Guide — Netflix Partner Help Center
- Timed Text Style Guide: General Requirements — Netflix Partner Help Center