MAGAZINE

ルーターマガジン

機械学習

ChatGPT APIを使ってYouTube動画を要約する

2023.08.25
Pocket

アルバイトのsasaokaです。今回はPythonのyoutube-transcript-apiとChatGPT APIを使って、字幕付きのYouTube動画を要約する方法を紹介します。

準備

openaiライブラリとyoutube-transcript-apiライブラリをそれぞれインストールします。

$ pip install openai youtube_transcript_api

OpenAIのAPIキーを環境変数OPENAI_API_KEYに設定します。

$ export OPENAI_API_KEY='sk-xxxxxx'

動画の要約

字幕はYoutubeTranscriptApiクラスのget_transcriptメソッドを用いて取得できます。引数に指定する動画IDはURL(https://www.youtube.com/watch?v=oStKFAyxB_0)のv=以降の部分です。

このメソッドの返り値は字幕テキスト、開始時刻、表示秒数の値が入った辞書のリストです:

[{'text': '[音楽]', 'start': 2.009, 'duration': 6.811},
 {'text': '帰れば金麦', 'start': 6.06, 'duration': 3.539},
 ...
]

このtextを改行区切りで結合したものを動画全体の字幕として用いました。

from youtube_transcript_api import YouTubeTranscriptApi

youtube_link = 'https://www.youtube.com/watch?v=oStKFAyxB_0'
video_id = youtube_link.split('?v=').split(-1)
srt = YouTubeTranscriptApi().get_transcript(video_id, languages=['ja'])
transcript = '\n'.join([chunk["text"] for chunk in srt])

次にChatGPTを用いて動画字幕を要約させます。今回は弊社のアドクロールにある広告動画を用いるため、「この広告動画を要約してください」というプロンプトにしました。

import openai

response = openai.ChatCompletion.create(
    model='gpt-3.5-turbo',
    messages=[
        {'role': 'system', 'content': '質問に日本語で答えてください。'},
        {'role': 'user', 'content': f'この広告動画を要約してください: {transcript}'}
    ],
    temperature=0
)

responseは次のような辞書になっているため、response['choices'][0]['message']['content']とすれば回答部分だけを取り出せます。

{
    "choices": [
        {
            "finish_reason": "stop",
            "index": 0,
            "message": {
                "content": "この広告動画は、帰宅したら金麦を飲もうというメッセージを伝えるものです。帰宅すると、自分の好きな格好で、好きなものを食べて、空を見上げて、ちょっと浮かれた気分になります。そして、1日頑張った自分や1年頑張った自分にお疲れさんと言いながら、金麦を飲むことでリラックスしましょう。",
                "role": "assistant"
            }
        }
    ],
    "created": 1685772042,
    "id": "chatcmpl-7NEbagpguwcMgSnwJAPFfqlEiDp3u",
    "model": "gpt-3.5-turbo-0301",
    "object": "chat.completion",
    "usage": {
        "completion_tokens": 152,
        "prompt_tokens": 160,
        "total_tokens": 312
    }
}

以上をまとめると、コマンドライン引数としてYouTubeのURLを渡し、要約文を標準出力に出力するコードは次のようになります。

import sys

import openai
from youtube_transcript_api import YouTubeTranscriptApi

video_id = sys.argv[1].split('?v=')[-1]
srt = YouTubeTranscriptApi().get_transcript(video_id, languages=['ja'])
transcript = '\n'.join([chunk["text"] for chunk in srt])

response = openai.ChatCompletion.create(
    model='gpt-3.5-turbo',
    messages=[
        {'role': 'system', 'content': '質問に日本語で答えてください。'},
        {'role': 'user', 'content': f'この広告動画を要約してください: {transcript}'}
    ],
    temperature=0
)
print(response['choices'][0]['message']['content'])

temperatureの変更

ChatGPTのAPIではtemperatureというパラメータがあります。これは生成するテキストの多様性を制御するパラメータで0から1の間の数値で指定します。temperatureが低い場合、生成されるテキストはより厳密になります。temperatureが高い場合、生成されるテキストはより多様性がある一方で、不正確な回答が生成される可能性があります。

上記の例と同じ動画を用いて、temperatureパラメータを0, 0.5, 1の3つの値それぞれで要約文を作って比較してみました。

字幕は以下です。

[音楽]\n帰れば金麦\n帰れば\n好きな格好で\n帰れば\n好きなもの食べて\n帰れば\n空を見上げて\n帰ればちょっと浮かれて\n帰ればなんだかんだ1日頑張った自分に1\n年頑張った自分にお疲れさんと\n帰れば金麦

まずtemperatureを0にしたときの回答は次のようになりました。

この広告動画は、帰宅したら金麦を飲もうというメッセージを伝えるものです。帰宅すると、自分の好きな格好で、好きなものを食べて、空を見上げて、ちょっと浮かれた気分になります。そして、1日頑張った自分や1年頑張った自分にお疲れさんと言いながら、金麦を飲むことでリラックスしましょう。

字幕に出てくる単語をほとんどそのまま使って要約がされています。次はtemperatureを0.5にしたときの要約文です。

この広告動画は、帰宅したら自分の好きなことをしてリラックスすることが大切だというメッセージを伝えています。そして、そのリラックスタイムに金麦というビールを飲むことで、1日や1年頑張った自分にお疲れさんという気持ちを伝えることができるという内容です。

「リラックスタイム」など、元の字幕にはない単語が使われていますが、内容は正しいです。

「帰れば金麦」というキャッチフレーズの元、ビールの金麦を宣伝する広告動画です。自分らしく過ごした1日を終えて帰り、好きな格好で好きなものを食べながら空を見上げ、浮かれた気分でお疲れさんと自分を労って、その一環として金麦を飲もうという内容です。音楽に合わせた色鮮やかな映像が特徴的です。

「音楽に合わせた色鮮やかな映像」という、与えられていない情報が回答に含まれています。回答の正確さを重視したいときはtemperatureを0に近い値にしておくのが良さそうです。

おわりに

今回はyoutube-transcript-apiとChatGPT APIを用いて字幕付きYouTube動画の要約を行う方法とtemperatureパラメータによる回答の違いを紹介しました。長い動画の内容を大まかに確認したい時に使ってみてはいかがでしょうか。

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから