YouTubeの動画から抜き出した自動生成字幕を読みやすくする


概要

仕事柄、YouTubeで使われている英語の字幕を手元で見られるようにしておきたい時があります。手作業で付けられた字幕であれば様々なやり方があり、割と簡単に保存できるのですが、YouTube側が自動生成した字幕にはその多くが対応していません。

試行錯誤した結果、外部サイトとメモ帳とPythonの三者を併用したキメラ的な手法を思いつきました。私と同じレベルの初心者プログラマーを対象に書いていますので、多少回りくどい表現が多くなってしまうと思います。ご了承下さい。

手法

1.)海外サイトDownsub.comから字幕をsrtファイル形式でダウンロードする
2.)該当ファイルとメモ帳の関連付けを行い、txtファイルに変換する
3.)正規表現モジュールreのsubメソッドを使い、htmlタグを取り除く

1.)海外サイトDownsub.comから字幕をSrtファイル形式でダウンロードする

当該サイトにアクセスすると、一番上に動画のURLを入力する場所が出てくると思います。そこに自動生成字幕をダウンロードしたい動画のURLをコピペしてもらって、何度かダウンロードボタンを押して下さい。最初は別タブで広告が出ますが、そこはさっさと消してもらって大丈夫です。
うまく変換できれば、以下の画像のような結果が出ると思われます。

その中にある>>Download<< English(auto-generated)を選択し、ダウンロードしてください。ダウンロードしたsrtファイルはこれから作業を行うフォルダに入れておいて下さい。適当に名前を変えておくことをオススメします。

2.)該当ファイルとメモ帳の関連付けを行う

これは既に行われている方は飛ばしてもらって大丈夫です。拡張子を表示している方であればファイル名の変更で対応出来るでしょうし、そうでない方は以下を参考に関連付けを行って下さい
(参照:Windows 10で、アプリと拡張子の関連付けを変更する方法について教えてください。

以下の説明では、srtファイルをtxtファイルに変換したものをsample.txtという名前で扱っていきます。

3.)正規表現モジュールreのsubメソッドを使い、htmlタグを取り除く

ディレクトリ移動の手間暇を省くため、先ほど保存したテキストファイルと同じ場所にPythonのファイルを作っていきます。実際のコードは以下のような感じになると思います。

youtube_caption.py
import re

with open("sample.txt", "r") as s:#読み込みモードで開く
    text = s.read()

new_text = re.sub("<.*?>", "", text)

with open("new_sample.txt", "w") as n:#書き込みモードでファイル作成
    n.write(new_text)

組み込み関数のopenを使って、読み込みと書き出しを行っています。今回はsample.txtという名前のファイルを読み込んで、変数textに保存。タグ除去後のnew_textをnew_sample.txtという名前で出力しています。
少々手間はかかりますが、メモ帳からコピーしたテキストを変数に直接文字列として保存しても同じ結果になります。

また、reモジュールのsubメソッドを使って不要なhtmlタグを削除しています。subメソッドは本来置換用のメソッドなのですが、第二引数を上記のように与えれば削除することが出来ます。正規表現の<.*?>を使うことにより、<>で囲まれた文字列を非貪欲に指定しています。

open関数の使い方や正規表現については以下を参考にして下さい。
(参照:Pythonでファイルの読み込み、書き込み(作成・追記))
(参照:正規表現ってなんぞや)

まとめ

おそらくFlaskなんかを使ってやれば全てをPython内で出来る気がしなくはないのですが、私の現在の技術力では無理でした。ゆくゆくはもっとコンパクトにしたいと思っています。