M5Stack版 StackChanがやってきた ③ 技術要素を調べる

魅惑のお尻

M5Stack版 Stackchanの技術概要を調べる

M5Stack版 Stackchan の技術概要を、公式のソースや情報などからまるっと調べてみた。
(かなりAI を使ってます)

ドキュメント・リポジトリなど

アーキテクチャの選択肢

オリジナル版 StackChan は JavaScript/TypeScript(Moddable SDK)がベースである一方、M5Stack版は C++ (ESP-IDF) で書かれている。

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サーバを指定できるような仕組みはあるのか?(チラ見した感じだとありそう)
・・・などなど、興味は尽きない。いずれもカスタマイズで何とかなる範疇ではあろう。

概ね、仕組みは分かったので、ひとつひとつ順番にチャレンジしていくぞ。

上部へスクロール