Hatena::ブログ(Diary)

徒手空拳日記 Twitter

2010-10-15

スピードラーニング

スピードラーニングっぽいクリップ集を作るスクリプト。必要なのは、

  1. 日本語動画
  2. 日本語動画英語字幕
  3. 英語動画
  4. 英語字幕

英語字幕はセリフを選択するとともに、タイミングを同期するため。DVD などから取り出してもとから同期している場合は、一つでいい。基本的に英語のタイミングに合わせて日本語吹き替えられている事が多いので、再生時間に関しては問題なし。日本語動画英語字幕と、英語字幕は、タイミングはずれていてもいいが、字幕の内容は同じにしとく。

後は、ffmpeg を使って、可変フレームレートの場合は、固定に直し、(こうしないと、すごく切り出しに時間がかかる。この辺についてはよくわからない)、字幕情報をもとに日本語英語のセットを切り出していく。

動画はあんまり必要ないかもしれない。一度見てれば思い出せるし、音声だけの方が携帯用にいい(ipad はいまのところまともに動画再生出来ない)。

わざわざ second という関数をつくって、time オブジェクトを秒数に直しているのは、そのまま使うとずれが出るから。おそらくフォーマットの関係だと思うけど、こっちの方がロバストに動く。

ほんとは DVD の字幕を直接ひっぱって来たいと思って探したら、transcode というのがあるらしい。次はこれを使ってみよう。

from pysrt import SubRipFile, SubRipItem, SubRipTime
import os, sys

path_to_srt = os.path.abspath(sys.argv[1])
path_to_video = os.path.abspath(sys.argv[2])
path_to_srt2 = os.path.abspath(sys.argv[3])
path_to_video2 = os.path.abspath(sys.argv[4])
path_to_dir = os.path.split(path_to_srt)[0]

subs = SubRipFile.open(path_to_srt)
subs2 = SubRipFile.open(path_to_srt2)

def second(t):
    t = t.to_time()
    SECONDS_RATIO = 1000000
    MINUTES_RATIO = SECONDS_RATIO * 60
    HOURS_RATIO = MINUTES_RATIO * 60
    ordinal = t.hour * HOURS_RATIO \
              + t.minute * MINUTES_RATIO \
              + t.second * SECONDS_RATIO \
              + t.microsecond
    return float(ordinal)/SECONDS_RATIO

# Pre-Encoding
tmpfile = os.path.join(path_to_dir, "tmp.avi")
tmpfile2 = os.path.join(path_to_dir, "tmp2.avi")
os.system("ffmpeg -y -r 30 -i %(video)s %(name)s.mp4" % {'video':path_to_video, 'name':tmpfile})
os.system("ffmpeg -y -r 30 -i %(video)s %(name)s.mp4" % {'video':path_to_video2, 'name':tmpfile2})


for i, sub in enumerate(subs):
    st = second(sub.start)
    dur = second(sub.end-sub.start)+0.5
    name = '%03d_' % i + os.path.splitext(os.path.split(path_to_srt)[1])[0] 
    os.system("ffmpeg -y -ss %(st)f -t %(dur)f -i %(video)s %(name)s.mp4" % {'video':tmpfile, 'st':st, 'dur':dur, 'name':name})

    os.system("mplayer %s.avi" % name)

    sub2 = subs2[i]
    st2 = second(sub2.start)
    dur2 = second(sub2.end-sub2.start)
    name2 = '%03d_' % i + os.path.splitext(os.path.split(path_to_srt2)[1])[0] 
    os.system("ffmpeg -y -ss %(st2)f -t %(dur2)f -i %(video)s %(name2)s.avi" % {'video':tmpfile2, 'st2':st2, 'dur2':dur2, 'name2':name2})

    os.system("mplayer %s.avi" % name2)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/matoge/20101015/1287127716