見出し画像

【Python】YouTubeTranscriptApiでYouTube動画の字幕情報を抽出する

YouTube動画から字幕情報を抽出することは、言語学習、コンテンツ分析、アクセシビリティ向上など多くの用途に役立ちます。Pythonといくつかのライブラリを使用することで、自動化された方法でこれを実現できます。この記事では、Pythonを使ってYouTube動画の字幕をダウンロードし、抽出する手順について詳しく説明します。

必要なライブラリ

今回はYouTubeTranscriptApiというライブラリが使用されます。このライブラリはYouTube動画のダウンロードや情報の抽出を容易にする強力なツールです。

インストール方法

まずライブラリをpipコマンドでインストールします

$ pip install youtube-transcript-api


YouTube動画の字幕を抽出する手順


1. YouTube動画から字幕をダウンロード


ライブラリを使用して、特定のYouTube動画の字幕をダウンロードします。以下は、動画のURLを使用して字幕を抽出し、利用可能な字幕の言語を表示し、特定の言語の字幕をダウンロードするサンプルコードです。

今回は試しにヒカキンの動画の字幕をダウンロードしてみます

https://www.youtube.com/watch?v=nOzW1zieR7w


サンプルコード

from youtube_transcript_api import YouTubeTranscriptApi

video_id = "nOzW1zieR7w" # 字幕を出力する動画のID(v=以降)
transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)

for transcript in transcript_list:
    for tr in transcript.fetch():
        print(tr) # {'text': '字幕のテキスト情報', 'start': 字幕の開始時間, 'duration': 字幕が表示されている時間}


<実行結果>
実行すると下記のようなアウトプットが得られます

{'text': 'HIKAKIN', 'start': 0.719, 'duration': 3.0} {'text': 'TVハローYouTubeどうも', 'start': 5.04, 'duration': 5.76} {'text': 'HIKAKIN', 'start': 8.36, 'duration': 2.44} {'text': 'ですこの度私', 'start': 11.0, 'duration': 9.72} {'text': 'HIKAKIN30代の一般女性と', 'start': 14.24, 'duration': 6.48} {'text': 'けけけ結婚しまし', 'start': 25.519, 'duration': 9.761} {'text': 'たあああああああ', 'start': 28.96, 'duration': 6.32} {'text': '[音楽]', 'start': 39.44, 'duration': 4.23} {'text': 'う', 'start': 46.879, 'duration': 3.0} {'text': '[音楽]', 'start': 56.15, 'duration': 4.91} {'text': 'ああ', 'start': 58.92, 'duration': 5.229} {'text': '[音楽]', 'start': 61.06, 'duration': 3.089} {'text': '[音楽]', 'start': 67.98, 'duration': 3.759}…

ここからテキスト情報だけを保存して.txtに出力する場合は下記のようになります

from youtube_transcript_api import YouTubeTranscriptApi

video_id = "nOzW1zieR7w"
transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)

# 日本語の字幕を取得し保存
transcript = transcript_list.find_transcript(['ja'])
transcript_data = transcript.fetch()

# テキストファイルに字幕のテキスト部分のみを保存
with open("output_captions.txt", "w", encoding='utf-8') as file:
    for item in transcript_data:
        text = item['text'].replace('\n', ' ')  # 改行をスペースに置き換え
        file.write(text)  # 各字幕を新しい行に書き出し

print("字幕のテキストが正常に保存されました。")


2. 字幕データの解析と利用

基本的に字幕データは、.srtフォーマットで保存されます。このフォーマットでは、各字幕が時間コードと共に保存されるため、ビデオの具体的な部分に対応するテキストを簡単に特定できます。.srtファイルは、テキストエディタや専用のソフトウェアで開くことができます。先ほどの字幕情報をsrtとして書き出す際のサンプルコードは下記になります


from youtube_transcript_api import YouTubeTranscriptApi

video_id = "nOzW1zieR7w"
transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)


def seconds_to_srt_time_format(seconds):
    """秒をSRTファイル形式の時間に変換するヘルパー関数"""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    seconds = seconds % 60
    milliseconds = int((seconds - int(seconds)) * 1000)
    return f"{hours:02}:{minutes:02}:{int(seconds):02},{milliseconds:03}"


# 日本語の字幕を取得し保存
transcript = transcript_list.find_transcript(['ja'])
transcript_data = transcript.fetch()
with open("output_captions.srt", "w", encoding='utf-8') as file:
    for index, item in enumerate(transcript_data, start=1):
        start_time = seconds_to_srt_time_format(item['start'])
        end_time = seconds_to_srt_time_format(item['start'] + item['duration'])
        text = item['text'].replace('\n', '\n')  # 改行を保持
        # SRTフォーマットに従ってファイルに書き出す
        file.write(f"{index}\n")
        file.write(f"{start_time} --> {end_time}\n")
        file.write(f"{text}\n\n")

print("字幕が正常にSRT形式で保存されました。")

まとめ


上記のコードは下記にまとめてあります
https://colab.research.google.com/drive/1CeLU66_WFeg4s4oyUaeUk5qrkbZe7ceh?usp=sharing

YouTube動画の字幕情報を抽出することは、多くの価値ある情報を提供し、多様な用途に役立ちます。youtube-transcript-apiを使用することで、このプロセスを簡単かつ効率的に行うことができ、Pythonの強力な機能を活用してさまざまなプロジェクトや研究に利用することが可能です。

この記事が気に入ったらサポートをしてみませんか?