Stability AIのAPIを使って画像から動画を生成してみた

2024-11-27
大迫 達郎
#
#
#

最近、AIを使った画像生成が話題になっていますよね。でも、動画生成となるとまだまだ発展途上という感じです。今回は、Stability AIが提供しているAPIを使って、テキストから画像を生成し、その画像から動画を作る方法を試してみました。

使用したAPI

現状、テキストから直接動画を生成するAPIがないので、2段階のアプローチを取りました。

  1. Stable Image Core APIで画像を生成
  2. 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では、フルリモートであなたのスキルを活かし、活躍できるエンジニアを募集しております。 詳しくは採用ページをご確認いただき、お気軽にお問い合わせください。

株式会社グランドリームでは、AWSを駆使した開発からUI/UXデザインまで、Webアプリケーションに関するすべての要望に応えます。
まずは一度お気軽にご相談ください。

お問い合わせはこちら