SMI 자막을 SRT 로 바꾸는 법

예전에 받아 둔 .smi 자막이 요즘 플레이어나 TV 에서 안 열립니다. 포맷을 SRT 로 바꾸면 거의 다 해결되는데, 바꾸는 과정에서 걸리는 것이 세 가지 있습니다.

급하면 이것만. 자막 변환기에 .smi 파일을 끌어다 놓고, 자막 포맷을 SRT, 대상 인코딩을 UTF-8(BOM 없는 것)로 고른 뒤 전체 변환. 나머지는 알아서 처리됩니다. 아래는 왜 그렇게 하는지에 대한 설명입니다.

SMI 가 왜 안 열리게 됐나

SMI(SAMI)는 Microsoft 가 1990년대 후반에 만든 자막 포맷입니다. Windows Media Player 가 기본으로 지원했고, 한국에서 곰플레이어·KMPlayer 같은 국산 플레이어가 이걸 받아들이면서 2000년대 내내 사실상 한국 표준처럼 쓰였습니다. 지금 돌아다니는 한국어 자막 중 오래된 것은 대부분 SMI 입니다.

문제는 한국 밖에서는 거의 쓰이지 않았다는 점입니다. Microsoft 도 손을 뗐고, VLC·mpv 같은 국제 플레이어는 지원이 부실하거나 아예 없습니다. 스마트TV·셋톱박스· 모바일 플레이어는 SMI 를 모르는 쪽이 보통입니다. 그래서 파일은 멀쩡한데 재생 목록에 자막이 아예 안 뜨는 일이 생깁니다.

SRT(SubRip)는 반대입니다. 구조가 단순해서 거의 모든 플레이어·TV·스트리밍 기기가 읽습니다. 담는 것이 시각과 글자뿐이라 호환성이 좋습니다.

두 포맷은 구조가 다릅니다

옮길 때 뭐가 걸리는지 알려면 이게 어떻게 다른지부터 봐야 합니다.

SMI — 끝 시각이 없습니다

<SYNC Start=1000><P Class=KRCC>첫 번째 자막입니다.
<SYNC Start=3500><P Class=KRCC>&nbsp;
<SYNC Start=4000><P Class=KRCC>두 번째 자막입니다.
<SYNC Start=6200><P Class=KRCC>&nbsp;

SMI 는 단일 타임라인입니다. <SYNC Start=1000> 은 "1.000초부터 이 글자를 띄워라"라고만 말합니다. 언제 내리라는 말이 없습니다. 그래서 자막을 끝내려면 내용이 빈 <SYNC> 를 하나 더 넣습니다 — 위 예시의 &nbsp; 줄이 그것입니다. 저 줄이 "여기서 지워라"라는 뜻입니다.

SRT — 시작과 끝을 둘 다 적습니다

1
00:00:01,000 --> 00:00:03,500
첫 번째 자막입니다.

2
00:00:04,000 --> 00:00:06,200
두 번째 자막입니다.

SRT 는 자막 하나가 번호 · 시작→끝 · 본문 세 줄 묶음입니다. 끝 시각이 명시돼 있어 빈 칸을 넣을 필요가 없습니다. 그래서 위의 SMI 4줄은 SRT 로 가면 자막 2개가 됩니다. 줄 수가 절반으로 줄어도 자막이 사라진 게 아닙니다 — 빈 <SYNC> 가 끝 시각으로 흡수된 것입니다.

변환 뒤 자막 개수가 원본 <SYNC> 수의 절반쯤이면 정상입니다. 변환기 목록의 뱃지가 SMI · 자막 4개 → SRT 처럼 뜨는데, 결과 파일을 열어 자막 2개가 나와도 놀라지 마세요.

걸리는 것 1 — 인코딩

포맷만 바꾸고 인코딩을 그대로 두면 십중팔구 글자가 깨집니다. SMI 자막 대부분이 CP949(EUC-KR) 로 저장돼 있기 때문입니다. CP949 는 한국어 Windows 가 쓰던 코드 페이지라, 한국어 Windows 밖에서는 아무도 제대로 못 읽습니다.

요즘 플레이어와 TV 는 UTF-8 을 기대합니다. 그래서 SMI → SRT 변환은 사실상 두 가지를 동시에 해야 합니다 — 포맷을 바꾸고, 인코딩도 UTF-8 로 바꾸는 것. 변환기는 원본 인코딩을 자동으로 판별하므로 대상 인코딩만 UTF-8 로 두면 됩니다.

글자 깨짐 자체가 궁금하시면 자막 글자가 깨질 때에 자세히 적어 두었습니다.

걸리는 것 2 — 파일 안의 charset 선언

이게 사람들이 가장 많이 걸려 넘어지는 지점입니다. SMI 파일 머리에는 보통 이런 줄이 있습니다.

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=euc-kr">

SMI 는 HTML 을 흉내 낸 포맷이라 자기 인코딩을 파일 안에 적어 둡니다. 바이트만 UTF-8 로 바꾸고 이 줄을 그대로 두면, 파일이 거짓말을 하게 됩니다 — 내용은 UTF-8 인데 "나는 euc-kr 이다"라고 적혀 있는 상태입니다. 플레이어는 적힌 말을 믿기 때문에, 분명히 변환했는데도 자막이 깨집니다.

메모장으로 "UTF-8 로 저장"만 하면 이 함정에 빠집니다. 메모장은 바이트만 바꾸고 저 선언은 건드리지 않습니다. 변환은 됐는데 플레이어에서만 깨진다면 거의 이 경우입니다.

SRT 로 바꾸면 이 문제가 원천적으로 사라집니다. SRT 에는 인코딩 선언을 적는 자리가 아예 없기 때문입니다. SMI 를 SMI 로 두고 인코딩만 바꿀 때는 선언을 같이 고쳐야 하는데, 변환기의 문서 안의 charset 선언 옵션이 기본값 "고쳐 쓰기"로 그 일을 합니다.

걸리는 것 3 — 꾸밈은 따라오지 않습니다

SMI 는 HTML 기반이라 글꼴·색·크기를 <font> 태그로 지정할 수 있고, 파일 머리의 <STYLE> 블록에 자막 스타일을 적어 둘 수도 있습니다. SRT 에는 그런 것을 담을 자리가 없습니다.

그래서 변환하면 시각과 글자, 그리고 기울임·굵게·밑줄만 넘어갑니다. 글꼴·색·화면 위치는 빠집니다. 자막은 대개 플레이어 설정으로 모양을 잡으므로 실제로는 아쉬울 일이 거의 없지만, 색으로 화자를 구분해 둔 자막이라면 그 구분은 사라집니다.

한 파일에 여러 언어가 든 SMI

SMI 는 자막 클래스로 언어를 나눠 한 파일에 한국어와 영어를 같이 넣을 수 있습니다 (Class=KRCC, Class=ENCC). SRT 는 한 파일에 한 트랙만 담습니다. 이런 파일을 변환하면 두 언어가 시간 순으로 섞여 한 줄씩 번갈아 나옵니다. 필요한 언어만 남기려면 변환 전에 텍스트 편집기로 다른 클래스의 <SYNC> 줄을 지우는 수밖에 없습니다.

바꾸는 순서

  1. 자막 변환기를 엽니다. 설치도 가입도 없고, 파일은 브라우저 밖으로 나가지 않습니다.
  2. .smi 파일을 창에 끌어다 놓습니다. 여러 개나 폴더째도 됩니다.
  3. 목록에 SMI · 자막 N개 뱃지가 뜨는지 봅니다. 개수가 0 이면 원본 인코딩을 잘못 읽은 것이니 그 행의 셀렉트에서 직접 EUC-KR / CP949 를 골라 주세요.
  4. 오른쪽 자막 포맷 변환에서 SRT (SubRip) 를 고릅니다.
  5. 인코딩 변환의 대상 인코딩을 UTF-8 로 둡니다 — UTF-8 (BOM 포함) 말고 그냥 UTF-8 입니다. 이유는 바로 아래에.
  6. 전체 변환을 누르고 저장 또는 ZIP으로 모두 받기. 파일 이름의 확장자도 .srt 로 따라 바뀝니다.

자막 변환기 열기

BOM 은 넣지 마세요

BOM(Byte Order Mark)은 파일 맨 앞에 붙는 EF BB BF 세 바이트로, "이 파일은 UTF-8 이다"라고 알리는 표시입니다. 넣어도 되는 자리가 있고 안 되는 자리가 있는데, SRT 에는 넣지 않는 쪽이 안전합니다.

SRT 는 첫 줄이 자막 번호 1 입니다. 그런데 앞에 BOM 이 붙으면 일부 플레이어와 TV 가 그걸 번호의 일부로 읽어 1 이라는 이상한 번호로 봅니다. 번호를 못 읽으면 그 자막 묶음 전체를 건너뜁니다. 첫 자막 한 줄이 통째로 안 나오는 증상이 이것입니다.

그래서 대상 인코딩은 UTF-8 (BOM 포함) 이 아니라 UTF-8 을 고릅니다. 변환기는 자막 파일이 섞여 있고 BOM 붙는 인코딩을 고르면 경고를 띄웁니다. (WebVTT 는 규격이 BOM 을 허용하므로 이 문제가 없습니다.)

바꾼 뒤 확인할 것

확인어떻게
글자가 멀쩡한가 변환기의 미리보기로 변환 전/후를 나란히 봅니다. 오른쪽 칸에 한글이 제대로 나오면 됐습니다.
자막 개수가 맞는가 행 메시지에 SRT 로 포맷을 바꿨습니다 — 자막 N개 가 뜹니다. N 이 원본 <SYNC> 수의 절반쯤이면 정상입니다.
파일 이름 영상 파일과 이름을 똑같이 맞추고 확장자만 다르게 두면 (영화.mkv / 영화.srt) 대부분의 플레이어가 자동으로 붙입니다.
싱크 포맷을 바꿔도 시각은 그대로입니다. 원래부터 어긋나 있었다면 싱크 맞추는 법을 보세요.

자주 묻는 것

반대로 SRT 를 SMI 로 바꿀 수도 있나요?

됩니다. 같은 변환기에서 포맷만 SMI (SAMI) 로 고르면 됩니다. 오래된 국산 플레이어나 SMI 만 받는 기기에 쓸 때 필요합니다. 이때는 SMI 머리말과 <STYLE> 블록을 새로 쓰는데, charset 은 고른 대상 인코딩으로 적고 자막 클래스의 언어는 원본이 알려 주는 정보(또는 원본 인코딩)에서 따옵니다.

.srt 로 이름만 바꾸면 안 되나요?

안 됩니다. 확장자는 이름일 뿐이고 내용은 여전히 SMI 입니다. 플레이어가 열어 보면 <SYNC> 태그 덩어리라 자막을 하나도 못 찾습니다. 내용 자체를 다시 써야 합니다.

자막이 영상보다 먼저/늦게 나옵니다

포맷과 무관한 문제입니다. 판본마다 오프닝 길이가 달라서 생기는 일이 대부분이고, 변환기의 자막 싱크에서 초를 적어 통째로 밀면 됩니다. 자막 싱크 맞추는 법에 재는 방법까지 적어 두었습니다.

파일이 어디론가 올라가나요?

아니요. 변환은 전부 브라우저 안에서 일어납니다. 파일을 받는 서버가 없어서 기술적으로 업로드가 불가능합니다. 이 도구는 HTML 파일 하나가 전부라 소스 전체를 그대로 읽어 확인하실 수 있습니다.

더 읽을 거리