4. StackChanと目線を合わせて会話したい
Q. StackChan に以下の動作をさせたいのですが、どのような処理が必要になりますか?
声を掛ける、もしくは頭をなでると
私の顔を見て(私と目線を合わせて)
会話を始める
私が姿勢を変えてもずっと見ている
私の表情や声のトーンから私の感情を読み取り
会話に反映させる
ふたたび声を掛ける、もしくは頭をなでると
待機状態に移行する
また、これらの動作が StackChan 単体での処理が難しい場合、何を追加すればよいですか?
A. M5Stack StackChan(以下、StackChan)の公式ファームウェアは
カメラ(0.3MP)
パン/チルトサーボ(水平360°フィードバック、垂直90°)
3ゾーンタッチパネル
デュアルマイク
表情アニメーション
音声ウェイクワード("Hi, StackChan")
などの基盤を備えており、工場出荷状態でもアバターモードやモーション制御が可能です。ただし、ご要望の連続的な顔追跡・感情読み取り・会話反映・状態遷移を高精度かつローカルで安定動作させるには、カスタム処理が必須です。
以下に、必要な処理を整理して説明します。
1. 全体の処理フロー
ご要望は明確な有限オートマトン(Finite State Machine、限られた数の「状態」と「入力」を持ち、入力に応じて状態を遷移させていく計算モデル)として設計可能です:
待機状態(STANDBY):アイドルアニメーション(瞬き、ランダムな頭の動き、睡眠表情など)。低消費電力寄り。
起動トリガー検出:声掛け or 頭をなでる(タッチ)。
アクティブ状態(ACTIVE / CHATTING):
顔を検出・追跡し、目線を合わせて物理的に向き続ける
会話を開始(挨拶 + 初回感情推定)
姿勢変化中も継続追跡
表情(ビジョン)+声のトーン(オーディオ)を定期的に読み取り、LLMコンテキストに反映
終了トリガー検出:再度声掛け or 頭をなでる → 待機状態へ移行(お別れの挨拶 → 追跡停止 → アイドル復帰)
実装場所:主にStackChanのファームウェア(Arduino / ESP-IDF / UiFlow2対応)で状態管理と低レイテンシ制御を行い、重い推論はModule LLMや上位エージェントにオフロードします。
2. 各動作に必要な具体的な処理
(1) 声を掛ける / 頭をなでる(トリガー検出)
タッチ:
既存の3ゾーンタッチパネルまたは画面タッチを拡張。頭なでる動作に「長押し」や「特定ゾーン+ジェスチャー」をマッピング(工場ファームウェアですでにタッチで表情変化を実装済みなので容易に拡張可能)。音声:
ウェイクワード検出(工場搭載の"Hi, StackChan"を拡張、またはModule LLMのKWS機能を使用)。日本語対応を強化した事例もあります。処理:
割り込みまたはポーリングで検知 → 状態遷移 → 追跡開始コマンド発行。
(2) 私の顔を見て(顔検出)姿勢を変えてもずっと見ている(顔追跡)
StackChanの内蔵カメラ(GC0308)+サーボで物理的な顔追跡が可能です(過去のコミュニティ版stack-chanではUnitV2で顔位置を検出→サーボ制御の実績あり)。
必要な処理
カメラフレーム取得 → 顔検出(バウンディングボックス or ランドマーク)
顔の重心位置からパン/チルト角度を計算(PID制御で滑らかに追従。フィードバックサーボを活用)
顔をロストした場合の再取得ロジック(サーチモード or 中央復帰)
目線合わせ:頭部をユーザーに向ける+画面上の目アニメーションを相対位置に応じて微調整(既存の表情アニメーションを拡張)
Module LLM追加推奨
CV/VLM機能(YOLO系やVLMで「顔の位置・向き」を推定)で精度を大幅に向上。ESP32-S3単体ではリアルタイム高精度追跡に限界があります。
(3) 会話を始める・私の表情や声のトーンから感情を読み取り・会話に反映させる
会話開始
トリガー検出後、TTSで挨拶を発話。Module LLMまたは上位LLMで初期応答生成。感情読み取り
表情:カメラフレームをModule LLMのVLMに送信 → 「この画像の人物の感情を happy/sad/angry/neutral/surprised などで分類し、信頼度を付与」とプロンプト。定期サンプリング(会話中1-2秒間隔)。
声のトーン:音声セグメントをASR(Module LLM)でテキスト化しつつ、 prosody特徴(ピッチ・エネルギーなど)を簡易抽出 or 短い音声クリップを解析。Module LLMの音声機能や上位で感情推定。
融合:顔感情スコア + 声トーンスコア + 会話文脈をまとめてLLMに渡す。
会話反映
LLMのシステムプロンプトに「現在のユーザー感情:顔でhappy 75%、声で穏やか。共感的・温かいトーンで応答せよ」と明示的に含める。これにより自然な共感応答が可能になります。処理の流れ
音声検知(VAD)→ ASR → 感情推定 → LLM推論(コンテキスト付き)→ TTS発話(並行して追跡継続)。再度トリガー → 待機状態移行
終了時は「またね」などのTTS + 頭をニュートラル位置に戻す + アイドルアニメーション復帰。
3. 単体処理が難しい場合の追加推奨
CoreS3単体では高度なリアルタイム感情認識と自然な会話は困難です。
計算資源・メモリ制約により、正確なFER/SERモデルや大規模LLM推論が厳しい)
工場ファームウェアのAI Agentは基本的なQ&Aやデバイス制御に留まります
強く推奨する追加構成:
(1) Module LLMの統合(最優先)
Module LLM:3.2 TOPSのエッジAIアクセラレータ。オフラインでKWS/ASR/TTS、小規模LLM(Qwen2.5-0.5B〜1.5Bクラス)、VLM/CV(顔・表情解析向け)をローカル実行可能。
StackChanとの接続は拡張ケーブル経由で可能ですが、カスタムファームウェア開発が必要(UART/シリアルで顔座標・感情スコア・音声テキストをやり取りするプロトコルを定義)。
既存事例:Module LLMをStack-chanに適用してオフライン会話を実現したプロジェクトあり(日本語モデル差し替えも実施例あり)。これを基に拡張すると効率的です。
(2) OpenClawをゲートウェイ/オーケストレーターとして活用
StackChan(+Module LLM)を「身体・センサー/アクチュエータ層」として位置づけ、OpenClawを上位の有限オートマトン(エージェントの脳)として動作させる。
StackChan側:
低レイテンシ処理(追跡PID、トリガー検知、基本アニメーション)とデータ送信(Wi-Fi経由でWebSocket/MQTTなど)のみ担当。OpenClaw側:
感情融合ロジック、会話履歴管理、複雑な状態遷移、あなたのMac Studio上の高性能ローカルLLM(27-32Bクラスなど)呼び出し、スキル/プラグインによる行動決定。
この構成であれば、ご要望の「声掛け/頭なで → 顔を見て会話開始 → 感情を読み取って反映 → 再度トリガーで待機」という一連の動作が、ローカルで自然かつプライバシーを保ちながら実現できます。ダッシュボードでの監視・デバッグも容易になります。
(3) その他の補強
通信:Wi-Fi必須。Module LLMとOpenClaw間のプロトコルはJSONベースの軽量コマンドで設計(例: {"cmd":"move_head", "pan": 120, "emotion":"happy"})。
Fan Moduleの追加:熱による性能不安定を防ぎ、ユーザ体験の安定化に寄与します。Module LLM統合の後工程として追加するのが効率的です。
頭なでセンサー:3ゾーンタッチで代用可能ですが、直感的でない場合はGrove静電容量センサーを頭部3Dプリントパーツに埋め込んで追加。
視認性向上:低解像度カメラの限界を感じる場合は、Module LLMのUSBカメラサポートを活用した高解像度化を検討。
4. 実装の進め方(推奨順序)
工場ファームウェアをベースに、タッチ/ウェイクワードによる状態遷移と基本的なサーボ追跡をArduino/ESP-IDFで実装・テスト
Module LLMを接続し、カスタムFWでVLM/ASR連携を追加(顔座標・感情推定のオフロード)
OpenClaw連携層を構築(StackChanからのイベント受信 → 高レベル判断 → コマンド送信)。ここで感情反映プロンプトや状態機械の詳細ロジックを実装
感情モデルのチューニングとユーザー評価ループ
公式GitHub(m5stack/StackChan)とModule LLM関連ドキュメントを参照しながら進めるのが最も確実です。
上記は電子工作の素人がGrokにまとめさせた覚え書き(下調べ)です。
「それならもっといいやり方がある」「ここ、Grok間違ってる」といった情報がありましたら、ご教授頂けますと幸いです。(オリジナルのX記事はこちら)
参考:StackChanへのModule LLM取り付け

参考:StackChanの構造

