2010年6月15日火曜日

日本語字幕付きのTED動画をつくる

iPodで空いた時間にTEDの動画を見たい。英語の能力がショッパイので、字幕が欲しい。

1. 見たい動画のIDをTranslations Talks in 日本語から見つける。

2. 字幕と映像を入手。映像はTEDのページにあるダウンロードリンクから。字幕は↓のような感じで。

wget -O - http://www.ted.com/talks/subtitles/id/${TALKID}/lang/jpn > jpn.json

3. ダウンロードした字幕は、JSONなので、SRTとやらに変えてあげる。使ったスクリプト↓

#!/usr/bin/python
# -*- encoding: utf-8 -*-

import sys
import codecs
from datetime import date, datetime, time, timedelta

import simplejson as json

sys.stdin  = codecs.getreader('utf-8')(sys.stdin)
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

def timestr(timeobj):
    return timeobj.strftime('%H:%M:%S,') + '%03d' % (timeobj.microsecond // 1000)

# MAX_CHARS文字より長いときは2行に分ける
MAX_CHARS=25

def main():
    f = open(sys.argv[1], 'r')
    captions = json.load(f)['captions']
    for i, c in enumerate(captions):
        startTime = int(c['startTime'])
        duration = int(c['duration'])
        # TEDのスプラッシュの時間を加える
        startTime += 16000
        st = datetime.combine(date.today(), time(0, 0)) + timedelta(milliseconds=startTime)
        et = st + timedelta(milliseconds=duration)

        if len(c['content']) > MAX_CHARS:
            print u'%d\n%s --> %s\n%s\n%s\n' % (i+1, timestr(st), timestr(et),
                                                c['content'][0:MAX_CHARS],
                                                c['content'][MAX_CHARS:])
        else:
            print u'%d\n%s --> %s\n%s\n' % (i+1, timestr(st), timestr(et), c['content'])

if __name__ == '__main__':
    main()

4. mencoderで動画と字幕をひっつける。動画のファイルがvideo.mp4、字幕のファイルがjpn.srtとしてます。↓としたらiPod Touchでも見られた。

mencoder video.mp4 -ofps 30 -sws 9 -of lavf -lavfopts format=ipod -vf scale=-10:240,dsize=320:240:0,harddup -ovc lavc -lavcopts aglobal=1:vglobal=1:vcodec=mpeg4:vbitrate=448:acodec=libfaac:abitrate=128 -oac lavc -alang en -srate 22050 -sub jpn.srt -utf8 -slang ja -subalign 0 -subpos 93 -subfont-outline 5 -subfont-text-scale 3 -font 'Meiryo' -sub-bg-alpha 255 -o video_sub.mp4

0 件のコメント:

コメントを投稿