🦜

ChatGPTにyoutubeの要約をさせてみた

2023/12/21に公開

ChatGPTにyoutubeの要約をさせてみた

何かと便利なChatGPTですが、音声や動画には対応していません(アプリ版では音声入力は可能)。今回はyoutubeの動画をwhisperを使って文字起こしを行い、その後LangChainを使ってその内容をChatGPTに参照させてみます。
結果から言うと結構いい精度でまとめてくれます。whisperは話者によって精度が結構下がるのですが、それをChatGPTが補っているような結果になりました。
現在はネットから情報を収集する手段はスクレイピング(html解析)ですが、今後は動画サイトから情報をとってくるような世の中になるかもしれませんね。

Whisperとは

WhisperはOpenAIが開発した文字起こしAIです。翻訳も行え、字幕作成など様々な用途で使えます。OpenAIのAPIからでも使えますがお金がかかるので、google colabを使って公開されているモデルを使用します。またFaster whisperという通常より4倍ほど早いモデルもあるようなので今回はそちらを使います。
詳しいwhisperの説明はこちらの記事が分かりやすいです。
https://qiita.com/yoshi8__/items/0124a5a0c83c9b4e2669

LangChainとは

LangChainは大規模言語モデルを様々な分野に活用できるライブラリです。ChatGPT以外にもLlamaやGPT4ALLなどの無料モデルも使えます。LangChainを使えばGPTに検索させたりSlackのボットを作れたり様々なことができるようです。
こちらの記事ではLangChainの概要を分かりやすくまとめてくださっています。
https://zenn.dev/umi_mori/books/prompt-engineer

pdfを要約させる方法も紹介しています。よろしければどうぞ!
https://zenn.dev/awesome_ai_tech/articles/0e0429e414bd86

実装方法

Youtubeの要約の手順は大きく分けて3つになります。

  1. YoutubeのURLから動画の音声データを取得
  2. Whisperを用いて取得した音声から文字起こしを行う
  3. Youtubeの文章をChatGPTに教え、質問に答えてもらう
    今回はgoogle colabでコードを配布していますので、ぜひ遊んでみてください。

https://colab.research.google.com/drive/1e4RctcYIzAlDJIvQBjBDp1TLB5WpxaEq?usp=sharing

以降はコードの解説になります。興味のある方はご覧ください。

1. ライブラリインストール

使用するライブラリをインストールします。最近になってcolabのドライバーがcuda12になってしまったため、libcublas11をインストールしています。

!pip install "faster-whisper @ https://github.com/nyanta012/faster-whisper/archive/refs/heads/master.tar.gz"
!pip install transformers==4.27.2
!pip install yt-dlp
!pip install openai
!pip install chromadb
!pip install langchain
!pip install tiktoken
# colabがcuda12になってしまったためlibcublas11をインストール
!apt install libcublas11

2. ライブラリのインポート

ライブラリとWhisperを使用する準備をします。

import os
from yt_dlp import YoutubeDL

import openai
import chromadb
import langchain

from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains import ConversationalRetrievalChain

from langchain.chat_models import ChatOpenAI
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.callbacks import get_openai_callback

# import faster whisper
from faster_whisper import WhisperModel
!ct2-transformers-converter --model openai/whisper-large-v3 --output_dir /content/whisper-large-v3 \
    --copy_files tokenizer.json --quantization float16

model_path = "whisper-large-v3/"
model = WhisperModel(model_path, device="cuda", compute_type="float16")
#Whisper v3の場合はこの一行がいる
model.feature_extractor.mel_filters = model.feature_extractor.get_mel_filters(model.feature_extractor.sampling_rate, model.feature_extractor.n_fft, n_mels=128)

faster Whisper v3を使う時はmodel.feature_extractor.mel_filters~を実行してください。
またv2とv3の違いはこちらの記事がおすすめです!
https://zenn.dev/tsuzukia/articles/1381e6c9a88577

3. Youtubeの音声データ取得

今回はyt-dlpを使用してyoutubeから音声を取得します。Whisperはゆっくり音声との相性がなぜか良かったので、今回は僕が普段見ている動画を要約してみます。
https://www.youtube.com/watch?v=ULjieJKd1HM

Youtube_URL = "YouTube URL"

ydl_opts = {
    'outtmpl': '/content/audio.%(ext)s', #ファイルの名前を定義
    "format": "mp3/bestaudio/best",
    "postprocessors": [
        {
            "key": "FFmpegExtractAudio",
            "preferredcodec": "mp3",
        }
    ],
}

# ダウンロード
with YoutubeDL(ydl_opts) as ydl:
    result = ydl.download([Youtube_URL])

4. 音声データから文字起こし

Faster Whisperを用いて音声を文字起こしします。8分の動画で1分半くらいはかかってしまいます。

def create_file(results, file_name="text"):
    write_txt = "\n".join([data[2] for data in results])
    with open(f"{file_name}.txt", mode="a") as f:
        f.write(write_txt)
    return write_txt

file_name = "youtube_text"

#languageをenに変えると英訳してくれます
results, _ = model.transcribe("audio.mp3", language="ja")
youtube_text = create_file(results, file_name)

print(f"文字数:{youtube_text}")
#内容を確認したいときはコメントアウトを解除してください
# print(youtube_text)

#文章が長すぎる場合は分割
text_splitter = CharacterTextSplitter(
    separator = "\n\n",
    chunk_size = 1000,
    chunk_overlap  = 200,
    length_function = len,
    is_separator_regex = False,
)
youtube_text = text_splitter.create_documents([youtube_text])

文字起こしの内容を見てみると

ブラウザで使える暇つぶしにおすすめのウェブサイトを紹介していくぜ
待ってました
カプコンレトロゲームズ
まず最初に紹介したいのが
無料デスト2やロックマンが遊べる神サイトだ
これ完全にアウトなやつじゃ
実はこれカプコン公式なんだよ
イカれてやがる
現時点で遊べるラインナップがこちら
ファミコンスーファミ世代換気の名作ぞろいだな
さらにこのサイトはゲームパッドにも対応しており
細かいキー設定も可能です

結構いい精度で文字起こしをしていることがわかりますね。

5. 大規模言語モデル(LLM)読み込み

あなたのOpenAIのAPIKEYを入力してください。
言語モデルはなんでもいいですが、最大トークン数が多いほうが長尺の動画にも対応できます。

#あなたのAPI KEYを入力してください
os.environ["OPENAI_API_KEY"] = "Your OpenAI API KEY"
openai.api_key = os.getenv("OPENAI_API_KEY")

#gpt-4-1106-previewやgpt-3.5-turbo-1106などの最大token数が多い物を選んでください
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo-1106")
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")

vectorstore = Chroma.from_documents(youtube_text, embedding=embeddings, persist_directory="。")
vectorstore.persist()
youtube_GPT = ConversationalRetrievalChain.from_llm(llm, vectorstore.as_retriever(), return_source_documents=True)

6. 動画の内容を要約

queryにchatGPTに尋ねたいことを書いてください。日本語は一語で1~3トークンになり、英語より高くなります。そのため入力と出力は英語にしたほうが安くなります。今回は日本語で出力を行いかかる料金を検証しています。
with get_openai_callback() as cb:を使うとchatGPTの使用料金などを可視化してくれます。

query = "Please summarize in Japanese"
chat_history = []
with get_openai_callback() as cb:
    result = youtube_GPT({"question": query, "chat_history": chat_history})
    print(cb)
print(result["answer"])
出力
Tokens Used: 4438
	Prompt Tokens: 4263
	Completion Tokens: 175
Successful Requests: 1
Total Cost (USD): $0.004613
ブラウザで使える暇つぶしにおすすめのウェブサイトを紹介している動画です。様々なジャンルのウェブサイトが紹介されており、それぞれの特徴や面白さが語られています。例えば、カプコンのレトロゲームが遊べるサイトや、ドローはパーフェクトサークルなどが紹介されています。また、妖怪画像データベースや丸亀クエストなど、ユニークなサイトも紹介されています。

内容は合ってます。すごく無難な答えですが…。0.0046ドルは2023年12月20日では約0.66円らしいです。安いので気軽に使えますね!

まとめ

今回はyt-dlpWhisperLangChainを使ってYoutubeから文字起こしを行い、ChatGPTに内容を要約してもらいました。プログラミングのいろいろな物を調べて、それらを組み合わせ新たな物を作ることができて楽しかったです。これだからプログラミングはやめられませんね。またこの方法はいろいろと応用ができると思います。この方法を使えば動画から情報を取得する新たなスクレイピングになるかもしれません。ぜひ活用してみてください!

Discussion