Zenn
🤖

Unity Sentis 感情分析

に公開

Unity Sentis を使った感情分析

目的

Unity 上で Sentis を利用し、カメラで映したユーザーの表情から読み取れる感情(ポジティブ・ネガティブなど)をリアルタイムに分析する。


必要なもの

  • Unity(2022.3 LTS 以上推奨)
  • Unity Sentis パッケージ
  • 感情分析用 ONNX モデル(例:DistilBERT + SST-2)
  • 単語辞書 or トークナイザ(必要に応じて)

導入手順

1. Unity Sentis を導入する

  1. Unity を開き、Window > Package Manager を開く。

  2. +Add package from git URL を選択。

  3. 以下の URL を入力し、追加:

    https://github.com/Unity-Technologies/Sentis.git?path=Packages/com.unity.sentis
    

2. 感情分析モデル(ONNX)を入手

以下のサイトなどから感情分析用の ONNX モデルをダウンロードします。

※ 日本語対応モデルを使いたい場合は、cl-tohoku/bert-base-japanese をONNXに変換して使うことも可能です。


3. モデルを Unity に読み込む

Assets フォルダに .onnx ファイルを入れ、以下のように読み込みます。

using Unity.Sentis;
using UnityEngine;

public class SentimentAnalyzer : MonoBehaviour
{
    public NNModel modelAsset; // Inspector に割り当てる
    private Model model;
    private IWorker worker;

    void Start()
    {
        model = ModelLoader.Load(modelAsset);
        worker = WorkerFactory.CreateWorker(BackendType.CPU, model);
    }

    void OnDestroy()
    {
        worker?.Dispose();
    }
}

4. テキスト入力の前処理(トークナイズ)

モデルによっては、トークンIDへの変換が必要です。以下は簡易的な例です。

int[] TokenizeText(string inputText)
{
    // 簡易的な語彙辞書(例)
    Dictionary<string, int> vocab = new Dictionary<string, int> {
        { "i", 101 }, { "am", 102 }, { "happy", 103 }, { "sad", 104 }
    };

    var tokens = inputText.ToLower().Split(' ');
    return tokens.Select(word => vocab.ContainsKey(word) ? vocab[word] : 0).ToArray();
}

※ 高精度なトークナイザを使いたい場合は、Pythonで事前にトークンIDに変換し、Unityに渡すのが現実的です。

5. 推論の実行

public string PredictSentiment(string text)
{
    int[] tokenIds = TokenizeText(text);
    Tensor inputTensor = new Tensor(1, tokenIds.Length);

    for (int i = 0; i < tokenIds.Length; i++)
        inputTensor[0, i] = tokenIds[i];

    worker.Execute(inputTensor);
    Tensor output = worker.PeekOutput();

    float positive = output[0];
    float negative = output[1];

    return positive > negative ? "Positive" : "Negative";
}

サンプルの使い方

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        string userInput = "I am happy";
        string result = PredictSentiment(userInput);
        Debug.Log($"Sentiment: {result}");
    }
}

5. 応用アイデア

音声認識(Speech-to-Text)と連携して、発話から感情分析
感情に応じてNPCのセリフや表情を変化
メンタルケアアプリや日記アプリで感情の可視化

補足情報

ONNXモデルは軽量なものを選ぶこと(特にMeta QuestなどのVRに展開する上では重要)
事前処理はUnity内で行うとやや複雑なため、Pythonなどで事前処理して結果だけUnityに渡す運用が現実的
モデルの出力形式はONNXモデルに依存するので、output名や形状を事前に確認すること
(Netronなどで可視化)

ヘッドウォータース

Discussion

ログインするとコメントできます