動画生成AIの進化は目覚ましく、2026年現在、オープンソースで高い描写力を誇る「Wan2.1」や、商用レベルの高品質動画を生成できる「Luma Dream Machine」など、多様なモデルがWeb API経由で手軽に利用できるようになりました。
従来はブラウザ上のWeb UIでプロンプトを入力して手動ダウンロードを行うスタイルが一般的でしたが、バッチ処理やWebサービスへの組み込み、自動コンテンツ生成を行いたい場合は、Pythonなどのプログラミング言語からAPIを呼び出すパイプライン構築が不可欠です。
本記事では、Pythonを用いて最新の動画生成AI API(Replicate API経由のWan2.1およびLuma Official SDK)を呼び出し、プロンプトの送信から非同期ステータス監視、完成した動画ファイルのローカル保存までを全自動化する手順をステップバイステップで解説します。
※この記事は2026年9月時点の情報をもとに執筆しています。
| 項目 | 必須環境 / 条件 |
|---|---|
| OS | Linux (Ubuntu 22.04 LTS / 24.04 LTS), macOS, Windows (WSL2推奨) |
| Python バージョン | Python 3.10 以上(Python 3.11 / 3.12 推奨) |
| 必要ライブラリ / SDK | replicate (v0.25.0+), lumaai, requests, python-dotenv |
| API キー | Replicate API Token / Luma Platform API Key |
| 想定所要時間 | 約15〜20分 |
こんな方に向けた記事です
- Pythonを使ってAI動画生成(Wan2.1やLuma Dream Machine)をプログラムから全自動化したいエンジニア
- 動画生成AIの非同期処理(タスク発行・ポーリング・ダウンロード)の実装パターンを学びたい方
- 商用や自作アプリ向けにAI動画コンテンツの自動作成パイプラインを組み込みたいクリエイター
1. 概要:AI動画生成の自動化と2つのアプローチ
2026年現在、AIによる動画生成技術は実用段階に入っています。短尺動画広告、ソーシャルメディア用コンテンツ、ゲーム用背景動画など、多様なユースケースにおいてAI生成動画が活用されています。
プログラマティックに動画を生成する際、現在主要となるアプローチは以下の2つです。
- オープンソースモデルのクラウドAPI実行(Wan2.1 on Replicate等): Alibaba Cloudが公開した高性能オープンソース動画生成モデル「Wan2.1」を、ReplicateなどのAIホスティングプラットフォーム経由で利用します。従量課金コストが比較的安価で、カスタマイズの柔軟性が高い特徴があります。生成スピードは約45秒/本、コストは1回あたり約$0.15です。
- プロプライエタリモデルの公式SDK利用(Luma Dream Machine等): Luma Labsが提供する商用高品質動画生成AI「Dream Machine」の公式APIを利用します。複雑なカメラワーク指定や一貫性のある被写体描写に優れており、生成速度は約30秒/本、コストは1回あたり約$0.20です。
本チュートリアルでは、これら2種類のモデルを同一のPython環境から呼び出し、統一されたインターフェースで自動生成できるパイプラインの構築を目指します。
2. 前提条件と事前準備
実装を始める前に、必要なアカウントの作成とAPIキーの発行を行っておきます。
1. Replicate API Tokenの取得
Replicate公式サイトにアクセスしてアカウントを作成し、アカウント設定の「API tokens」ページから新しいアクセストークンを作成してください。
2. Luma Platform API Keyの取得
Luma Platform公式サイトにアクセスして開発者登録を行い、ダッシュボードからAPIキーを発行します。
3. 環境変数の作成
プロジェクトのルートディレクトに .env ファイルを作成し、取得したAPIキーを設定します。
cat << 'EOF' > .env
REPLICATE_API_TOKEN=r8_your_replicate_api_token_here
LUMA_API_KEY=luma-secret-key-your-token-here
EOF
3. 環境セットアップ
ここでは、Python仮想環境を作成し、動画生成に必要な公式SDKおよびHTTPリクエスト用ライブラリをインストールします。
まず、プロジェクト用のディレクトリを作成して移動し、Pythonの仮想環境(venv)を構築・有効化します。
mkdir -p ai-video-pipeline && cd ai-video-pipeline
python3 -m venv venv
source venv/bin/activate
次に、必要なサードパーティ製パッケージを一括インストールします。
pip install --upgrade pip
pip install replicate lumaai requests python-dotenv
ライブラリのインストールが正常に完了したか確認するためのコマンドです。
python3 -c "import replicate, lumaai, requests, dotenv; print('Setup completed successfully!')"
上記コマンドの実行結果出力例は以下の通りです。
Setup completed successfully!
4. 手順1:Wan2.1(Replicate API)による動画生成スクリプトの実装
オープンソースの最新動画生成AI「Wan2.1」をReplicate API経由で呼び出すスクリプトを作成します。動画生成処理は完了までに時間を要するため、APIはタスクを非同期で受け入れます。
Wan2.1呼び出し用スクリプト generate_wan21.py を作成します。
cat << 'EOF' > generate_wan21.py
import os
import time
import requests
from dotenv import load_dotenv
import replicate
load_dotenv()
def generate_video_wan21(prompt: str, output_path: str = "wan21_output.mp4"):
print(f"[Wan2.1] 処理開始: プロンプト = '{prompt}'")
# Replicate上でWan2.1モデルを実行
# 2026年現在のWan2.1 14Bモデルの識別子を指定
output = replicate.run(
"wan-video/wan-2.1-14b:latest",
input={
"prompt": prompt,
"aspect_ratio": "16:9",
"frame_num": 81,
"resolution": "720p"
}
)
video_url = str(output)
print(f"[Wan2.1] 生成完了! 動画URL: {video_url}")
# 動画ファイルのダウンロード
print(f"[Wan2.1] 動画をダウンロード中: {output_path}")
res = requests.get(video_url, stream=True)
if res.status_code == 200:
with open(output_path, "wb") as f:
for chunk in res.iter_content(chunk_size=8192):
f.write(chunk)
print(f"[Wan2.1] 保存完了: {output_path}")
else:
raise Exception(f"ダウンロード失敗: ステータスコード {res.status_code}")
if __name__ == "__main__":
prompt_text = "Cinematic shot of a futuristic drone flying through a neon-lit cyber city, highly detailed, 4k"
generate_video_wan21(prompt_text)
EOF
作成した generate_wan21.py スクリプトを実行します。
python3 generate_wan21.py
スクリプトの実行結果出力例は以下のようになります。
[Wan2.1] 処理開始: プロンプト = 'Cinematic shot of a futuristic drone flying through a neon-lit cyber city, highly detailed, 4k'
[Wan2.1] 生成完了! 動画URL: https://replicate.delivery/pbxt/Wan21Output12345/output.mp4
[Wan2.1] 動画をダウンロード中: wan21_output.mp4
[Wan2.1] 保存完了: wan21_output.mp4
5. 手順2:Luma Dream Machine SDKによる高品質動画生成の実装
続いて、商用高品質AI動画生成ツール「Luma Dream Machine」の公式Python SDKを利用したスクリプトを作成します。Luma SDKは明示的なポーリングAPIが用意されているため、生成ステータスの変化を細かく追跡可能です。
Luma生成スクリプト generate_luma.py を作成します。
cat << 'EOF' > generate_luma.py
import os
import time
import requests
from dotenv import load_dotenv
from lumaai import LumaAI
load_dotenv()
def generate_video_luma(prompt: str, output_path: str = "luma_output.mp4"):
client = LumaAI(api_key=os.getenv("LUMA_API_KEY"))
print(f"[Luma] 画面生成リクエスト送信: '{prompt}'")
generation = client.generations.create(
prompt=prompt,
aspect_ratio="16:9",
loop=False
)
gen_id = generation.id
print(f"[Luma] タスク発行成功. Generation ID: {gen_id}")
# ポーリング処理
completed = False
while not completed:
time.sleep(5)
status_info = client.generations.get(id=gen_id)
state = status_info.state
print(f"[Luma] ステータス確認中: {state}")
if state == "completed":
completed = True
video_url = status_info.assets.video
elif state == "failed":
raise RuntimeError(f"Luma 動画生成失敗: {status_info.failure_reason}")
print(f"[Luma] 生成完了! 動画URL: {video_url}")
# 保存処理
print(f"[Luma] 動画ダウンロード中: {output_path}")
res = requests.get(video_url, stream=True)
if res.status_code == 200:
with open(output_path, "wb") as f:
for chunk in res.iter_content(chunk_size=8192):
f.write(chunk)
print(f"[Luma] 保存完了: {output_path}")
if __name__ == "__main__":
prompt_text = "A majestic dragon soaring above misty mountain peaks during golden hour sunrise"
generate_video_luma(prompt_text)
EOF
作成した generate_luma.py スクリプトを実行します。
python3 generate_luma.py
スクリプトの実行結果出力例は以下のようになります。
[Luma] 画面生成リクエスト送信: 'A majestic dragon soaring above misty mountain peaks during golden hour sunrise'
[Luma] タスク発行成功. Generation ID: gen_luma_998877665544
[Luma] ステータス確認中: dreaming
[Luma] ステータス確認中: dreaming
[Luma] ステータス確認中: completed
[Luma] 生成完了! 動画URL: https://lumacdn.com/generations/gen_luma_998877665544/video.mp4
[Luma] 動画ダウンロード中: luma_output.mp4
[Luma] 保存完了: luma_output.mp4
6. 手順3:非同期ポーリングと動画ダウンロードの自動化パイプライン構築
実用的な開発現場では、プロバイダー(Wan2.1かLumaか)を動的に切り替えたり、コマンドライン引数からプロンプトを入力して自動処理する汎用パイプラインモジュールが求められます。
統合パイプラインスクリプト video_pipeline.py を作成します。
cat << 'EOF' > video_pipeline.py
import os
import sys
import time
import argparse
import requests
from dotenv import load_dotenv
import replicate
from lumaai import LumaAI
load_dotenv()
class VideoGeneratorPipeline:
def __init__(self, provider="wan21"):
self.provider = provider.lower()
if self.provider == "luma":
self.luma_client = LumaAI(api_key=os.getenv("LUMA_API_KEY"))
def run(self, prompt: str, output_file: str):
print(f"=== AI Video Generation Pipeline (Provider: {self.provider.upper()}) ===")
if self.provider == "wan21":
self._generate_wan21(prompt, output_file)
elif self.provider == "luma":
self._generate_luma(prompt, output_file)
else:
raise ValueError(f"未対応のプロバイダー: {self.provider}")
def _generate_wan21(self, prompt: str, output_file: str):
print(f"[Wan2.1] リクエスト送信中...")
output = replicate.run(
"wan-video/wan-2.1-14b:latest",
input={"prompt": prompt, "aspect_ratio": "16:9", "resolution": "720p"}
)
self._download_file(str(output), output_file)
def _generate_luma(self, prompt: str, output_file: str):
print(f"[Luma] リクエスト送信中...")
gen = self.luma_client.generations.create(prompt=prompt, aspect_ratio="16:9")
gen_id = gen.id
print(f"[Luma] タスクID: {gen_id}")
while True:
time.sleep(5)
status = self.luma_client.generations.get(id=gen_id)
print(f"[Luma] 進捗状態: {status.state}")
if status.state == "completed":
self._download_file(status.assets.video, output_file)
break
elif status.state == "failed":
raise RuntimeError(f"生成エラー: {status.failure_reason}")
def _download_file(self, url: str, output_file: str):
print(f"[Pipeline] 動画ファイル保存中: {output_file}")
resp = requests.get(url, stream=True)
if resp.status_code == 200:
with open(output_file, "wb") as f:
for chunk in resp.iter_content(chunk_size=8192):
f.write(chunk)
print(f"[Pipeline] 正常終了: {output_file}")
else:
raise IOError(f"HTTPエラー: {resp.status_code}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="AI Video Generation CLI Pipeline")
parser.add_argument("--prompt", type=str, required=True, help="動画生成用のテキストプロンプト")
parser.add_argument("--provider", type=str, default="wan21", choices=["wan21", "luma"], help="使用するAIモデルプロバイダー")
parser.add_argument("--output", type=str, default="pipeline_output.mp4", help="出力ファイルパス")
args = parser.parse_args()
pipeline = VideoGeneratorPipeline(provider=args.provider)
pipeline.run(prompt=args.prompt, output_file=args.output)
EOF
コマンドライン引数を渡して、Wan2.1エンジンで動画生成を実行します。
python3 video_pipeline.py --provider wan21 --prompt "A cozy coffee shop in rainy Tokyo night with neon reflections" --output tokyo_rain.mp4
実行結果出力例は以下のようになります。
=== AI Video Generation Pipeline (Provider: WAN21) ===
[Wan2.1] リクエスト送信中...
[Pipeline] 動画ファイル保存中: tokyo_rain.mp4
[Pipeline] 正常終了: tokyo_rain.mp4
7. 動作確認:スクリプト実行と生成動画の保存確認
生成された動画ファイルがローカル環境に正しく保存され、破損していないか確認します。
カレントディレクトリ内のMP4ファイルを一覧表示し、ファイルサイズを確認するコマンドです。
ls -lh *.mp4
コマンド実行結果出力例は以下の通りです。
-rw-r--r-- 1 root root 4.8M Sep 11 10:15 luma_output.mp4
-rw-r--r-- 1 root root 5.2M Sep 11 10:18 pipeline_output.mp4
-rw-r--r-- 1 root root 5.1M Sep 11 10:10 wan21_output.mp4
動画ファイルが数メガバイト(4〜6MB程度)のサイズで出力されていれば、正常に動画データが書き込まれています。
8. 注意点とデメリット:コストと非同期レイテンシの考慮
Pythonによる動画生成自動化を導入するにあたり、以下の注意点とデメリットを認識しておく必要があります。
- API利用コストの累積: 動画生成AIのAPI呼び出しコストは、テキスト生成LLM(GPT-4oやClaude 3.5)と比較して高価です。1回あたり約$0.15〜$0.20がかかるため、ループ処理で大量リクエストを送るプログラムを不用意に実行すると急激に課金額が膨らみます。必ずリトライ制限や1日の上限実行数をコード側でガードしてください。
- 非同期処理とレイテンシ(待ち時間): 動画生成は1本あたり30秒〜2分程度の処理時間がかかります。Webアプリケーションの同期レスポンスとして組み込むとタイムアウトの原因になるため、CeleryやRedis Queue等の非同期タスクキューを用いたバックグラウンド処理の設計が必須です。
- プロンプトの再現性とガチャ要素: 同じプロンプトを入力しても、毎回異なる構図や動きの動画が生成されます。商用コンテンツとして特定の動きを厳密に保証することは困難なため、生成後のフィルタリングや複数パターンの並列生成を考慮したロジックが必要です。
9. 著者の考察・使ってみた感想
総合おすすめ度:★★★★☆(4.0 / 5.0)
今回、Wan2.1とLuma Dream Machineの双方をPython APIから操作するパイプラインを構築してみて、最も強く感じたのは「動画生成AIがWebアプリケーションのバックエンドモジュールとして完全に実用域に達した」という点です。
特にオープンソースのWan2.1は、Replicate経由で利用した場合のレスポンス安定性が高く、コストパフォーマンスに優れています。一方、表現の繊細さやカメラワークの自然さにおいてはLuma Dream Machineが頭一つ抜けており、用途に応じた使い分けが明確になりました。
【こういう人には向かない】
完全にリアルタイムで数秒以内に動画レスポンスを返したいインターフェースを開発している方や、1動画あたり数円以下の低予算で万単位の動画生成を行いたい環境には向きません。非同期処理の手間とAPIコストがボトルネックになります。
10. よくある質問(FAQ)
Q1: Wan2.1とLuma Dream Machineはどちらを選ぶべきですか?
A: コストパフォーマンスとオープンソースの柔軟性を重視する場合はWan2.1(Replicate API経由)、商用クオリティの質感や複雑なカメラアングルの指示を重視する場合はLuma Dream Machineが最適です。開発現場では、テスト段階や大量生成にはWan2.1を使い、最終的な本番クリエイティブ出力にはLumaを採用するといった使い分けが効果的です。
Q2: 生成された動画の商用利用は可能ですか?
A: Wan2.1はオープンソースライセンス(Apache 2.0等)に基づいて提供されており、商用利用が可能です。Luma Dream Machineに関しても有料APIプラン経由で生成されたアセットは商用利用が認められています。ただし、プロンプトに実在の人物名や既存の著作権で保護されたキャラクターを含めた場合は法的なリスクが生じるため注意が必要です。
Q3: 画像から動画を生成する「Image-to-Video」にも対応できますか?
A: はい、両方のAPIともにImage-to-Videoに対応しています。Replicate経由のWan2.1では `input={“image”: “https://…”}` のように入力画像のURLを指定し、Luma SDKでは `client.generations.create(image_url=”https://…”)` と引数を追加することで、静止画をベースにしたアニメーション動画を生成できます。
Q4: 動画の解像度やアスペクト比は変更できますか?
A: 変更可能です。Wan2.1では `720p` や `1080p` などの解像度パラメータと `16:9`、`9:16`、`1:1` などのアスペクト比が指定できます。Luma SDKでも `aspect_ratio` パラメータで縦型ショート動画用(9:16)や横型用(16:9)を簡単に切り替えることが可能です。
Q5: 大量生成時のレートリミット(実行制限)対策はどうすればよいですか?
A: 各プラットフォームのAPIには1分あたりのリクエスト上限が設定されています。Pythonコード内では exponential backoff(指数バックオフ)によるリトライ処理を実装するか、バックグラウンドのジョブキュー(Celery等)で同時実行数を制御することを推奨します。