본문 바로가기

Technical/Development

[Linux/Bash script] EUC-KR 로 된 한글 smi 자막을 UTF8 srt 로 변환하기


소장하고 싶은 영화나 동영상 파일들을 모아서 디스크 한 켠에 폴더별로 잘 정리해서 보관하는 경우가 많다. 그렇다고 자주 들춰보기는 쉽지 않지만, 일종의 "혹시나 다음에 또 보고 싶어질지도 몰라...ㅋ" 하는 미련 같은 건 아닐까(그러다 결국 한 순간에 폴더째 지워버리게 되기도 하지만...ㅠㅠ). 아, 위에 나오는 짤방성 이미지의 context sensitive한 자막은 참 공감이 많이 가고, 무엇보다 푸근한 처자에게 고맙다(뭐가 ? ^^;;).


2016년 첫 포스팅 치고는 거의 솔플메모에 가까울 정도로 가볍다. 언제나 심각하고 거창할 순 없는 거다. 각설하고, 이제 본론인 메모 작성으로 넘어가자.


Handbrake로 동영상을 변환

다운로드 받은 영화를 보관 또는 거실TV에서 상영하기 전에 거실 PC의 Linux(Ubuntu 14.04 LTS)에서 무료 동영상변환기인 핸드브레이크(Handrake)로 인코딩 하게 된다(Mac book에도 Adapter라는 쓸만한 인코딩 앱이 있긴 하지만, 귀여운 내 맥프레에게 이런 격 떨어지는 일을 시키고 싶지는 않다).


그런데, TV(스마트 TV가 나오기 전 모델의 42인치 LG LED)의 미디어플레이어가 개후져서 조금 옛날 것이라 AC3 오디오를 인식 못하거나 새로운 코덱으로 인코딩 된 mp4 파일은 아예 화면도 띄우지 못하는 경우가 많다. 이 때 만날 수 있는 여러 문제 상황을 단순하게 넘기려면, 아예 Handbrake에서 동영상 변환을 할 때 영상의 화면에 자막을 심어 버리는 작업을 하는 쪽이 속 편하다.


한글 자막 .smi 파일은 대부분 EUC-KR 코드

인터넷에서 입수되는 대부분의 한글 자막은 smi 포맷으로 되어 있고, 한글코드는 EUC-KR 인 경우가 많다(불평은 하지 않습니다. 자막 제작자님들 고맙습니다 ^^). 그런데 문제는 Handbrake가 srt 포맷의 자막만 지원하기 때문에 2번의 변환을 거쳐야 한다. 한 번은 한글 코드 변환, 또 한 번은 자막파일 변환. 이과정이 귀찮아서 Bash shell 을 작성해 보았다. 사용 방법과 소스는 아래 참고.


자막 변환 스크립트 사용법

우선 smi -> srt 자막을 변환하는 Linux 용 프로그램 subs를 설치해야 한다(작성자 <Dmitry Karasik, dmitry@karasik.eu.org> 에게 감사). 좀 오래 된 거지만 지금도 쌩쌩 잘 돌아간다.  그 다음에 사용할 iconv 는 대다수 Linux 배포본에 포함된 코드 변환 도구이므로, 따로 설명은 생략한다.


다음과 같이 subs 를 우선 설치.

$ sudo apt-get install libsubtitles-perl

$ subs -> 테스트 삼아 한 번 실행해 보자

subs: convert, join, split, and re-time subtitles


format:

   subs [options] subfile [ subfile ... ]


options:

   -a coeff, - a and b coefficients in linear transformation

   -b time     u=at+b, where t and u are src and dest times

...


사용법은 간단하다. 스크립트(conv_eucsmi2utfsrt.sh ... 파일 명은 알아서 변경)를 Linux 계정의 $HOME/bin  정도에 복사해 두고(chmod +x 가 필요할지도...), 변환할 자막 파일이 있는 경로로 가서 "conv_eucsmi2utfsrt.sh 자막파일.smi" 같은 식으로 실행해 주면 된다. 변환에 성공했을 경우 다음과 같이 나오게 될 것이다.


명령어 인자로 전달하는 자막파일명 부분에 와일드카드를 쓴다든지, 여러개 파일의 일괄변환 등에 대해서는 따로 고려하지 않았다. 모든 smi 파일을 단숨에 변환할 일이 그다지 많지 않기 때문인데, 나중에 필요하면 한 번 생각해 보기로...


$ conv_eucsmi2utfsrt.sh tmp.smi

Converted tmp.smi(euc-kr) to tmp.srt(utf8)

Enjoy it! ;)


특별한 기술이 필요하거나 대단히 복잡한 것은 없다. 잘 보면 아래 부분 실행문들에서 iconv, subs, sed 를 적당한 옵션을 주어 각각 실행하는 것이 전부다. 그러나 귀찮은 작업을 스크립트 하나 실행해서 해 낼 수 있다는 점에서 자화자찬 중.


conv_eucsmi2utfsrt.sh (Bash shell script 소스)

#!/usr/bin/env bash
# Bryan(Barracuda), 2016.1.
# Usage: conv_eucsmi2utfsrt.sh filename.smi(with EUC-KR Kor. char.)
#
# *.smi 파일(euc-kr)을 iconv와 subs 를 써서 *.srt(utf8) 형식으로 변환
# 변환 후 srt 파일 내에 smi 파일에서 자주 보이는 흔적인   가 있으면 삭제함
# 자막 변환 도구 subs는 sudo apt-get install libsubtitles-perl 로 설치되어 있어야 함(ubuntu 기준)

args=1
param=$1

if [ "$#" -ne "$args" ]; then
    # $0 의 Path 부분 삭제: ${0##/*/}
    echo -e "\033[0;33m$# arguments ... use \"${0##/*/} filename.smi\"\033[0m"
    exit 1
fi

# 인자로 전달 된 파일명에서 확장자 부분을 제외한 앞 부분을 잘라냄(뒤에서부터 .로 시작하는 부분을 삭제)
# param이 . 으로 끝나면 basename은 "filename", extension은 ""
# param에 . 이 없으면 basename은 "filename", extension도 "filename", index는 "0"
basename=${param%*.*}
extension=${param##*.}
index=`expr index $param .`

# 파일명이 . 으로 끝나는 경우, 파일명에 . 이 없는 경우, 확장자가 smi 가 아닌 경우 오류
if [[ "$extension" = "" || "$index" = "0" || "$extension" != "smi" ]]; then
    echo -e "\033[0;33mBad file extension ... I want \"*.smi\" file.\033[0m"
    exit 1
else if [ ! -f $param ]; then
        echo -e "\033[0;33mFile $param missing.\033[0m"
        exit 1
    fi
fi

if [ -e "$basename.srt" ]; then
    echo -e "\033[0;33mFile $basename.srt already exists. Plz delete or rename it.\033[0m"
    exit 1
fi

# 한글 euc-kr 코드를 utf8 코드로 변환
iconv -f euc-kr -t utf8 $basename.smi > _$basename.smi
# smi 파일을 srt 파일로 변환
subs -c srt _$basename.smi -o _$basename.srt
# srt 파일 내의   를 제거
sed "s/&nbsp;//g" _$basename.srt > $basename.srt
# 중간 작업파일 제거
rm -f _$basename.smi _$basename.srt

echo -e "\033[0;32mConverted $basename.smi(euc-kr) to $basename.srt(utf8)"
echo -e "\033[0;32mEnjoy it! ;)\033[0m"


Mac 사용자라면 간단히 MinySubtitleConverter 를 써 보자


만약 Linux 가 아닌 Windows 나 Mac 사용자라면 http://blog.myhyuny.com 블로그를 방문하여 MinySubtitleConverter 를 다운로드 받아서 사용하면 위의 과정을 간편하게 한 번에 끝낼 수 있다. 직접 테스트 해보니 한글코드와 srt 변환이 아주 훌륭하게 작동한다.


2014년 3월이 마지막 업데이트이긴 하지만 OSX 10.11(El Capitan) 에서도 문제 없이 사용할 수 있는 것으로 확인되었다.




Input Encoding 을 따로 지정하지 않고 Auto 로 두어도 한글 코드를 자동으로 인식한다. File 메뉴에서 Open -> smi 파일을 선택하면 smi 파일이 있는 폴더에 srt 파일이 자동 생성된다.



- Barracuda -