見出し画像

画像生成AIを使ってUnity内のテクスチャを更新する

こんにちは。REALITY株式会社GREE VR Studio Laboratory(ラボ)Directorの白井です。先日、CEDEC2023で「Metaverse Mode Maker」(MMM)というプロジェクトを発表いたしました。

モーションUGCのほうは上記の記事で詳細解説しましたが、服のテクスチャ生成についてもUnity上での実装を軽く紹介しておこうと思います。今回の記事は、インターンの山岡さんがUnityのトレーニングを兼ねて、AIが生成したテクスチャをREST APIを使ってUnity内で高速に利用するテクニックをお伝えしたので、それをブログ化して紹介します。

Lexica Search APIを使う

現状、Stable DiffusionなどのAI画像生成を使ってUnity上で動的にテクスチャを生成する方法はいくつかあるのですが、ここではStable Diffusionのプロンプト交流サービス「Lexica」のSearch APIを使って、高速で、メタバース感のあるUXをUnityで作ってみたいと思います。

Lexicaはプロンプトを叩くと、他のユーザが過去にStable Diffusionによって生成されたプロンプトともに、ユーザによって投稿されたイイ感じの画像を大量に表示してくれるAIドリブンなSNSです。過去絵の検索だけでなく、プロンプト(呪文)を打ち込んで生成することもできるの試してみるとよいです。

このLexicaを高速に検索できるSearch APIが公開されています。

Lexicaで既に生成された画像がインデックスされており、REST APIで高速にリクエストに応答してくれます。例えばこんな感じ…

GET https://lexica.art/api/v1/search?q=apples

レスポンスはJSONで戻ってきます。

{
    "images": [
        {
            // The ID of the image
            "id": "0482ee68-0368-4eca-8846-5930db866b33",
            // URL for the image's gallery
            "gallery": "https://lexica.art?q=0482ee68-0368-4eca-8846-5930db866b33",
            // Link to this image
            "src": "https://image.lexica.art/md/0482ee68-0368-4eca-8846-5930db866b33",
            // Link to an compressed & optimized version of this image
            "srcSmall": "https://image.lexica.art/sm/0482ee68-0368-4eca-8846-5930db866b33",
            // The prompt used to generate this image
            "prompt": "cute chubby blue fruits icons for mobile game ui ",
            // Image dimensions
            "width": 512,
            "height": 512,
            // Seed
            "seed": "1413536227",
            // Whether this image is a grid of multiple images
            "grid": false,
            // The model used to generate this image
            "model": "stable-diffusion",
            // Guidance scale
            "guidance": 7,
            // The ID for this image's prompt
            "promptid": "d9868972-dad8-477d-8e5a-4a0ae1e9b72b"
            // Whether this image is classified as NSFW
            "nsfw": false,
        },
    ...
    ]
}

“src”と“srcSmall” に画像を渡すURLが記載されています。

Unity上で LexicaManager を作る

Unityからプロンプトを打ち込むことでLexicaから動的に絵を取得して、それを服や壁紙に適用させるプロトタイプを作ってみます。

Lexicaから絵を取得するコード(LexicaManager.cs)はヒエラルキーのMANAGERS直下のLexicaManagerに貼り付けてあります。実行画面は図1のようになります。

図1

APIを叩いてJsonを取得するまでの一連の流れはこの記事に詳しいです(Twitter Rest APIの記事ですが勉強になります。)
LexicaManager.csはLexica Search APIから、生成された絵を取得するスクリプトです。次の流れでLexicaから画像を取得しています。

①HTTPリクエストを出してJsonを取得→②JsonをDesiriarize→③生成された画像へのリンクを取得→④リンクから画像をダウンロード

次に一つ一つの段階を見てみましょう。
①HTTPリクエストを出してJsonを取得

UnityWebRequest request = UnityWebRequest.Get("https://lexica.art/api/v1/search?q=textile");
yield return request.SendWebRequest();

q=の後に生成したい絵のキーワードをパラメータとして指定してリクエストを出します。後にunity editor側からパラメータ指定できるようにしたいですが今はコードに直接指定しています。
リクエストを出して特に問題がなければ以下のようなJsonがString型で返ってきます(図2)。

図2 帰ってきたjson

それぞれのパラメータはLexicaManager.csの下のほうで定義してあります。

[System.Serializable]
public class Images
{
    public string id;
    public string gallery;
    public string src;
    public string srcSmall;
    public string prompt;
    public string width;
    public string height;
    public string seed;
    public string grid;
    public string model;
    public string guidance;
    public string promptid;
    public string nsfw;
}

それぞれのパラメータの意味はdocumentを参照してください。Unity標準のJson Utilityを使うときは使用するパラメータをこんな風にクラスとして定義してあげないといけないので注意してください。自分でクラスを書くのが面倒な時はJsonファイルを突っ込むとパラメータ用のクラスを自動生成してくれるサイトもあります。

②JsonをDesiriarize
まず、Desiriarizeとは簡単に言うとJsonファイルをオブジェクトとして扱えるように変換することです。逆にオブジェクトをJsonファイルに変換することをSerializeといいます。
Json UtilityでDesirializeする際は内部的なことを意識せず以下の一文でDesirializeできます。べんり~
実引数としてpJsonにはJsonを渡してあげます。

LexicaJson jsonResult = JsonUtility.FromJson<LexicaJson>(pJson);

③生成された画像へのリンクを取得
次のfor文ではLexicaで生成された画像へのリンクを取得します。インスペクタで指定したTex Number文だけfor文が繰り返されます。
試しにDebug.Logで取得したjsonResult.images[i].src
をコンソールで見てみると、
jsonResult=https://lexica-serve-encoded-images.sharif.workers.dev/md/022dec05-8fc7-4eff-8ed2-4165dfe06264
とありこのリンクに飛んでみると確かに生成された画像が確認できます。

④リンクから画像をダウンロード
最後に画像へのURLを指定してもう一度HTTPリクエストを要求して、問題がなければヒエラルキーのPositionHandler>UI>TexitilePanel>BGの子オブジェクトかつRawImageとしてTextileが生成されます。

まとめと補足

REST APIを使って外部システムから画像を更新するテクニックとして参考になったようであれば幸いです。実際のMMMのデモでは軽快なUXや生成AIにおけるコストや速度の調査も行っており、この記事で紹介したLexica以外に、ローカルのStable Diffusionによる生成、StabilityAI社のDreamStudioAPIなども比較しています。特にDreamStudioはgRPCを使っており、非常に高速に生成・バイナリ取得ができますのでお勧めです(ただし有料)。

服のテクスチャを生成するところは、シェーダーになってます。これはこれで結構大変でしたのでラボの公開動画や関連の論文を見ていただけると幸いです。

AI画像生成に関するテクニックや、文化面、法律面などに興味がある方はこちらのイベントや書籍「AIとコラボして神絵師になる 論文から読み解くStable Diffusion」を読んでいただけるとよいかと思います(宣伝乙)。

CEDEC2023でご体験いただきありがとうございました!