youtubeの字幕のxmlをsrtに変換するスクリプト
前回の記事でyoutubeの字幕をダウンロードするスクリプトを載せたけど、どうやらxmlでは何かと不便らしい。srt形式にすると幸せになるらしい。次のサイトを参考にした。
・srt
srtの中身は、例えばこんな感じ
1 00:00:00,000 --> 00:00:03,000 はろー。 2 00:00:03,000 --> 00:00:05,487 ぺろぺろ。 3 00:00:06,000 --> 00:00:09,000 ほげほげ。
番号、字幕表示の開始時間と終了時間、表示させる内容、空行、といった構成になっている。単純でいいね。
それじゃ、ダウンロードしたxmlをこの形に変換してみよう、ということで、Pythonでのxmlの扱いについて調べてみた。色々調べた後、次の記事を参考にすることにした。
・http://perl.wonder-boys.net/?p=155
ちなみに字幕のxmlファイルは次のような構成になっている。
<?xml version="1.0" encoding="UTF-8"?> -<transcript> <text dur="8.477" start="1.533">ほげほげ</text> </transcript>
startは開始時間、durは何秒表示させるか、といったところか。
で、次のようなスクリプトを書いた。Pythonのバージョンは2.7。
from xml.etree.ElementTree import ElementTree import datetime def encode(f, start, dur, content, num): #変換する関数 dt = datetime.datetime(2000, 1, 1, 0, 0, 0, ) #年、月、日は使わないので適当 start = dt + datetime.timedelta(seconds = float(start)) #開始時間を求める end = start + datetime.timedelta(seconds = float(dur)) #終了時間を求める st = start.strftime('%H:%M:%S,') + str(start.microsecond)[0:3] #書式を合わせる et = end.strftime('%H:%M:%S,') + str(end.microsecond)[0:3] #マイクロ秒の部分は最初の3ケタだけ f.write(str(num) + '\n') f.write(st + ' --> ' + et + '\n') f.write(content + '\n') f.write('\n') def get_element(wf, name): #xmlファイルから要素を抽出してencode関数に渡す関数 xml = ElementTree(file = open(name + '.xml')) root = xml.getroot() text = xml.findall('text') #'text'タグを要素を含めて全てリストにしてtextに入れる num = 1 for t in text: #textから順番に要素を取り出してencode関数に渡すのを繰り返す tl = t.items() start = tl[0][1] dur = tl[1][1] content = t.text content = content.encode('utf_8') #これがないとエラーが出る encode(wf, start, dur, content, num) num += 1 def main(): name = raw_input('Input: ') f = open(name + '.srt','w') get_element(f, name) f.close() if __name__ == "__main__": main()
これで、入力したxmlファイルと同じ名前のsrtファイルがカレントディレクトリに生成される。入力する際、○○○.xmlの○○○だけを入力する。
前回載せたスクリプトと合体させればURL入力->srtの生成ができる。