2026-09-04 / 構築記録

Gemini × Claude Code
動画解析・自動生成マニュアル

動画をAIに読ませて「編集の型」を数値で取り出し、その型どおりのショート動画を自動で書き出すまで。実際に構築したときの記録なので、つまずいた箇所もそのまま残しました。

対象 ターミナルでコマンドを実行できる人 初回構築 約2時間 つまずき 15件 解析費用 動画1分あたり約0.7円

00この手順で作ったもの

下の3本は、この手順で実際に書き出した動画です。左から順に、作業が進んだ順に並んでいます。いきなり完成品を目指さず、8秒だけ作って目で確かめるのがこの手順の要です。

1. まず8秒だけ解析で得た「最初のカット切替は2秒」「背景は回転する集中線」だけを実装した検証用。ここで文字のはみ出しが見つかった。 8秒 / 音声なし / 240フレーム
2. 音声を付けるVOICEVOXで3名の掛け合いを作り、その実測の長さに映像を合わせた。テロップは発話の開始と完全に同期している。 26.8秒 / 音声17本 / 805フレーム
3. 解析し直して直す14秒だけを5コマ/秒で解析し直し、コメント枠が1つずつ出て積み上がること、上段が青・下段が赤であることを反映した。 31.5秒 / 943フレーム / 追加費用 1.4円

01全体像

参考にしたい動画のURLYouTubeならダウンロード不要。そのまま渡せる
人間
編集ルールを取り出すカット秒数・テロップ・構成・テンポをJSONで
Gemini API
ナレーションを作るVOICEVOX。無料・商用可・完全にローカル
手元のPC
1枚ずつ絵を描くPython + Pillow。943フレームでも費用は0円
手元のPC
MP4にまとめるffmpeg
手元のPC
台本・ネタ・素材選びここだけは自動化できなかった
人間
この方法の要点

AIに動画を「描かせない」。AIが書くのは動画を描くプログラムで、943フレームを実際に描くのは手元のパソコンです。だから枚数が増えてもAIの利用量は増えません。
そして音声が先、映像が後。先に喋らせて、その実際の長さに映像を合わせます。逆順にすると、テロップと声がずっとズレたままです。

02前提(入っているもの)

必要なもの確認コマンド無ければ
Node.js 20以上node -v公式サイトから
Python 3.9以上python3 -VmacOSに標準
ffmpegffmpeg -versionbrew install ffmpeg
Pillowpython3 -c "import PIL"pip install pillow
日本語フォントls ~/Library/Fonts/Google Fontsから
VOICEVOXls -d /Applications/VOICEVOX.app公式サイトから

構築時の実測は Node v25.2.1 / Python 3.10.4 / Pillow 12.2.0 / ffmpeg 9.0.1 / VOICEVOX 0.25.0 でした。

03APIキーを取る

ブラウザで https://aistudio.google.com/apikey を開きます。トップページから探すより確実です。無ければ「Create API key」を押し、出てきた AIza で始まる39文字をその場でコピーします。

つまずき①画面のボタンが見当たらない

英語のページなので、ブラウザの自動翻訳が効いていると表示が崩れてボタンの位置が変わります。

画面がおかしいと思ったら、まず翻訳を切ってください。アドレスバー右の翻訳アイコンから「英語のまま表示」。

つまずき②無料枠のままで進めてよいか

請求先アカウントを紐づけていない無料枠では、送ったデータがサービス改善に使われる可能性があります。

自分だけが映っている動画なら無料枠で構いません。第三者が映っている・声が入っている動画は、課金枠に切り替えてから送ってください。ここは後から取り消せません。

04使えるモデルを確かめる

キーを .env に書き(chmod 600.gitignore を忘れずに)、使えるモデルを一覧します。外部パッケージは要りません。Node標準の機能だけで動きます。

$ node --env-file=.env scripts/list-models.mjs
つまずき③一覧に出ているのに使えないモデルがある
HTTP 404  This model is no longer available to new users.

一覧に載っていても、使えるとは限りません。必ず短いテキストを1回投げ、実際に応答するか確かめてから本番に使ってください。

つまずき④最新モデルは動画で止まる

参考にした記事が名指ししていた最新のFlashモデルは、テキストなら36秒で応答するのに、動画を投げると5回リトライして全部これでした。

HTTP 503  This model is currently experiencing high demand.

混んでいたのは動画処理の側でした。ひとつ前の世代のFlashモデルに落としたら15.7秒で通り、解析の質も落ちませんでした。あわせて -latest のような別名は中身が最新モデルを指すため同じ混雑に巻き込まれます。モデル名は世代を固定して指定してください。

つまずき⑤最初の1回だけ2分以上返ってこない

初回のリクエストが120秒経っても返らず、失敗したと思って中断しました。放置していたら正常に完了していました。

無料枠では最初の1発が待たされることがあります。すぐ失敗と判断せず、待つかバックグラウンドで走らせてください。

つまずき⑥macOSに timeout コマンドが無い
(eval):1: command not found: timeout

シェルに頼らず、スクリプトの中で打ち切る仕組み(JavaScriptなら AbortSignal.timeout)を持たせるほうが確実です。あわせて503と429は必ず起きるので、5秒 → 10秒 → 20秒 → 40秒 → 60秒で再挑戦する処理を最初から入れておきます。

05動画を解析する

$ node --env-file=.env scripts/analyze-youtube.mjs "<URL>" <モデル> <保存名>

カットの平均の長さ、総カット数、切り替えの合図、テロップの位置と文字数、起承転結の秒数配分、オチの作り方まで返ってきます。手元のファイルは、いったんGoogleにアップロードしてから解析します(上限2GB、保管は48時間)。

つまずき⑦見積もりが実測と3倍ずれた

公開値(映像258トークン/コマ × 1コマ/秒 + 音声32トークン/秒 = 約290トークン/秒)で計算して「1時間の動画は枠に入らない」と判断しました。

実測は1秒あたり91〜97トークン。約3分の1でした。

実用的な見積もり式 = 動画の分数 × 0.67円
解析した動画入力トークン所要費用
ショート動画 60秒5,82815.7秒1.3円
ショート動画 3本(TikTok)6,208〜6,57430〜238秒各1.8〜2.0円
14秒の区間を5コマ/秒5,3951.4円
Zoom録画 76分52秒419,808105.4秒51.3円
つまずき⑧質問を追加するたびに全額かかる

一度アップロードした動画に別の質問を投げたら、入力トークンがまた全額(419,808)計上されました。アップロードは省けても、動画の読み込みは毎回やり直しです。

「あれも聞けばよかった」でもう51円。聞きたいことは1回のプロンプトに全部詰めてください。

つまずき⑨細部が取れないときは、全編ではなく区間を切る

全編を1コマ/秒で解析すると「テロップは白背景に青枠」程度しか返りません。

14秒だけを5コマ/秒で解析したら、「上段は青枠・下段は赤枠」「アニメーションなしで1フレームで出現」「古い枠は消えずに残る」まで取れました。料金はほぼ同じ(1.4円)です。短い区間なら密度を上げてもトークンが増えません。

06動画を作る

つまずき⑩ffmpegに文字を描く機能が入っていなかった

インストール直後、日本語テロップを描こうとしてこうなりました。

[AVFilterGraph] No such filter: 'drawtext'
$ ffmpeg -buildconf | grep -i freetype   # → 何も出ない
$ ffmpeg -filters | grep subtitles       # → 字幕フィルタも無い

解決策は、ffmpegで文字を描くのをやめることです。Pillowで1枚ずつ絵を描き、ffmpegには「フレームをつなぐ」だけをさせます。結果的にこちらのほうが良く、可変フォントの太さを細字から極太まで選べるので、参考にした記事の著者が困っていた「フォントが太すぎて文字が潰れる」問題を最初から回避できます。

f = ImageFont.truetype(FONT, 80)
f.set_variation_by_name("Black")  # Thin〜Black
つまずき⑪テロップが枠からはみ出す

1回目の書き出しで、テロップの2行目が枠の下に飛び出していました。これはコードを読んでも気づけません。目で見るしかありません。

「8秒だけ作って人間が確認する」手順が効くのは、このためです。直したあとは、文字の幅を測って収まるまでフォントサイズを段階的に下げる処理を入れておきます。

つまずき⑫日本語で1文字だけ次の行に落ちる

「歯医者で歯茎の状態を褒められた」+「わ」のように、最終行に1文字だけ残って不格好になりました。

最終行が1〜2文字になる場合はフォントを2ポイントずつ縮めて組み直す処理を入れると解消します。日本語では頻発するため、最初から入れておくのが早道です。

つまずき⑬確認用に切り出したフレームに文字が写っていない

「テロップが表示されていない」と誤解しましたが、切り出した時刻がちょうどカットの切り替わりの瞬間でした。

確認用のフレームは、切り替わりから1〜2秒ずらした時刻で切り出してください。

07音声を付ける(VOICEVOX)

$ open -a VOICEVOX
$ curl -s http://127.0.0.1:50021/version
つまずき⑭入っているのに繋がらない

アプリはインストール済みなのに応答がありませんでした。アプリを起動していないだけでした。VOICEVOXは起動して初めて窓口が開きます。

起動から応答までに数秒かかるので、繋がるまで待つ処理を入れておくと安定します。

音声を先に作り、その長さに映像を合わせる

ここが一番大事なところです。映像のタイミングを先に決め打ちすると、テロップと声が必ずズレます。

  1. 全ての台詞をVOICEVOXで音声にする
  2. 1本ずつの実際の長さを測る
  3. その長さを足し合わせて「何秒に何を出すか」の表を作る
  4. その表どおりに絵を描く

実際にやると、項目ごとの長さは4.4秒・3.8秒・4.6秒とバラバラです。それが正しい状態です。喋り終わったら次へ進む、自然な作りです。

解析で「話す速度は標準の1.2〜1.3倍」「発話の間の無音が極限までカットされている」と分かったので、速度1.25倍・発話前後の無音0.02秒・台詞の間隔0.06秒に設定しました。数値を自分で決めず、解析結果から取ってください。それがこの方法の意味です。

つまずき⑮ライセンスの表記を間違えていた

商用利用は無料ですが、使ったキャラクター名の表記が条件です。

VOICEVOX:四国めたん

「VOICEVOX」を「VOICEBOX」と書き間違えていた例がありました。誤字で済まず、条件を満たしていない扱いになりかねません。キャラクターごとに個別の規約もあるので、公開前に確認してください。

08設計で学んだこと

09試して駄目だった道

試したこと結果代わりにやったこと
ffmpegの drawtext で日本語を描く機能が入っていないビルドで、そもそも使えないPillowで描いてffmpegでつなぐ
最新世代のFlashモデルに動画を投げる5回リトライして全部503ひとつ前の世代。15.7秒で完了
公開値からトークン数を計算実測と3倍ずれた短い動画で1本実測してから計算
timeout コマンドで打ち切るmacOSに入っていないスクリプト内で打ち切る
既製の専用ソフト(ゆっくりMovieMaker4)Windows専用。macOS非対応で対応予定も無し手元の環境で組む(この手順)

10安全のためのルール

11コマンド早見表

やりたいことコマンド
使えるモデルを一覧するnode --env-file=.env scripts/list-models.mjs
モデルが今応答するか調べるnode --env-file=.env scripts/probe.mjs <モデル>
YouTubeの動画を解析するnode --env-file=.env scripts/analyze-youtube.mjs "<URL>" <モデル> <保存名>
一部の区間だけ細かく解析するnode --env-file=.env scripts/analyze-segment.mjs "<URL>" <開始> <終了> <プロンプト> <コマ数>
手元のファイルを解析するnode --env-file=.env scripts/analyze-file.mjs <ファイル> <モデル> <保存名>
VOICEVOXを起動するopen -a VOICEVOX
動画を書き出すpython3 build/make_with_voice.py
確認用に1フレーム切り出すffmpeg -y -ss <秒> -i <動画> -frames:v 1 out.png

12まだやっていないこと

このマニュアルは実際にやったところまでしか書いていません。次は未検証です。