【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
pip install yt-dlp
pip install bs4
pip install 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は便利ですね。

直近でおすすめの本

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

ビジネスデザイナーという肩書きを持つイノベーションシンキングの世界的第一人者である濱口秀司さんの書かれた本です。肩書きだけだとどのようなことをしている人か分かりにくいかもしれませんが、USBメモリやマイナスイオンドライヤーなど誰もが知る有名商品の産みの親の方です。

アメリカのコンサルタントの中でも最高額のコンサルティングフィーを受け取っている方で、私の友人から聞いた話だとこの人のコンサルティングを受けるためには1時間でも7桁の額は準備する必要があるとのことでした。

濱口秀司さんは自分の中でイノベーションを起こすための型を持っており、その型について本の中でかなり詳しく教えてくれています。革新的なアイデアを出す方法をここで詳細にはお伝えしませんが、とてもざっくりとまとめると以下の手順になります。

バイアスの特定→バイアスの破壊

革新とは現状の破壊です。現在世の中にあるバイアスを認知するところからアイデアの創出は始まります。この本ではバイアスを認知する方法、そして破壊する方法を詳しく述べてくれています。個人開発をしようとしているけど何を作れば良いか思い浮かばない方やや会社を立ち上げようとしている方に特におすすめの本です。

過去におすすめした本は以下の記事にまとめています。

PythonYouTube

Posted by ラプラス