2010年6月16日水曜日

TEDの日本語字幕付き動画一覧を取る

日本語字幕のついたTEDが増えていても、どれが増えたのかさっぱりわからない。

そこでリストを作っておいて、何が増えたのか把握したい。

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

import re
import codecs
import urllib
from datetime import datetime

import simplejson as json

def main():
    f = urllib.urlopen('http://www.ted.com/talks/listRPC/lang/jpn')
    raw_talks = json.load(f)

    talks = list()
    for t in raw_talks['resultSet']['result']:
        mtitle = re.search(r'title="([^"]*)"', t['markup'])
        mhref = re.search(r'href="([^"]*)"', t['markup'])
        talks.append({'title': mtitle.group(1), 'href': mhref.group(1)})

    talks.sort(lambda x, y: cmp(x['href'], y['href']))

    f = codecs.open(datetime.now().strftime('%Y%m%d_%H%M%S'), 'w', 'utf-8')
    for t in talks:
        f.write(u'%s\n%s\n' % (t['title'], t['href']))

if __name__ == '__main__':
    main()

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

2010年1月2日土曜日

ScanSnapでスキャンしてSeadragonで表示する

 ScanSnapで電子化した本をどうしたら読みやすくなるかな、と考えていたときにTEDで見た「ブレイズ・アゲラ・イ・アルカス Photosynthを実演説明 (1:07〜)」を思い出したのでためしてみました。


表示側は、Seadragon、データの作成にはOpenZoomを利用しています。テスト用データは、青空文庫のデータをてふてふ君でPDFにして使いました。



 
作業は以下のとおり。

  1. ScanSnapについていたAcrobatでPDFを開き、JPEG形式で保存。これで1ページ1ファイルのJPEGファイルができます。
  2.  deepzoom.pyで縮小・分割したファイルを生成。オリジナルのdeepzoom.pyは、ひとつのファイルを分割するようになっています。ScanSnapで生成したJPEGファイルを連結してからこれにかけようとしても、ファイルが大きくなりすぎて扱えないので、1ページ1ファイルを扱えるようにテキトーに修正してつかいます。
  3. てきとーにHTMLをつくって表示。