
魅惑のお尻
M5Stack版 Stackchanの技術概要を調べる
M5Stack版 Stackchan の技術概要を、公式のソースや情報などからまるっと調べてみた。
(かなりAI を使ってます)
ドキュメント・リポジトリなど
- M5Stack版 StackChan 製品ページ
https://shop.m5stack.com/products/stackchan-kawaii-co-created-open-source-ai-desktop-robot - M5Stack版 StackChan 公式ドキュメント
https://docs.m5stack.com/ja/StackChan - M5Stack版 StackChan リポジトリ
https://github.com/m5stack/StackChan - M5Stack版 StackChan BSP リポジトリ
(Board Support Package・ハードウェアの初期化コードをひとまとめにしたライブラリ)
https://github.com/m5stack/StackChan-BSP - オリジナル版 StackChan リポジトリ
https://github.com/stack-chan/stack-chan - StackChan コミュニティ
https://github.com/stack-chan
アーキテクチャの選択肢
オリジナル版 StackChan は JavaScript/TypeScript(Moddable SDK)がベースである一方、M5Stack版は C++ (ESP-IDF) で書かれている。
- ESP-IDF Programming Guide
https://docs.espressif.com/projects/esp-idf/en/latest/esp32
StackChan = JavaScriptのイメージが凄く強かったが、M5Stack 版は、そうじゃないと。
本格的に開発していくにあたって、自分に合わせた言語選びは結構大事な気はする。
私としては「コード解析ができるAIアシスタントツールを使いながら、公式ファームを書き換えていく」方針として、最初はあまり気にしないことにした。
また、UiFlow2という、M5Stack公式のビジュアルプログラミング環境(IDE)が存在する。
この UiFlow2 対応版のStackChanのファームウェアも存在している。M5 Burner というソフトでファームを書き込むことで、対応できるようだ。
ブラウザもしくはローカルアプリで、MicroPython でプログラムを書き、Wi-Fi経由でデバイスに転送・実行ができる。
いわゆるローコード、ノーコードの環境なので、コードを書かずにブロック式のドラッグ&ドロップ開発もできるらしい。
ただ、AI Agent 機能は含まれず、あくまでもハードウェアを制御するプログラミング環境、という位置づけ模様。
うーん、あくまでも個人の趣向ではあるが、ローコードノーコードツールは肌に合わないので、こちらの選択肢は一旦横に置いておく。
そういったものが好きな人、ビジュアル嗜好な人は使っていけばいいと思う。
オリジナル版 StackChan のファームを、M5版に適用する手法は、後で調べる。そんなにハードルは高くないはずだけど、ハードウェア構成から調べないといけない気がする。
個人的には C++ より馴染みがあるので、将来的にはこちらなり、Python あたりに寄せたい気持ち。
というか「M5版とは別に、1から StackChan を作ることにもチャレンジせねばなるまい」という想いを持った。
まずは、手元のM5版のファームを自在に入れ替えることができるような環境が必要と認識した。
私としては、本当にイチから調べて触るので、最初はM5版のファームをベースに色々試す方針で行く。
AI Agent モード時のシステム構成 概要
実際に StackChan と戯れてみた感じ、AI Agent 機能が全部 StackChan 内で完結しているようには思えなかった。
当然、クラウド側と通信してると思うんだが、どのようなことを、どこまでやっているのか?M5Stack版のソースを AI を使って読み解いてもらった。
===================================
■ StackChan (ESP32-S3) 内 でやっていること ■
・ウェイクワード検出 (“Hi StackChan”) ← デバイス上で完結
・マイクで音声取得 → OPUS エンコード(圧縮) → サーバーに送信
・サーバーから返ってきた音声を OPUS デコード → スピーカー再生
・顔アニメーション、サーボモーション、LED制御処理
===================================
↓↑ WebSocket (音声バイナリ + JSON制御メッセージ)
===================================
■ AI対話サーバー (xiaozhi-esp32-server) ■
音声認識 (ASR) 、AI応答生成 (LLM) 、音声合成 (TTS) を担う
① デバイスからOPUS音声受信 → デコード
② VAD (発話区間検出) — SileroVAD
③ ASR (音声→テキスト) — FunASR / 各種API
④ LLM (テキスト→応答テキスト) — Qwen等
⑤ TTS (応答テキスト→音声) — EdgeTTS 等
⑥ 音声を OPUS エンコード → デバイスに返送
⑦ emotion (感情) / status (状態) を JSON で通知
===================================
デフォルトの通信先サーバ
デフォルトの通信先として、箱出し状態の M5版 StackChan の接続先は以下の通り。
これらは、公式ファームウェア内の Kconfig.projbuild ファイルに書かれている。

| 名前 | 接続先(デフォルト値) | 役割 | ソース |
| StackChan バックエンドサーバー | http://47.113.125.164:12800 | アプリ連携、デバイス管理、ダンス、WebSocket中継 | stackchanのリボジトリ、/server 内 (Go) |
| OTA サーバー | https://api.tenclass.net/xiaozhi/ota/ (運営元は tenclass 社。XiaoZhi の商用プラットフォーム運営元) | オンラインアップデート AI対話先サーバの接続URL配布 | サーバーソースは非公開だが、 デバイス側のコード(ota.cc)は公開されているので、何を送っているかは確認可能 |
| AI 対話サーバー | xiaozhi.me (OTA経由で動的に取得) | 音声認識 → LLM → 音声合成 | xiaozhi-esp32-server (Python) |
AIエージェントモードでは、入力音声データは中国国内のクラウド上のサーバに送られ、そこで ASR→LLM→TTS されて返ってくる仕組み。
セルフホストでサーバを使いたい場合は、普通に設定を書き換えればいいだけのようだ。
AI対話サーバの実態である xiaozhi-esp32-server は、GitHubで公開されている。
https://github.com/xinnan-tech/xiaozhi-esp32-server
中身は、コンテナ(Docker)イメージなので、セットアップ自体は自前でできそうだ。
サーバーをセットアップすれば、ブラウザの管理コンソールから、ASR、LLM、TTS それぞれの接続先を指定できるらしい。
APIの投げ先のURLとかを入力するボックスでもあるんだろう、多分。
まとめ
StackChan は、マイク、スピーカー、アバターを持った「端末」であり、AI の知性はすべてサーバー側にある。
ローカルのStackChanは、サーバー側でOPUSエンコードされた音声データをストリームで流している、という仕組みのようだ。
デバイス単体では AI として何もできない。サーバーが無ければ会話もできない。
逆に言えば、サーバー側の設定を差し替えれば AI の中身を自由に変えられるということだろう。
| 処理 | 場所 | 備考 |
| ウェイクワード検出 | デバイス | ESP-SR WakeNet、オフライン |
| 音声エンコード/デコード | デバイス | OPUS codec |
| VAD (発話区間検出) | サーバー | SileroVAD |
| ASR (音声認識) | サーバー | テキスト化 |
| LLM (応答生成) | サーバー (or クラウドAPI) | 思考の本体 |
| TTS (音声合成) | サーバー | 読み上げ音声生成 |
| 感情判定 | サーバー | LLMの応答に emotion タグ付与 |
| 顔アニメーション | デバイス | emotion を受けて表情変更 |
| サーボモーション | デバイス | idle motion / speaking motion |
| LED制御 | デバイス | ステータスに応じて色変更 |
今後の方針・ファーストステップ
LLMに何を使うかは少し考える必要はあるが、まずは簡易的にStackChanのファーム更新くらいは自前でできるようにする。
いわゆる「Lチカ」あたりで、StackChan自身のLEDの設定を変えて書き込むくらいから始めてみる。
StackChanデバイスへのファームウェア書き込みを自在にできるようになったら、AI対話サーバ(xiaozhi-esp32-server)を、家庭内LANに立ち上げる。
この際、LLMをどこに持たせるかも決める 。ローカル Ollama でもいいし、何かクラウドサービスを使ってもいい。
AI対話サーバについては自前で完結することを目指す。
StackChanのAI対話先サーバを、家庭内LANのAI対話先サーバに向けて、どんな設定ができるかも見てみる。
音声合成の部分も変えてあげれば、自在にキャラクター性を持たせることができるはず。
Voicevox あたりを試してみてもいいかもしれない。こちらも Dockerイメージが配布されていて、API経由で利用ができるはず。
インターネット上の情報の検索、フェッチや、API で利用するニュースサービス、天気サービスの指定はできるのか?
昨今の流行に則って、MCPサーバを指定できるような仕組みはあるのか?(チラ見した感じだとありそう)
・・・などなど、興味は尽きない。いずれもカスタマイズで何とかなる範疇ではあろう。
概ね、仕組みは分かったので、ひとつひとつ順番にチャレンジしていくぞ。