Gemini再来

UezoさんのChatdollkitを見て気がつく。まえにもBard使ってたけど、かなり賢いGeminiがなんと使い放題らしい。人格も維持し、JSON出力もキープしてくれる。これはひょっとして・・・。Unityから使う方法も一応紹介されている。もっと簡単に使える方法はないものか。。
C#でAIと無料で会話できるようにしてみた
これとか良いのではないか・・・。dllが必要!?

GASを使うと3分でできるというが・・・。めんどくさい。やるしかないのか。
Gemini↔️GAS↔️UnityでGeminiを使ってみる(テキスト編)


Geminiは、ChatGPTにUnityでの使い方を聞いたらあっさり動作した。・・・がしかし、50リクエスト/日とある。50リクエストしかできないって事じゃ??はぁ~

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using TMPro;
using UnityEngine.UI;

public class GeminiChat : MonoBehaviour
{
    public string apiKey = ""; // あなたのGemini APIキー
    public TextMeshProUGUI outputText;
    public InputField IF1;
    public Text outputmessage;

    private List<Content> conversationHistory = new List<Content>(); // 会話履歴(最大100)

    void Start()
    {
        // 初期化時は空の会話でもOK
    }

    public void procMessage(string message)
    {
        string userInput = IF1.text;
        if (!string.IsNullOrEmpty(userInput))
        {
            AddToHistory("user", userInput); // ユーザー発言を履歴に追加
            StartCoroutine(SendRequestToGemini());
        }
    }

    void AddToHistory(string role, string text)
    {
        // Gemini APIのフォーマットは content[].parts[].text を使用
        Content content = new Content
        {
            role = role,
            parts = new Part[]
            {
                new Part { text = text }
            }
        };

        conversationHistory.Add(content);

        // 最大100件までに制限(roleごとではなく全体で100)
        if (conversationHistory.Count > 100)
        {
            conversationHistory.RemoveAt(0);
        }
    }

    IEnumerator SendRequestToGemini()
    {
        string url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-pro-exp-02-05:generateContent?key=" + apiKey;

        GeminiRequest requestData = new GeminiRequest
        {
            contents = conversationHistory.ToArray()
        };

        string jsonData = JsonUtility.ToJson(requestData, true);
        byte[] postData = System.Text.Encoding.UTF8.GetBytes(jsonData);

        UnityWebRequest request = new UnityWebRequest(url, "POST");
        request.uploadHandler = new UploadHandlerRaw(postData);
        request.downloadHandler = new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");

        yield return request.SendWebRequest();

        if (request.result == UnityWebRequest.Result.Success)
        {
            string result = request.downloadHandler.text;
            GeminiResponse response = JsonUtility.FromJson<GeminiResponse>(result);

            string reply = response.candidates[0].content.parts[0].text;

            Debug.Log("Gemini Response: " + reply);

            if (outputText != null)
                outputText.text = reply;

            outputmessage.text = reply;

            // AIの返答を履歴に追加(role: "model")
            AddToHistory("model", reply);
        }
        else
        {
            Debug.LogError("Gemini API Error: " + request.error);
            outputmessage.text = request.error;
        }
    }

    // JSON構造(Gemini API仕様)
    [System.Serializable]
    public class GeminiRequest
    {
        public Content[] contents;
    }

    [System.Serializable]
    public class Content
    {
        public string role; // "user" or "model"
        public Part[] parts;
    }

    [System.Serializable]
    public class Part
    {
        public string text;
    }

    [System.Serializable]
    public class GeminiResponse
    {
        public Candidate[] candidates;
    }

    [System.Serializable]
    public class Candidate
    {
        public Content content;
    }
}

GroomingStack

GroomingStack – Hair, Fur and More
良いのか悪いのか、情報が少なくて評価しにくいアセット。Fluffy Grooming Toolなら紹介が見つかるのだけれど。しかしHDRPが動作する環境なら、これくらいの表現力があっても良いのではないか。しかしこの髪データ、どうやって作るんだ・・・。これはBlenderParticleHairという仕組みで作成したものを取り込めるらしい。CardtoStrandというツールが付いているようだが、実際どの程度の表現力なのかわからない。・・・おおお、Blender であらゆるヘアカードをグルーミング ストランドに変換するなどのチュートリアルが!ハイフィデリティな髪はこうやって作ってるのか!!すぅげぇ~!

HDRP250317

深みにはまるHDRP。もう何が良いのか悪いのかわからなくなってきた。Sun>Shadows>ContactShadowsをmedium以上にすると、髪の毛の影が顔に落ちるようになった。何が違うのかポニーテールの場合は、髪テクスチャのアラが目立ちにくい。これはカメラのPostAntialiasingをTAA(High)にしてる効果が大きいと思われる。リアルタイムレンダリングとしては、かなり良いところまで来た気がする。

ショートカットは、コンタクトシャドウがつくと、とたんに前髪が邪魔そうな印象になる。まぁそれはそれでリアルなのだろうが・・・。

ロングヘアーのヒトは印象がすっかり変わってしまい、モードな雰囲気に・・・。影の濃さを変えるには、環境光(HDRI)のExposureを変える必要があるようだ。が、そうすると背景も変わってしまう。難しいところだ。HDRPの画作りが真実に近いと言うなら、見る側もそれに慣れなければいけないのか。でも全員に言われそう。「前髪がジャマ」って。それは、IdaFaber(髪アセット作者)に言ってくれ。

ところで、HDRPの作画を画像検索にかけると、高い確率で「いかがわしいCG」に認定されてしまう。しかし、ポニーテールとショートカットは、とうとうGoogleに「個人の写真は検索できない(つまり人間)」認定をうけた。やった。残念ながらロングヘアーは相変わらずいかがわしい画像認定であった。

UnityHiarSystem

Unityでのリアルな髪の毛表現には、Unity製のHairsystemというアセットがあるらしいのだが、これはAlembic形式というファイルを作成する必要があるらしい。MayaやMAXなどの環境が必要なのだろうか。。いつか作れる日がくるのだろうか?

Alembicファイルはここから手に入るらしい。気が遠くなるほどセットアップ手順が長い。
Unityがデジタルヒューマン構築に消極的で、行く先が割と絶望的であることが議論されている。やはりUEに移行するしかないのか。

MediapipeWithWeb

MediaPipeはブラウザでも動作するだと?!そんなことあってたまるか・・・。KDDIのTOYOTAさんの記事によればMediaPipeStudioでは、様々なWeb版MediaPipeの機能を体験できるという。

顔の検出手の検出、確かにWebのみで動作する。MediaPipeは、以前にBarracuda経由でためしたものよりバージョンアップして機能や精度が改善されているようだ。52の顔ブレンドシェイプ値を出してくれるのが良い。しかし・・・実際に動作を確認すると「笑顔の検出が鈍い(そのぶん飽和しないので、強い笑顔の検出はできる)」「ネガティブ表情の検出が非常に悪い」などの問題があるように感じた。こういうAIは一長一短で、なかなかパーフェクトなものは存在しないようだ。いちいち確かめるのは不毛とも言える。

DAZMen250215

経緯
Unityを使ったAIチャットボットの開発を学習課題に導入予定であるが、ちょうどよい利用可能なキャラがない(軍人やEV社長は有料アセットだから配布できない)。Mixamoでリグをセットしたキャラを口パク可能なように改造してみたが、手間が現実的じゃない。

仕方ないのでDAZでキャラクタ開発
今更だが、新しい男性キャラクタを開発。DAZの覚書によれば、DAZtoUnityを使うようだが、マテリアルが正しくインポートされないよ・・・しかたない手動だ。毎度わからなくなるのでメモ・・・涙
・Cornea(角膜)→テクスチャなし。透明に。目の輝きに寄与。
・EyeMoisture(白目部分)→透明に。輝くようにsmoothnessなどを調整。
・Pupils(瞳孔)、Irises(光彩)、Sclera→目のテクスチャ
・Eyesocket→顔の素材で良い
半透明テクスチャをGIMPで作成する手順は以下の通り。

髪の毛の素材はすべて両サイドのStandardDS(SpecularSetup)に。Specularのテクスチャをセットすると、DAZっぽい見た目に。目の輝きが足りない?

やりすぎたか、輝きすぎた!?

長野声(21)がAI化される

AIボイスには出来不出来がある。「はぁ~なんていい声なんだ!」と思うようなものもあれば「いらんわっ!(怒)」といったものも多い。どうすれば、澄んだきれいなAI声を作成できるのだろう?てことで、合成音声用データ作成の経験値を高めるべく、自分の声をAI化してみた。わかったことは、

①録音機材が大事。クリアな声を録音しないと、AIボイスもクリアにならない。
②理想の抑揚をつけた声も必要。
③いくつかのニューラルネットから良いとこ取りをすると質が高いものができる。

である。2021年の声からけっこう良い長野ボイスができて、「老いを感じる」という罰ゲームが待っているとは、当初は気づかないのであった。

AI会話研究パタンBase

0-1.プロフィールの登録
0-2.AIエージェントとの会話(練習)

1-3.AIエージェントとの会話(男性B/あり)
1-4.AIエージェントとの会話(男性B/なし)
1-1.AIエージェントとの会話(男性A/あり)
1-2.AIエージェントとの会話(男性A/なし)

2-3.AIエージェントとの会話(女性B/あり)
2-4.AIエージェントとの会話(女性B/なし)
2-1.AIエージェントとの会話(女性A/あり)
2-2.AIエージェントとの会話(女性A/なし)

3-1.アンケート調査に回答

5.その他

MocapForAll

MocapForAllというアプリがある。複数のWebCamでキャプチャできる。デモ動画を見る限りは,けっこう正確にサンプルできているような。本当だったらスゲーな!
・・・複数のカメラとCVを組み合わせるのは良いとして,各カメラの関係をどうやって測定するのか。それをARで解決してるのは賢いな!このひと多分日本人だね?もう1.5年くらい開発してるって言うし,アリじゃないのか!?

ノンバーバルAI250113

AIエージェントに必要なノンバーバルコミュニケーション
GPTにチャットが加わったことで、大規模言語AIは爆発的に普及した。つまり偉大なテクノロジーもインターフェイス次第ということだ。AIエージェントにとって、ノンバーバルコミュニケーション能力はインターフェイスだ。これらを強化することで、GPT→ChatGPTのようなインパクトが生じうる・・・はず

エージェントに実装されるノンバーバル技能は3種類だ。
・表情・・・文脈に応じて笑う、眉を潜めるなど。
・ジェスチャ・・・文脈に応じて頷く、首をふるなど。
・視線・・・自信のないときは目線をそらすなど。
これらを充実させてコミュニケーションに統合することで、やがて違和感は消失に近づく・・・と思われる。

MMD その2

前回のつづき
今回はMMDモデル、モーション、カメラの導入と操作方法について解説する。

MMDモデルの導入
※特段モデルが何でも良い場合は3.モーション・カメラモーションのダウンロードまで読み飛ばしてほしい。
MMD向けのキャラクターモデルのデータはPMXという拡張子の付いたデータが用いられている。ニコニコ立体やpixiv、YouTubeなどで無料公開されている者やboothで有料公開されているものなどもある。また、初期状態でもいくつかのMMDモデルがMMDに入っている。


1.モデルのダウンロード
 上記の通り様々な媒体で公開されていることから検索エンジンにて「○○(キャラクター名など)、MMDモデル」という風に検索するのが最も手っ取り早い。動画サイトの場合は「○○(キャラクター名など)、MMDモデル 配布」などと入力するとよい。
今回はこのサイトよりShiniNet式 メジ〇マoクイーンをダウンロードする。
 ダウンロードしたzipファイルを解凍し必要な場所に保存する。著作者によってはDL時に連絡やコメントを残してほしい人もいるため確認すること。
推奨:ダウンロードしたモデルはMikuMikuDanceファイル内のUserFileのModelファイルに入れると確認しやすい

2.モデルの使用
 回答したファイルには以下のデータが入っている。※()内は本画像の場合
・画像データ (ファイル)
・使用方法の説明(license(WEB))
・利用規約 (read me)
・モデルデータ  (pmdまたはpmxファイル)

ファイルの中身を確認し、利用規約や必要に応じ使用方法を確認する。
ここまで確認出来たらMMDからこのデータを呼び出す。

MMDを起動し、左下のモデル操作の「読込」をクリック。
展開したエクスプローラーから展開したいモデルデータであるpmdまたはpmxファイルを選択する。

「モデル情報」で「OK」を選択

このように読み込めれば完了。最後にモデル操作の登録をクリックする。
以下どの操作でもそうだが、登録をクリックしないで他のモデルや他の設定を触ろうとするとそれまでのデータは保存されず、リセットさせられるので注意。
※青や赤の〇や🔲はボーンと呼ばれるもので後述する

3.モーション・カメラモーションのダウンロードと読み込み
 モデルと同様に他のデータもダウンロードする。
 今回は曲に合わせてモデルに踊ってもらいたいため、「曲名 MMD モーション」のように検索するとよい。 また、モーションに関しては動画サイトで検索すると確認にもなるので便利だと思う。
 カメラモーションに関してはモーションと同時に配布している場合のほかに、個別でダウンロードする場合もある。個別の場合は出力の前に正しく動くか確認すること
音楽とモーションのタイミングがずれることがある。
 モデルと同様に利用規約を確認の上、zipファイルをDL、展開する。
この際、モーション、カメラモーションはUserFileのMotionに入れると展開しやすい。
 今回、モデルには西沢さんPさんのチーズケーキクライシスを踊ってもらう。モーションはTarotaroさんが作成した   • 【MMD】チーズケーキクライシス ダンスモーション【モーション配布】  のモーション、カメラモーションを利用する。展開先はMotionファイルとした。

MMD編集画面上での設定に移る。まず、キャラクターモーションを付けてみる。まず、「モデル操作」のプルダウンからモーションを付けたいキャラクターを選択する。次にその状態のまま左上の「ファイル」の「モーションデータ読込」をクリック。先ほど保存した、モーションの内ダンスモーションをクリックして指定する。


キャラクターの姿勢が変わっていれば、モーションを正しくダウンロードで来ている。登録も忘れずに。

本モーションはダンスモーション(体の動き)とリップシンク(口)が分かれていたためリップシンクのモーションも同様に付ける。
また、モーション読み込み時に画像のような警告が出ることがある。

これはMMDモデルとモーションのボーンが不一致の場合に出る警告で、このような場合動作チェックでおかしな動きをしている部分が無いか、チェックしておく事。(要はボーンが合ってないから、適応できるところだけモーションを付ける感じで良いか?と聞かれている)

 次にカメラモーションの設定にうつる。
 設定の仕方はほとんど同じで「モデル操作」のプルダウンから「カメラ・照明・アクセサリ」を選択。その状態のまま左上の「ファイル」の「モーションデータ読込」から今度はカメラモーションを選択する。


画面の表示が変わったら、これでモーション関連の設定は終了。

4.背景のダウンロード
 背景を使用したい場合、背景もモデルとモデルと同様に利用規約を確認の上、zipファイルをDL、展開する。
 使用できるファイルは様々で写真や黒一色といった画像ファイルの他、キャラクターと同じpmx形式のものも存在する。展開先であるが、pmx形式であればUserFile内のModelファイルそれ以外のAVIファイル、jpegなどはBackGroundファイルに保存するのがおすすめ。
 今回はpmx形式のヨッシー式_トレセン学園ホームを使用した。pmx形式のためモデルと同様に「モデル操作」から「読込」で読み込む。
 それ以外の画像ファイルを読み込む場合は左上の「背景(B)」から。

5.動作チェック
ここまでくると一応キャラクターを踊らせることが出来る。
「モデル操作」が「カメラ・照明・アクセサリ」になっていることを確認し画面右端の「再生」をクリックすると、カメラモーション付き(つまり動画再生時と同様の状態)で確認できる。(逆に定点から確認したい場合はMMDモデルを選択した状態で再生)
また、右上の「座標軸」をオフにするとよい。


これを出力すればそれっぽい動画にはなるが、次回はさらにエフェクトを付け、最後に出力方法の解説まで行いたい。取り急ぎ今回はここまで。

ログイン画面の改造1

phpMyAdmin・MySQLの使用
 修論のアプリ開発で,Client_IDのみのログインだと安全性に欠けるため,ID・Password欄を設けることにした.GPTに相談したところ,「パスワードはハッシュ化して,phpMyAdmin・MySQLから確認すればいい」とのことだが,MySQLのログイン時にさくらサーバーの管理ID等が必要なため,一時保留にした(TeraTermからサーバーにSSH接続が可能だが,どのみちMySQLが必要らしい).

mysql -u your_username -p

.csvファイルに書き込む場合
 MySQL以外の方法として,.csvに直接書き込む方法もあるが,こちらは「セキュリティの脆弱性や,DLの危険性,同時書き込みの衝突」がある.セキュリティ面の対策として,下記のコードを同ディレクトリ内に置く,つまり「.htaccess で外部アクセスを遮断」しておくことで,外部からのDLを回避できるようだ(.csvに直接パスワードを付けようと思いついたが,こちらはその都度解凍処理が求められる).

//.htaccess で外部アクセスを遮断

<Files "users.csv">
    Require all denied
</Files>

さらに,public_html の外に置いて,外部に公開するようのディレクトリと,非公開用のディレクトリに分けることで,外部からのアクセスを拒否することが可能.

//public_html の外に置く

├── public_html/                     ← 外部に公開するファイル専用
│   ├── Shigeta/
│   │   ├── register_users_csv.php  ← CSVデータを操作するPHPスクリプト
│   │   └── (その他の公開ファイル)
├── secure_data/                     ← 非公開ファイル専用
│   ├── users.csv                   ← 外部からアクセスを拒否
│   └─ .htaccess                  ← このファイルを作成
└── (その他のファイル)

当初開発予定だったもの
 ログイン画面・新規登録用の2つに分けて,新規登録者はこちらからcsvにどんどん書き込んでもらおうと考えていた.しかし,同時書き込み衝突の危険と,実験者側で事前に決めるという路線に変更.これから開発するものとしては,「ID・Pass」の入力欄を設けて,それをクリアした場合にClient_IDでディレクトリから画像を取り出すという仕様に変更する予定.となると,Client_IDはやはり紐づけして,パスワードをどうにかしてハッシュ化できるようにしないとだ.

あ,そうだ.以前作成したupload.phpが,「①Fitbitグラフの保存,②新規のみClient_IDに応じたディレクトリの作成」の機能を加えていたんだ.これに加えて,users.csvにID・パスワード(ランダムで4文字ずつ),Client_IDの関連付けて書き込んで保存すればいいんだ.Unityは,users.csvを参照して,IDを拾ってくる.これで自動化?

その他の感情分析

思考が拡散するのはリラックスしてる証拠だろうか・・・。そもそもUDPで送るのならOpenCVにこだわる必要もないし,もっと使いやすい表情分析ソリューションはないのだろうか?
Py-Feat
Python用の表情認識ツールキット。7表情やAU,特徴点,頭部の姿勢もわかる。これ・・・GPTの作成するプログラムで直ぐに動きそうに思うが。
Py-Featを使って表情認識をやってみた 基本的な使い方がわかる。
表情分析OSS Py-Featをつかってみた 頭部の姿勢検出が強力とある。

FER(Facial Expression Recognition)
これがOpenCVの元ネタに思える。

Microsoft AZURE
顔認識のサービスがある

Affectiva
かなり昔からある感情評定サービス。Unity用SDKがあるらしい。ブラウザで動作するデモが秀逸。ああ,これくらいだと利用しやすいんだけどなぁ・・・