【悪用厳禁】youtube動画をAIに理解させてテキストコンテンツを自動生成
皆様ハロー、季節の変わり目で頭痛が痛いスマイルです('ω')ノ
今回はchatGPTを活用したコンテンツ自動生成系のネタを持って参りました、一言で言うと"AIにyoutube見せてテキストコンテンツを自動生成させよう"という試みです。
動画をAIに解釈させる手法って動画音声の入力からが多かったと思いますが、今回は動画のシーン解析と音声解析をセットにしてchatGPTに渡してみたら、思ったよりも精度が高く"このまま使えるやん"と気付きましたのでお披露目します。
記事が面白かったらフォロー&♥よろしくお願いしますm(_ _)m
動作はこんな感じ
動画内容を把握するシステムって色々ありますが、"音声+映像+LLM"の組み合わせって僕は見た事なかったので作って見ましたら、想像よりも汎用性の高そうな物に仕上がりました。
用途
当システム最大のメリットは"人間が動画を見なくても高い精度でAIが内容を把握できる"事で、要は疑似的な【目+耳+脳みそ】のコンボを個人が安価に利用できるようになったという点です。
各業界の隅々まで調べれば数えきれないくらいのニーズを発掘できると思いますが、ぱっと思い付いたのはこんな感じ。
いかがでしょうか。LLM使ってテキストコンテンツを生成している方も多いと思いますが、内容がイマイチだと思った事ありません?
当システムはプロンプトだけでなく動画情報をベースとしてスタートするので、こちらが細かく指示しなくても似たような雰囲気の動画を指定するだけで、いい感じのテキストを出力してくれます。
コスト
延べ10数時間程度の動画解析を行った結果、金額のボリューム感はこんな感じに。
200円くらいでした、安っ!
生成したコンテンツのボリューム的には、ブログ記事にして1ヶ月分は出力したと思います。
課金額はchatGPTへの入出力トークン数で決まりますんで、インパクトの大きい要素は①シーン切替数,②レスポンスの文字数です。
つまり、長時間の動画やシーン切替検出の感度を高くするとコストは増加しますが、いずれもパラメータによってコントロールできますし、ほぼ無制限で使用した結果が上記画像なのでこんなもんです。
必要な物
python
openaiAPIKEY
openaiアカウントへお金チャージ
パソコンのスペックも高級な物は不要です、GPUなしでも十分に使えるように作りました。
仕組み
ざっくり工程をまとめるとこんな感じ。
割とシンプル構成かなと思います。
動画取得
youtube動画の取得はyt_dlpが使いやすくてお気に入りです。
映像解析
色々検討した結果、現状では"scenedetect+GPT-4o-mini"のコンボが安価で高精度という結論になりました。やっている事はこんな感じ。
例えばこの動画を映像解析してみるとこんなレスポンスが返ってくる。
かなり精度高くないですか?音声データなしですよ。
音声解析
whisperというライブラリがあるのでこれ1本で解決、ちなみにwhisperもopenAI製。ヤバすぎ。
使いごこちは記事にまとめましたので気になる方は一読下さい。
chatGPTで返答
上記の映像解析と音声解析で計算した結果をopenaiAPI経由でまたまたGPT-4o-miniへ渡します。
この時に一緒に渡すプロンプトで返答内容を指示できます、これは上記の章"用途"で出したアイデアの話ですね。台本を作って下さい/インタビューを要約して下さい/評論して下さいみたいな事です。
で、これらの作業をやってみるとこんな感じで返答してくれます。
【サンプル1:専門性の高いコンテンツをテキスト化】
messages = [
{
"role": "user",
"content": [
{
"type": "text",
"text": f'''
以下は動画の映像と音声の解析結果です\n
マニュアルを作成するための詳細なアウトラインを作成して下さい\n
各アウトラインごとに分かりやすく読み応えのある解説テキストを生成して下さい\n
解説のテキストは
🎬 **映像解析結果**:
{analysis_results}
🎧 **音声解析結果**:
{transcription_results}
'''
}
]
}
]
【サンプル2:時事ニュースをSNS用に短縮】
messages = [
{
"role": "user",
"content": [
{
"type": "text",
"text": f'''
以下は動画の映像と音声の解析結果です\n
ニュース映像をSNSで投稿するために映像・音声両面から要点を分かりやすくまとめて欲しい\n
🎬 **映像解析結果**:
{analysis_results}
🎧 **音声解析結果**:
{transcription_results}
'''
}
]
}
]
【サンプル3:youtunerの台本再現】
messages=[
{"role": "system", "content": "あなたはyoutube専門の脚本家です、視聴者が最後まで見てしまうような台本を書いて下さい"},
{
"role": "user",
"content": [
{
"type": "text",
"text": f'''次の映像解析と音声解析の結果から動画の台本を作成して下さい\n
台本には元動画を参考にしてオリジナルな要素を追加して下さい\n
映像解析: {analysis_results}\n
音声解析: {transcription_results}'''
}
]
}
]
レスポンスに関してはプロンプトを研究すればもっと精度が精度が上がると思いますが、仕組み的には実用レベルと言えそうです。
課題
今回作ったシステムは個人が手元で使う分には十分なレベルと思いますが、改善ポイントとして課題に感じている事が3つあります。これらを解消できれば普通に有料サービスとして通用するんじゃないかしら。
処理の高速化
普通のパソコンで使う事を前提に作りましたんでCPUで動作する仕組みになっています、つまり"まぁまぁ遅い"って事です。
例えばこの動画を処理するとこれくらいの時間が必要。
8:13の動画を処理するのに6:40くらいかかりました。
これはpytorchとかでGPUに対応させれば割と簡単に改善できる気がします。
最終的にはシーン検出精度と処理速度がトレードオフなので、精度を取るか速度をとるかという話になると思いますが、とりあえずGPUに対応させれば爆速になるハズです。
whisperで話者分離
whisperはデフォで声の分類ができません、どのセリフを誰が言ったか分類できれば恐らくcahtGPTのレスポンス精度も向上するでしょう。
研究している方は結構いるので、実装はそこまで難しくは無さそうに思います。
GPT-4o-miniの入出力限界
GPT-4o-miniは入力で128,000トークン / 出力で16,384トークンが上限です。
日本語で言えば入力:約160,000文字 / 出力:20,000文字程度ですが、当システムはテキストだけでなく映像もトークン化してchatGPTに渡しているので、入力できるトークン数はさらに制限されます。
こちらもシーン検出精度とトレードオフなので"動画時間が〇分なら〇トークン"とは一概には言えませんが、実際に使っている感じだと数十分程度の動画であればレスポンスに不足なしという印象です。
もし128kトークン制限に抵触するほど長大な動画を処理する場合は、動画側を一定時間以下に分割してからchatGPTに渡してレスポンスを結合する、みたいな処理が必要になると思います。
コピペスクリプト
まずファイルの構造はこちら。
【requirements.txt】
annotated-types==0.7.0
anyio==4.6.0
Brotli==1.1.0
certifi==2024.8.30
charset-normalizer==3.4.0
click==8.1.7
colorama==0.4.6
distro==1.9.0
exceptiongroup==1.2.2
filelock==3.16.1
fsspec==2024.9.0
h11==0.14.0
httpcore==1.0.6
httpx==0.27.2
idna==3.10
Jinja2==3.1.4
jiter==0.6.1
llvmlite==0.43.0
MarkupSafe==3.0.1
more-itertools==10.5.0
mpmath==1.3.0
mutagen==1.47.0
networkx==3.4.1
numba==0.60.0
numpy==2.0.2
openai==1.51.2
openai-whisper @ git+https://github.com/openai/whisper.git@25639fc17ddc013d56c594bfbf7644f2185fad84
opencv-python==4.10.0.84
pillow==10.4.0
platformdirs==4.3.6
pycryptodomex==3.21.0
pydantic==2.9.2
pydantic_core==2.23.4
regex==2024.9.11
requests==2.32.3
scenedetect==0.6.4
six==1.16.0
sniffio==1.3.1
sympy==1.13.3
tiktoken==0.8.0
torch==2.4.1
tqdm==4.66.5
typing_extensions==4.12.2
urllib3==2.2.3
websockets==13.1
yt-dlp==2024.10.7
【main.py】
import os
import shutil
import time
from youtube_dl import download_youtube_video
from scene import detect_scene_changes_pyscenedetect
from scene_analysis import analyze_image
from transcription import transcribe_video
from make_text import create_text_manual
def main():
start_time = time.time() # 処理開始時間を記録
video_id = "video_id"
video_path = f'videos\\{video_id}.mp4'
images_folder = './images'
videos_folder = './videos'
# 動画と画像をリセット
shutil.rmtree(videos_folder)
os.mkdir(videos_folder)
shutil.rmtree(images_folder)
os.mkdir(images_folder)
# YouTube動画ダウンロード
download_youtube_video(video_id, "./videos")
# シーン検出
scene_changes = detect_scene_changes_pyscenedetect(video_path)
# 画像の解説
analysis_results = [] # 解析結果を保存するリスト
for scene in scene_changes:
image_path = scene['image_path']
result = analyze_image(image_path)
if result:
scene_analysis = {
'scene_number': scene['scene_number'],
'start_time': scene['start_time'],
'end_time': scene['end_time'],
'image_path': scene['image_path'],
'analysis': result
}
analysis_results.append(scene_analysis)
print(f"Scene {scene['scene_number']}: Start: {scene['start_time']:.2f}s - End: {scene['end_time']:.2f}s\nImage Path: {scene['image_path']}\nAnalysis: {result}\n")
else:
print(f"Error processing {image_path}")
print(analysis_results)
# ビデオの文字起こし
transcription_results = transcribe_video(video_path)
print(transcription_results)
# テキストマニュアルの生成
manual = create_text_manual(analysis_results, transcription_results)
# 生成されたマニュアルをファイルに保存
with open('contents.txt', 'w', encoding='utf-8') as f:
f.write(manual)
end_time = time.time() # 処理終了時間を記録
elapsed_time = end_time - start_time # 経過時間を計算
print(f"処理が完了しました。所要時間: {elapsed_time:.2f}秒")
if __name__ == "__main__":
main()
【youtube_dl.py】
ここから先は
Amazonギフトカード5,000円分が当たる
よろしければサポートお願いします、頂いたサポートは活動費として使用させて頂きより有意義な記事を書けるように頑張ります!