「Luma Dream Machine」公式の JavaScript SDK で動画生成（Text to Video）

## はじめに
### この記事の内容
[「Luma Dream Machine」の API](https://lumalabs.ai/dream-machine/api) を使った Text to Video を、公式の JavaScript SDK で試してみたという話です。

●Luma Dream Machine: New Freedoms of Imagination
　https://lumalabs.ai/dream-machine

![2025-01-10_00-02-36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/cb1252ed-e348-7f7a-cd1f-9b2f4fcf86c9.jpeg)

https://x.com/LumaLabsAI/status/1861054912790139329

### 公式の JavaScript SDK
公式の JavaScript SDK は以下になるようです。

https://docs.lumalabs.ai/docs/javascript

### API利用
API利用のため、とりあえず最低金額の 5ドル分を課金しました（※ 要ログイン）。

●Luma Dream Machine | AI Video Generator API
　https://lumalabs.ai/dream-machine/api/billing/overview
 
![2025-01-09_23-59-19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c64f3e1d-4360-6541-be3e-c27119468d99.jpeg)

また、以下のページで APIキーを生成しました（※ 要ログイン）。

●Luma Dream Machine | AI Video Generator API
　https://lumalabs.ai/dream-machine/api/keys

## 公式の JavaScript SDK で試す
公式のドキュメントを参照しながら実際に試していきます。

### 事前準備
公式の JavaScript SDK を使うにあたり、まずはセットアップです。

●Video Generation
　https://docs.lumalabs.ai/docs/javascript-video-generation

#### パッケージのインストール
npmコマンドで、以下をインストールします。

●lumaai - npm
　https://www.npmjs.com/package/lumaai

●lumalabs/lumaai-node: Dream Machine SDK for JS/TS
　https://github.com/lumalabs/lumaai-node

```zsh
npm install lumaai
```

#### 自分で実装したもの
APIキーは環境変数「LUMAAI_API_KEY」として設定しておきます（※ 以下は Mac での例）。

```zsh
export LUMAAI_API_KEY='【自分のAPIキー】'
```

#### サンプルコード
上のほうにあるサンプルを見てみます。

```javascript
const fetch = require('node-fetch');
const fs = require('fs');
const { LumaAI } = require('lumaai');

const client = new LumaAI({ authToken: process.env.LUMAAI_API_KEY });

async function generateVideo() {
    let generation = await client.generations.create({
        prompt: "A teddy bear in sunglasses playing electric guitar and dancing"
    });

    let completed = false;

    while (!completed) {
        generation = await client.generations.get(generation.id);

        if (generation.state === "completed") {
            completed = true;
        } else if (generation.state === "failed") {
            throw new Error(`Generation failed: ${generation.failure_reason}`);
        } else {
            console.log("Dreaming...");
            await new Promise(r => setTimeout(r, 3000)); // Wait for 3 seconds
        }
    }

    const videoUrl = generation.assets.video;

    const response = await fetch(videoUrl);
    const fileStream = fs.createWriteStream(`${generation.id}.mp4`);
    await new Promise((resolve, reject) => {
        response.body.pipe(fileStream);
        response.body.on('error', reject);
        fileStream.on('finish', resolve);
    });

    console.log(`File downloaded as ${generation.id}.mp4`);
}

generateVideo();
```

これで Text to Video を軽く試してみます。

#### 出力結果
サンプルコードの以下のプロンプトは書きかえました。

```javascript
        prompt: "A teddy bear in sunglasses playing electric guitar and dancing"
```

プロンプトを「炎と氷のドラゴンが対峙して争っているシーン」として、以下の結果を得られました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/n6IbHSSlu1A?si=wUuxDfwkaSX4qlVG" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>