2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

動画生成AIサービス「Dream Machine」をWeb APIで呼び出してみた

Posted at

Supershipの名畑です。らんま1/2のOPが本編に先駆けて公開され、じゃじゃ馬にさせないでの思い出が全力で甦ってくる。

はじめに

6月に「話題の動画生成AIサービス「Dream Machine」を使って女性の画像を動かしてみたら自然すぎて恐くなりもしたという記事を書きました。

アメリカのLuma LabsによるDream Machineの素晴らしさを紹介した記事でした。

当時はブラウザ上での動画生成だったのですが、先日Web APIが公開されました。
ということで呼び出してみましたというのが今回の記事です。

ログインからクレジット購入まで

dmapi_img1.png

Googleアカウントでログインします。

dmapi_img2.png

Billing & CreditsのページのAdd More Creditsからクレジットを購入可能です。$5〜$500の間で金額を指定できます。金額について詳しくは「Dream Machine API Pricing」のページをご覧ください。

API Key作成

dmapi_img3.png

API Keyを作成しておきましょう。
以下の説明の通り、API Keyは後からは確認ができませんので、生成時に必ず保持するようにしてください。

It is your responsibility to record the key below as you will not be able to view it again.

環境設定

私の端末のOSはmacOS 14 Sonomaです。

Pythonのバージョンは以下です。

$ python --version
Python 3.12.2

Python SDKを入れておきます。

$ pip install lumaai

サンプルコードの実行に用いるため、requestsも入れておきます。

$ pip install requests

バージョンを確認しておきました。

$ pip list | grep -e lumaai -e requests 
lumaai             1.0.2
requests           2.31.0

ハードコーディングを避けるため、先ほどのAPI KeyはLUMAAI_API_KEYという環境変数名で保存しておきました。

export LUMAAI_API_KEY=ここに取得したAPI Keyを書く

テキストからの動画生成

Python SDKのGuideのText to Videoの項を参考にして、まずはテキストからの動画生成をしてみます。より詳しくはAPI Referenceなどをご覧ください。

import os
from lumaai import LumaAI
import requests

client = LumaAI(
    auth_token=os.environ.get("LUMAAI_API_KEY")  # API Keyの取得
)

generation = client.generations.create(
    prompt="A teddy bear in sunglasses playing electric guitar and dancing",
    aspect_ratio="16:9",
    loop=True # Trueだとループ対応
)

# stateはqueued, dreaming, completed, failedのいずれかの値を取る
while generation.state != "failed":
    generation = client.generations.get(generation.id)  # 再取得
    if generation.state == "completed":
        response = requests.get(generation.assets.video)
        with open(generation.id + ".mp4", "wb") as file:
            file.write(response.content)
        break
        
# これまでのリクエスト一覧は以下で取得可能
# print(client.generations.list())

プロンプトは「A teddy bear in sunglasses playing electric guitar and dancing」です。「エレキギターを弾きながら踊っているサングラスをかけたテディベア」ですね。

アスペクト比は16:9を指定しました。
また、ループしても不自然のない動画となるように、loopにTrueを指定しました。最初のフレームと最後のフレームが一致するということのようです。

実際に生成された動画は以下です。

プロンプト通りの動画が作成されています。
素晴らしいです。

画像からの動画生成

同じくPython SDKのGuideのImage to Videoの項を参考にして、画像からの動画生成も行ってみます。

You should upload and use your own cdn image urls, currently this is the only way to pass an image

とのことなので、現在においては、どこかurlが発行されるサーバ上に画像をアップしておく必要があります。

今回は以下の画像をサーバ上におきました。

dmapi_original.png

最初のフレームと最後のフレームの両方に別画像を生成できますが、今回は最初のフレームのみとします。

コードは以下です。プロンプトは「Japanese woman smiling」つまり「笑っている日本人女性」としました。今回はループ指定をはずしてみました。

import os
from lumaai import LumaAI
import requests

client = LumaAI(
    auth_token=os.environ.get("LUMAAI_API_KEY")  # API Keyの取得
)

generation = client.generations.create(
    prompt="Japanese woman smiling",
    keyframes={
        "frame0": {
            "type": "image",
            "url": "ここに画像urlを指定する"
        }
    }
)

# stateはqueued, dreaming, completed, failedのいずれかの値を取る
while generation.state != "failed":
    generation = client.generations.get(generation.id)  # 再取得
    if generation.state == "completed":
        response = requests.get(generation.assets.video)
        with open(generation.id + ".mp4", "wb") as file:
            file.write(response.content)
        break

生成した動画は以下です。

こちらもプロンプトがきちんと反映されていますね。

本当に、AIで生成されたものを目にする度、すごい時代になったと感じます。

最後に

コードだけで完結するのが嬉しいです。

動画周りはもっと色々と遊んでみたい。

宣伝

SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?