月別アーカイブ: 2024年12月

その他の感情分析

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

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

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

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

表情模倣しながらAIと話す

プロジェクトはWindowsネイティブアプリ用に
WebGLアプリはUDPで表情認識AIの情報受け取れないし・・・一体どうしたらよいのか。結局,WebGL版の模擬人格プロジェクトをコピーして,Windowsネイティブアプリにしてビルドしてみたら,意外に良い感じで動いたので,こちらで行くことにしました。プロジェクトの名前はNative6です。ビルドターゲットのスイッチは7分弱かかって,頻繁に行うのは現実的じゃないです。
表情データの送信方式
遅きに失した感もありますが,オープンCVで認識した感情データをudpで送る部分はすでにできていたので,後はAIの情報を受け取るプログラムをGPT4oに作成してもらい,そこから感情情報を抜き出し,コミュニケーションに加味できるように,調整してみました。
実際に動かしてみて
感想としては,感情認識のタイミングがOpenAIへの問い合わせ依存なので,ややテンポが遅いようにも感じる。しかし現実のコミュニケーションも案外こんなもんかもしれない。
1.リアルタイムで感情模倣が起こることが大切なのか
2.GPT4oにこちらの感情状態が伝わることが大切なのか
どちらにしても表情を合わせてくれるので,これらの要因が実際のコミュニケーションでどんな風に機能するのかまだよくわからない。生きた人間のコミュニケーションでは,相手の(時として細やかな)表情を瞬時に読み取り,相手の意図や,コミュニケーション内容の真偽を直感的に評定していたりする。こういったコミュニケーションがAIエージェントに果たして可能なのか,そもそも必要なのか,研究はまだ始まったばかりだから分からないことだらけだ。

PsychoPy+Processing#01

PsychoPyと外部プログラムの連携
ここでは,下記のようなシンプルな実験プロジェクトに外部プログラムで測定した測定結果をUDPで送り込み保存してみる。プロジェクトは,Fixation(+)の後にTarget(□)が出るので,スペースキーを押すと,反応時間が記録されるというもの。

BuilderのPythonマーク(青と黄のヘビ)をクリックすると,Coderが起動する。ここでコードを改造すると,UnityやProcessingからのデータを受け取ることができる。ただし,Builderでコードを生成すると,改造部分はすべて消し飛ぶので注意が必要だ。

まず冒頭で,ライブラリを呼んで,グローバル変数とUDPでデータを受け取るサブルーチンを用意する。

############# NAGANO #################
import socket
import threading

# UDPソケット設定
UDP_IP = "127.0.0.1"  # 受信するIPアドレス
UDP_PORT = 5005       # ポート番号

# グローバル変数に最新のUDPデータを格納
latest_udp_data = "No Data"

def udp_listener():
    """非同期でUDPデータを受信する関数"""
    global latest_udp_data
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind((UDP_IP, UDP_PORT))
    while True:
        data, addr = sock.recvfrom(1024)  # 1024バイトまで受信
        latest_udp_data = data.decode("utf-8")  # デコードして文字列に
############# NAGANO #################

次にプログラム開始部分でスレッドをスタートする。

    win = setupWindow(expInfo=expInfo)
    setupDevices(expInfo=expInfo, thisExp=thisExp, win=win)
    
    ############# NAGANO #################
    # UDPリスナーをスレッドで起動
    udp_thread = threading.Thread(target=udp_listener, daemon=True)
    udp_thread.start()    
    ############# NAGANO #################

でさらに,UDPでうけとったデータを保存する。データの受取は,別スレッドが非同期で行ってくれる。

                    key_resp_target.duration = _key_resp_target_allKeys[-1].duration
                    
                    ############# NAGANO #################
                    # UDPデータをログに記録
                    thisExp.addData('UDP_Data', latest_udp_data)
                    thisExp.addData('KeyPress_Time', globalClock.getTime())  # キー押下時刻も記録
                    ############# NAGANO #################
        
                    # a response ends the routine
                    continueRoutine = False

実行すると,以下のような感じでUDP経由で送られたデータが保存される。ちなみに,データ送信側は,ローカルホストの5005ポートにProcessingでCerry,Diamond,Sevenのどれかひとつの文字列を送るもの。もう一度いうが,Builderで更新するとこれらの改造部分は消し飛ぶので注意

SpeakerID一覧

VoiceVOXやCoeiroInkのSpeakerIDが必要になるときがある。・・・あるんだってば。VoiceVOXに関してはここから参照。

キャラクター名 スタイル ID
四国めたん ノーマル 2
あまあま 0
ツンツン 6
セクシー 4
ささやき 36
ヒソヒソ 37
ずんだもん ノーマル 3
あまあま 1
ツンツン 7
セクシー 5
ささやき 22
ヒソヒソ 38
春日部つむぎ ノーマル 8
雨晴はう ノーマル 10
波音リツ ノーマル 9
玄野武宏 ノーマル 11
喜び 39
ツンギレ 40
悲しみ 41
白上虎太郎 ふつう 12
わーい 32
びくびく 33
おこ 34
びえーん 35
青山龍星 ノーマル 13
冥鳴ひまり ノーマル 14
九州そら ノーマル 16
あまあま 15
ツンツン 18
セクシー 17
ささやき 19
もち子さん ノーマル 20
剣崎雌雄 ノーマル 21
WhiteCUL ノーマル 23
たのしい 24
かなしい 25
びえーん 26
後鬼 人間ver. 27
ぬいぐるみver. 28
No.7 ノーマル 29
アナウンス 30
読み聞かせ 31
ちび式じい ノーマル 42
櫻歌ミコ ノーマル 43
第二形態 44
ロリ 45
小夜/SAYO ノーマル 46
ナースロボ_タイプT ノーマル 47
楽々 48
恐怖 49
内緒話 50

CoeiroINKは下記のような感じ
//つくよみちゃん(れいせい) 0
//つくよみちゃん(おしとやか) 5
//つくよみちゃん(元気) 6
//KANA(のーまる) 30
//KANA(えんげき) 31
//KANA(ほうかご) 32
//リリンちゃん(ノーマル) 90
//リリンちゃん(ささやき) 91
//モモイヒナ-A 1737595468
//KAKU_N 259
//KAKU_W 260