【Python】YouTube動画から字幕をテキスト情報として抽出する

2024年4月24日

当サイトはPR広告を利用しています。

YouTube動画から字幕を抜き出すPythonスクリプトを作ったので共有します。

メインで利用しているライブラリはyt-dlp。このライブラリを使うとYouTube動画のURLから動画自体だったり、タイトルやタグなどの動画関連情報、字幕などが簡単に取得できます。

具体的に何ができるか

最初に具体的に何ができるのかを説明します。

extractor.pyというpythonスクリプトを自作していて、このpythonスクリプトを実行すると以下のように字幕の内容が出力されます。

so look ladies and gentlemen i know a
lot of you guys watching this video are
feeling incredibly stuck in your lives
you have these incredible goals dreams
aspirations but you just don't know how
to accomplish them now if that is you i
need you to listen very very very
closely to the rest of this video

以下省略

スクリプトの設定値を書き換えれば日本語でも出力できます。

見てください、紳士淑女の皆さん、
このビデオを見ている多くの人が自分の
人生に信じられないほど行き詰まっていると感じていることを知っています。

あなたにはこれらの素晴らしい目標や夢のような願望があるのに、
今はそれを達成する方法が分からないのです。もしそれがあなたなら、
聞いてください。
このビデオの残りの部分と非常に非常に近いです。

以下省略

自動翻訳の結果を出力しているので日本語はあまり期待しない方が良いです。

前提(環境情報)

以下の環境を準備してください。

  • Python(3.8以降のバージョン)
  • 以下のライブラリがpipなどでインストールされている
    • yt-dlp
    • bs4
    • lxml

スクリプト

以下のextractor.pyを利用します。

import os
from bs4 import BeautifulSoup
from yt_dlp import YoutubeDL


# 手動設定箇所
URL = "https://www.youtube.com/watch?v=XjV4HYZTJB8"  # 対象動画のURL
LANG = "en" # "ja"に変更すると日本語で出力

# 変更不要設定
URLS = [URL]
FORMAT = "ttml"


# 動画タイトル取得
with YoutubeDL() as ydl:
    info = ydl.extract_info(URL, download=False)
    title = info["title"].replace(" ", "_")


# 字幕取得用オプション
ydl_opts = {
    "skip_download": True,  # 動画自体のダウンロードスキップ
    "writeautomaticsub": True,  # 自動設定字幕を取得
    "subtitleslangs": [LANG],  # 言語設定
    "subtitlesformat": FORMAT,  # 出力フォーマット(一次ファイルとして使ってます)
    "outtmpl": title  # 出力ファイル名
}

# 字幕ダウンロード(ファイル出力。この時点ではttml形式のごちゃごちゃした状態)
with YoutubeDL(ydl_opts) as ydl:
    ydl.download(URLS)


# 以下で一時的に出力したttml形式ファイルをtxt形式に整形
downloaded_file = f"{title}.{LANG}.{FORMAT}"
with open(downloaded_file, mode="r") as f:
    contents = f.read()

soup = BeautifulSoup(contents, "xml")
p_tags = soup.find_all("p")

subtitles = [tag.get_text() for tag in p_tags]  # pタグ内のテキスト情報だけ取得
subtitle = "\n".join(subtitles)
subtitle = "\n\n".join([info["title"], subtitle])
with open(f"{title}.{LANG}.txt", mode="w") as f:
    f.write(subtitle)


# 不要になった一次ファイル削除
os.remove(downloaded_file)

ファイル上部にあるURLとLANGの値を設定した後、以下のような形で実行すれば"動画タイトル.選択した言語.txt"というファイル名で字幕情報が出力されます。

python extractor.py

スクリプトの処理内容を簡単に説明します。

  1. 取得対象動画(URL)と出力言語(LANG)の設定
  2. 動画タイトル取得(yt-dlp利用)
  3. 字幕情報を抽出してttml形式でファイル出力(yt-dlp利用)
  4. ttml形式ファイルを読み込んで字幕に関する情報のみをtxt形式で出力
  5. 不要になったttmlファイルを削除

ttmlの形式の情報はxmlのような見た目をしていて不要な情報が多く読みにくかったので、タグなどの不要な情報を削ってtxtファイルとして出力しています。

まとめ

英語の動画を字幕付きで見ていたのですが、わからない単語があったときにすぐ調べることができずに面倒でした。字幕を抽出できればすぐにコピペで翻訳できていいなと思いスクリプトを作りました。

私の場合はMacを利用していて、txtの内容をメモにコピペして、分からない単語があったときにMacの翻訳を使って確認してます。

pythonは便利ですね。

直近でおすすめの本

直近十数冊読んだ中で一番おすすめの本です。

人が行動をするに至るまでのステップを科学的に分析した上で、その結果を習慣と紐付けて解説してくれている本です。

悪い習慣を断ち、良い習慣を継続する方法を詳細に説明してくれています。習慣が人を作っているので、この本の内容を実践できれば人生を大きく好転させられる気がしました。

この本の最初の方に説明があるのですが、複利という考え方があり毎日1パーセントだけの増加でもそれが続くととてつもない倍率になります。これは投資でよく用いられる概念ですが、良い習慣は未来への投資なので習慣にもあてはまります。良い習慣を身に付けるのは早ければ早いほど良いです。

私はまず長時間YouTubeを見てしまう習慣を断って、直近の業務に役立つITの勉強を習慣として身に付けよう思います。

PythonYouTube

Posted by ラプラス