Unity で Stable Diffusionの機能を使う
「stability-sdk」を使って、Unityで Stable Diffusionの機能を使う手順をまとめました。
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
コンパイルして以下のファイルが生成されます。
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. 関連
この記事が気に入ったらサポートをしてみませんか?