最近、AIを使った画像生成が話題になっていますよね。でも、動画生成となるとまだまだ発展途上という感じです。今回は、Stability AIが提供しているAPIを使って、テキストから画像を生成し、その画像から動画を作る方法を試してみました。
使用したAPI
現状、テキストから直接動画を生成するAPIがないので、2段階のアプローチを取りました。
- Stable Image Core APIで画像を生成
- Image-to-Video APIで動画を生成
実装コード
実際の実装コードです。実装してみて気づいたんですが、動画生成には結構な時間がかかるため、非同期処理とポーリングが必要でした。
特に注意が必要だったのが、APIのレート制限。10秒以内に複数回ポーリングすると制限に引っかかります。
// 動画生成の状態を確認するポーリング処理
private static async pollVideoGeneration(
id: string,
maxAttempts = 180
): Promise {
const delay = (ms: number) =>
new Promise((resolve) => setTimeout(resolve, ms));
for (let attempt = 0; attempt < maxAttempts; attempt++) {
try {
console.log(`ポーリング試行 ${attempt + 1}/${maxAttempts}`);
const response = await fetch(
`${this.STABILITY_API_HOST}/v2beta/image-to-video/result/${id}`,
{
method: "GET",
headers: {
Accept: "application/json",
Authorization: `Bearer ${this.STABILITY_API_KEY}`,
},
}
);
console.log(`ポーリングステータス: ${response.status}`);
if (!response.ok) {
const errorText = await response.text();
console.log(`レスポンスボディ: ${errorText}`);
if (response.status === 202) {
console.log("動画生成中...");
await delay(10000);
continue;
}
throw new Error(`動画の取得に失敗しました: ${errorText}`);
}
const result = await response.json();
console.log("ポーリングレスポンス受信");
// 動画が準備できている場合(videoプロパティを確認)
if (result.video) {
console.log("動画生成完了");
return Buffer.from(result.video, "base64");
}
// finishingやprocessingなどの状態も確認
if (result.status === "processing") {
console.log("動画処理中...");
await delay(10000);
continue;
}
console.log("動画データなし、待機中...");
await delay(10000);
} catch (error) {
console.error(
`ポーリング試行エラー (${attempt + 1}/${maxAttempts}):`,
error
);
await delay(10000);
}
}
throw new Error(`動画生成のタイムアウト: ${id}`);
}
実際に動かしてみた
実行してみると、こんな感じのログが出力されました:
# 実行ログ
ポーリング試行 1/180
ポーリングステータス: 202
ポーリングレスポンス受信
動画データなし、待機中...
ポーリング試行 2/180
ポーリングステータス: 202
ポーリングレスポンス受信
動画データなし、待機中...
ポーリング試行 3/180
ポーリングステータス: 202
ポーリングレスポンス受信
動画データなし、待機中...
ポーリング試行 4/180
ポーリングステータス: 202
ポーリングレスポンス受信
動画データなし、待機中...
ポーリング試行 5/180
ポーリングステータス: 200
ポーリングレスポンス受信
動画生成完了
生成された動画
テストとして「走り回る猫」というプロンプトで動画を生成してみました。結果は...どうでしょうか?
まとめ
Stability AIのAPIを使って画像から動画を生成する実装、思った以上に簡単でした。ただし、以下の点には注意が必要かなと思います:
- ポーリング間隔は必ず10秒以上空ける
- タイムアウト処理はちゃんと実装する
- エラーハンドリングはしっかりと
これからAIを使った動画生成がどんどん発展していくと思うので、楽しみですね!
株式会社Grandreamでは、フルリモートであなたのスキルを活かし、活躍できるエンジニアを募集しております。
詳しくは採用ページをご確認いただき、お気軽にお問い合わせください。