まえがき:静止画の「沼」から抜け出したい
昨日のQiitaトレンド、見ましたか?
「ClaudeCodeで漫画を自動生成する」記事。あれ、めちゃくちゃ面白かったですよね。私も早速手元の環境で試して、無限に4コマ漫画を作って遊んでいました。
でも、エンジニアの性(さが)でしょうか。30分後にはこう思ってしまったんです。
「これ、動かないかな?」
2026年現在、画像生成はコモディティ化しましたが、**「ストーリー性のある動画の完全自動生成」**はまだ未開の地(ブルーオーシャン)です。
そこで昨晩、「LLMが脚本を書き、AI Video Generator が撮影する」完全自動パイプラインを組んでみました。
結論から言うと、Textideo のAPIを噛ませることで、驚くほど簡単に実装できてしまいました。
本記事は、その「技術的アプローチ」と「ハマりポイント」の共有です。
🏗 アーキテクチャ:"VideoOps" を構築する
やりたいことはシンプルです。「テキストを投げたら、編集済みのMP4が返ってくる」黒魔術的なAPIを作ること。
構成は以下の通りです。
graph TD
A[User Idea] -->|Prompt| B(Director Agent / Claude 3.5)
B -->|Script JSON| C{Scene Manager}
C -->|Visual Prompt| D[Textideo API (Renderer)]
D -->|MP4 Fragments| E[FFmpeg (Editor)]
E -->|Final Movie| F[Output]
- 脳(Brain): Claude 3.5 Sonnet (指示出しが一番的確なので)
- 目(Renderer): Textideo API (ここが重要。後述)
- 手(Editor): FFmpeg + Python
ユーザーがアイデア(Prompt)を投げると、Agentが脚本と絵コンテをJSONで作成。それをレンダリングエンジンが映像化し、最後に結合して出力します。
🔧 実装のハイライト
1. 監督Agentに「カメラワーク」を理解させる
LLMにただ「動画のプロンプト書いて」と言うと、「A cat is sitting」みたいな退屈な指示しか出しません。
映画的な映像を作るには、カメラワーク(Camera Movement) の指定が不可欠です。
システムプロンプトで、特定のJSON構造を強制します。
# director.py
class Scene(BaseModel):
narrative: str
visual_prompt: str = Field(..., description="Image generation prompt in English")
# ここがキモ。AI Video Generatorが理解できる物理カメラ指示を定義
camera_action: Literal["zoom_in", "pan_right", "static", "dolly_zoom"]
duration: int = Field(..., default=4)
こうすることで、Agentは「ここは悲しいシーンだから static で」「ここはオープニングだから pan_right で」といった演出意図をコードとして出力してくれるようになります。
2. レンダリングエンジンの選定(なぜ Textideo なのか?)
ここが今回一番悩んだポイントです。
動画生成AIは群雄割拠ですが、APIとして組み込む場合、以下の条件を満たす必要がありました。
- Instruction Following: 指定したプロンプト(特にライティングと構図)を無視しないこと。
- Consistency: キャラクターがシーンごとに別人にならないこと。
- Response Time: 同期処理で待てるレベルの速度。
いくつかの主要サービスをAPI経由で叩き比べた結果、今回は Textideo を採用しました。
決め手は 「Camera Control のAPIパラメータの追従性」 です。
多くのモデルは zoom_in と指定しても無視して勝手に動いたりしますが、Textideoのモデル(特に最新のVeo系)は、コードで指定したカメラワークを物理エンジンのように忠実に再現してくれました。
実装はこんな感じです。
# renderer.py
import requests
def render_scene(scene_data, api_key):
"""
Textideo APIを叩いて、シーンごとの動画を生成する
"""
url = "https://api.textideo.com/v1/generate"
payload = {
"prompt": scene_data['visual_prompt'] + ", cinematic lighting, 8k, photorealistic",
"video_settings": {
"aspect_ratio": "16:9",
# Agentが決めたカメラワークをそのままパラメータに流し込む
"camera_motion": scene_data['camera_action'],
"fps": 24
}
}
# 正直、ここでエラーハンドリングをサボると死にます(戒め)
try:
response = requests.post(url, json=payload, headers={"Authorization": api_key})
response.raise_for_status()
return response.json()['download_url']
except Exception as e:
print(f"Rendering failed: {e}")
return None
このコードを書いているとき、「あ、俺いま映画撮ってるわ」という謎の全能感に浸れます。
🚧 実際に踏んだ「地雷」と解決策
もちろん、一発ではうまくいきませんでした。
課題:シーン間のキャラ崩壊(Identity Loss)
Scene 1では金髪だった主人公が、Scene 2で急に黒髪になったりします。動画生成AIあるあるですね。
解決策:Seed Image Injection
Textideoの機能にある image_to_video を併用するアプローチに変えました。
- 最初に1枚だけ、主人公の「決定稿」となる画像を生成する。
- その画像をBase64化し、全シーンのAPIリクエストに
reference_imageとして渡す。
(ここに Consistency 制御のコードを挿入)
これを実装した瞬間、動画のクオリティが「実験」から「作品」に変わりました。
一人のキャラクターが一貫して物語の中を歩き回る様子は、感動すら覚えます。
🎁 成果物
スクリプトを実行して、コーヒーを淹れて戻ってきたら、指定したフォルダに final_movie.mp4 が生成されていました。
内容は「サイバーパンクな東京の夜明け」。
Agentが勝手に指定した pan_right のカメラワークで、ネオン街から朝焼けへと視点が移動していく映像美。
これを自分が一切手を動かさずに、Pythonスクリプトだけで作ったというのが信じられません。
(※ 生成された動画はX(旧Twitter)に貼っておきます)
🔮 まとめ:エンジニアは次の「クリエイター」になる
今回、AI Video Generator をAPIとしてワークフローに組み込んでみて感じたのは、**「動画制作はもはやプログラミングの対象である」**ということです。
絵心がなくても、カメラを持っていなくても、ロジックとAPIがあれば世界観を作れる。
特に Textideo のような、開発者フレンドリーなAPIを持つツールの登場で、この流れは2026年、さらに加速するでしょう。
皆さんもぜひ、手元の積み本(積読)をAgentに読ませて、その要約を「動画」として出力するパイプラインとか作ってみてください。絶対面白いので。
参考リンク
- [本プロジェクトのGitHubリポジトリ (WIP)]
- Textideo API Documentation
- [Claude 3.5 API Guide]
(LGTM👍 いただけると、次の「音声生成編」を書くモチベーションになります!)

