見出し画像

Unity で Stable Diffusionの機能を使う

「stability-sdk」を使って、Unityで Stable Diffusionの機能を使う手順をまとめました。

・Unity 2020.3.38f1
・grpc_unity_package 2.46.0
・Google.Protobuf.dll 3.21.9
・macOS 12.4

1. stability-sdk

「stability-sdk」は、「Stable Diffusion」の機能をWeb API経由で利用できるSDKです。通信プロトコルは「gRPC」のため、様々な言語で利用できますが、公式ではPythonとJavaScriptしか提供されてないため、protoファイルをビルドする必要があります。

2. protoファイルのビルド

macOSでのprotoファイルのビルド手順は、次のとおりです。

(1) protoファイルのビルドに必要なツールをインストール。

$ brew install protobuf
$ brew tap grpc/grpc
$ brew install grpc

(2) stability-sdkリポジトリからgeneration.protoを取得。
「src/proto」フォルダにあります。

(3) generation.protoのあるフォルダで以下のコマンドを実行。

$ protoc -I . --csharp_out=. --grpc_out=. --plugin=protoc-gen-grpc=/usr/local/bin/grpc_csharp_plugin generation.proto

コンパイルして以下のファイルが生成されます。

・Generation.cs
・GenerationGrpc.cs

3. Unityのプロジェクトの準備

Unityのプロジェクトを準備します。

(1) Unityで3Dプロジェクトを作成。
(2) ここから「grpc_unity_package」をダウンロード

(3) 「grpc_unity_package」を解凍して、中身の「Plugins」をAssetsに配置。
(4) ここから「Google.Protobuf.dll」をダウンロードして、拡張子「nupkg」を「zip」に変更して解凍。
(5) 「google.protobuf.3.21.9/lib/net45/Google.Protobuf.dll」を「Plugins/Google.Protobuf/lib/net45/Google.Protobuf.dll」に上書き。
(6) 「Generation.cs」「GenerationGrpc.cs」をAssetsに配置。
(7)Unityのメニュー「File → Build Settings → Player Settings → Other Settings」で「Api Compatibility Level」を「.Net 4.x」に指定。

4. Unityでのテキストからの画像生成

Unityでテキストからの画像生成を実装する手順は、次のとおりです。

(1) HierarchyウィンドウにRawImageを追加。
(2) 空のGameObjectを作成して、「SimpleClient」と名前を指定して、新規スクリプト「SimpleClient.cs」を追加。
<APIキー>には、「Dream Studio」のAPIキーを指定してください。

・SimpleClient.cs

using UnityEngine;
using UnityEngine.UI;
using Grpc.Core;
using Grpc.Core.Utils;
using Gooseai;
using System;
using System.IO;
using System.Text;

//シンプルクライアント
public class SimpleClient : MonoBehaviour {
    public Image image;
    public RawImage rawImage;

    //スタート時に呼ばれる
    async void Start() {
        //サーバーとの接続
        var token = "<APIキー>";
        var callCredentials = CallCredentials.FromInterceptor(new AsyncAuthInterceptor((context, metadata) =>
        {
            metadata.Add("authorization", "Bearer " + token);
            return TaskUtils.CompletedTask;
        }));
        var secureCredentials = ChannelCredentials.Create(new SslCredentials(), callCredentials);
        Channel channel = new Channel("grpc.stability.ai:443", secureCredentials);
        var client = new GenerationService.GenerationServiceClient(channel);

        // プロンプトの生成
        var prompt = new Prompt();
        prompt.Text = "white cat";

        // リクエストの生成
        var request = new Request();
        request.RequestId = Guid.NewGuid().ToString();
        request.EngineId = "stable-diffusion-v1-5";
        request.RequestedType = ArtifactType.ArtifactNone;
        request.Prompt.Add(prompt);
        request.Image = new ImageParameters();

        // 通信中
        var call = client.Generate(request);
        byte[] bytes = null;
        while (await call.ResponseStream.MoveNext())
        {
            print("processing...");
            if (call.ResponseStream.Current.Artifacts.Count > 0) {
                bytes = call.ResponseStream.Current.Artifacts[0].Binary.ToByteArray();
            }
        }

        // テクスチャの生成
        Texture2D texture = new Texture2D(1, 1);
        texture.LoadImage(bytes);

        // RawImageに表示
        this.rawImage.texture = texture;
        this.rawImage.SetNativeSize();
    }
}

(3) RawImageの参照をInspectorウィンドウのSimpleClientにドラッグ&ドロップ。

(4) UnityのPlayボタンで実行。
白猫の画像が表示されます。

5. 関連



この記事が気に入ったらサポートをしてみませんか?