MacでStackChan物語 #1 Gemma4を頭脳にする環境を構築する
本記事は通常のセットアップではございませんので、
普通にスタックチャンを使いたい人は他の記事をお読みください。
今回は私のLLM勉強を兼ねているので割と細かくやったことを書いています。
備忘録もかねて。
M5Stack版 StackChanとは?

M5Stack版 StackChan(スタックチャン)は、
M5Stack社の小型マイコン「M5Stack」をベースに開発された、手のひらサイズのオープンソース・コミュニケーションロボットです。
通常はQwenなどを使うみたいです。
デフォルトでも十分に楽しめるのでぜひ遊んでみてください。
んで、
僕の環境はこちら
MacBookPro M1MAX 32GB
macOS Tahoe 26.5.1(2026/7/8時点)
LLM:Gemma4 12B
スタックチャン (スペックなど詳しくはわからない)目指すは、MacBook Pro + Ollama + Gemma4 + StackChan AI.AGENT です。
┌──────────────────────┐
│ StackChan │
│----------------------│
│ 音声入力 │
│ 表情 │
│ スピーカー │
│ AI.AGENT Firmware │
└─────────┬────────────┘
│ Wi-Fi
│
WebSocket / HTTP
│
┌─────────▼────────────┐
│ MacBook Pro M1 Max │
│----------------------│
│ AI.AGENT Server │
│ Ollama │
│ Gemma4 12B │
└─────────┬────────────┘
│
Skill / MCP
│
RAG,,,etc,,,,,,こんな感じでしょうか。
Ollamaじゃなくてもいいけど、簡単だからそれで押し通す
セットアップ手順
git clone https://github.com/xinnan-tech/xiaozhi-esp32-server.gitgit cloneしました。
xiaozhi-esp32-server は AIエージェントの「司令塔」です。
このままだとMacでちゃんと動かないっぽい
satoshi@Satoshi-MacBook-Pro git % git clone https://github.com/xinnan-tech/xiaozhi-esp32-server.git
Cloning into 'xiaozhi-esp32-server'...
remote: Enumerating objects: 34818, done.
remote: Counting objects: 100% (787/787), done.
remote: Compressing objects: 100% (352/352), done.
remote: Total 34818 (delta 562), reused 474 (delta 430), pack-reused 34031 (from 4)
Receiving objects: 100% (34818/34818), 190.01 MiB | 2.96 MiB/s, done.
Resolving deltas: 100% (21738/21738), done.中身を見てみると、
satoshi@Satoshi-MacBook-Pro xiaozhi-esp32-server % ls
docker-setup.sh Dockerfile-server-base docs main
Dockerfile-server Dockerfile-web LICENSE README.mdStackChan
↓
音声受信
↓
音声認識(ASR)
↓
Gemma4へ質問
↓
Gemma4が回答
↓
必要ならTool実行
↓
音声合成(TTS)
↓
StackChanへ返すって感じを目指します
環境の確認
satoshi@Satoshi-MacBook-Pro git % docker --version
docker compose version
Docker version 24.0.2, build cb74dfc
Docker Compose version v2.19.1
satoshi@Satoshi-MacBook-Pro git % ollama list
NAME ID SIZE MODIFIED
gemma4:latest c6eb396dbd59 9.6 GB 12 days ago
gemma4:12b 4eb23ef187e2 7.6 GB 4 weeks ago
satoshi@Satoshi-MacBook-Pro git % curl http://localhost:11434/api/tags
{"models":[{"name":"gemma4:latest","model":"gemma4:latest","modified_at":"2026-06-27T18:50:27.578652437+09:00","size":9608350718,"digest":"c6eb396dbd5992bbe3f5cdb947e8bbc0ee413d7c17e2beaae69f5d569cf982eb","details":{"parent_model":"","format":"gguf","family":"gemma4","families":["gemma4"],"parameter_size":"8.0B","quantization_level":"Q4_K_M"},"capabilities":["completion","tools","thinking"]},{"name":"gemma4:12b","model":"gemma4:12b","modified_at":"2026-06-06T18:25:15.3379332+09:00","size":7556508396,"digest":"4eb23ef187e2c5462566d6a1d3bbbc2f1346d0b4327cbb66d58fffbcc9b2b05c","details":{"parent_model":"","format":"gguf","family":"gemma4","families":["gemma4"],"parameter_size":"11.9B","quantization_level":"Q4_K_M","context_length":262144,"embedding_length":3840},"capabilities":["completion","tools","thinking","vision"]}]}% satoshi@Satoshi-MacBook-Pro git %
✅ Docker Desktop 使用可能
✅ Docker Compose 使用可能
✅ Ollama 起動中
✅ gemma4:12b 導入済み
✅ Ollama API 応答OK
✅ gemma4:12b は tools / thinking / vision 対応
次に次のファイルを作ります。
cd main/xiaozhi-server
mkdir -p data
nano data/.config.yamlserver:
websocket: ws://MacのIPアドレス:8000/xiaozhi/v1/
vision_explain: http://MacのIPアドレス:8003/mcp/vision/explain
timezone_offset: +9
selected_module:
LLM: OllamaLLM
LLM:
OllamaLLM:
type: ollama
model_name: gemma4:12b
base_url: http://host.docker.internal:11434ここまでで、
✅ MacBook Pro
↓
✅ Ollama
↓
✅ Gemma4:12b
↓
✅ xiaozhi-serverの接続先設定
という「Gemma4を頭脳として使う」設定が完了
satoshi@Satoshi-MacBook-Pro xiaozhi-esp32-server % docker manifest inspect ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.index.v1+json",
"manifests": [
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 2205,
"digest": "sha256:fd2e8c0ea609f2b95bfea9c486476c84719eadd69cc123389218bbe24629e540",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 2204,
"digest": "sha256:a9774bff3a803bd27befdc47ce5e9c72434608badc2e4cfe3223704308012bb6",
"platform": {
"architecture": "arm64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 565,
"digest": "sha256:98221290f1f032ecaaf63e7989cb2a075170af22d7cb7af7652dd1a23cd2359a",
"platform": {
"architecture": "unknown",
"os": "unknown"
}
},
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 565,
"digest": "sha256:578cde826d156361c530ca7583f10d608a24af89f422fdd55e09a29b7215dabd",
"platform": {
"architecture": "unknown",
"os": "unknown"
}
}
]
}
satoshi@Satoshi-MacBook-Pro xiaozhi-esp32-server %
どうやらM1MAXでもこのDockerイメージは動きそうです。
Apple Silicon (M1/M2/M3/M4) 向けイメージが公式に用意されています。
Dockerアプリを起動します
satoshi@Satoshi-MacBook-Pro xiaozhi-server % docker compose pull
[+] Pulling 1/1
✔ xiaozhi-esp32-server Pulled 3.7s
satoshi@Satoshi-MacBook-Pro xiaozhi-server % docker compose up
[+] Running 2/0
✔ Network xiaozhi-server_default Created 0.0s
✔ Container xiaozhi-esp32-server Created 0.0s
Attaching to xiaozhi-esp32-server
xiaozhi-esp32-server | onnxruntime cpuid_info warning: Unknown CPU vendor. cpuinfo_vendor value: 0
xiaozhi-esp32-server | 260710 12:42:05[0.9.5_00000000000000][core.utils.gc_manager]-INFO-启动全局GC管理器,间隔300秒
xiaozhi-esp32-server | 260710 12:42:05[0.9.5_00000000000000][core.utils.modules_initialize]-INFO-初始化组件: llm成功 OllamaLLM
xiaozhi-esp32-server | 260710 12:42:05[0.9.5_00000000000000][core.utils.modules_initialize]-INFO-初始化组件: intent成功 function_call
xiaozhi-esp32-server | 260710 12:42:05[0.9.5_00000000000000][core.utils.modules_initialize]-INFO-初始化组件: memory成功 nomem
xiaozhi-esp32-server | 260710 12:42:05[0.9.5_00000000000000][core.providers.vad.silero]-INFO-SileroVAD
xiaozhi-esp32-server | 260710 12:42:05[0.9.5_00000000000000][core.utils.modules_initialize]-INFO-初始化组件: vad成功 SileroVAD
xiaozhi-esp32-server | 260710 12:42:10[0.9.5_00000000000000][core.providers.asr.fun_local]-INFO-funasr version: 1.2.7.
xiaozhi-esp32-server | 260710 12:42:10[0.9.5_00000000000000][core.utils.gc_manager]-INFO-GC循环任务被取消
xiaozhi-esp32-server | 260710 12:42:10[0.9.5_00000000000000][core.utils.gc_manager]-INFO-GC循环任务已退出なんか中国語でてきた
初回起動時、SenseVoiceSmallの model.pt が未配置だったため、
Dockerが同名のディレクトリを自動作成してしまい、
IsADirectoryError が発生した。
誤って作成されたディレクトリを削除し、
公式モデルの model.pt を配置することで解消した。
┌──────────────────────┐
│ StackChan │
│ (まだ未設定) │
└─────────┬────────────┘
│
Wi-Fi(WebSocket)
│
┌─────────▼────────────┐
│ xiaozhi-server │ ← 起動済み ✅
│----------------------│
│ OllamaLLM │
│ gemma4:12b │
└─────────┬────────────┘
│
Ollama API
│
┌─────────▼────────────┐
│ Gemma4:12b │
└──────────────────────┘どんどんいこう!

docker compose upで起動します
次にもう一つ別のターミナルを開いて状態確認を行います。
docker psxiaozhi-esp32-server が Up または running ならOK
HTTPサーバーへアクセス。
curl -i http://localhost:8003/xiaozhi/ota/LAN側のアドレスでも確認
curl -i http://MacのIP:8003/xiaozhi/ota/Ollamaへの接続経路を確認する
コンテナ内からMacのOllamaを参照できるか確認します。
docker exec xiaozhi-esp32-server \
python -c "import requests; print(requests.get('http://host.docker.internal:11434/api/tags').text)"gemma4:12bが結果に含まれていればOK
satoshi@Satoshi-MacBook-Pro ~ % docker exec xiaozhi-esp32-server \
python -c "import requests; print(requests.get('http://host.docker.internal:11434/api/tags').text)"
{"models":[{"name":"gemma4:latest","model":"gemma4:latest","modified_at":"2026-06-27T18:50:27.578652437+09:00","size":9608350718,"digest":"c6eb396dbd5992bbe3f5cdb947e8bbc0ee413d7c17e2beaae69f5d569cf982eb","details":{"parent_model":"","format":"gguf","family":"gemma4","families":["gemma4"],"parameter_size":"8.0B","quantization_level":"Q4_K_M"},"capabilities":["completion","tools","thinking"]},{"name":"gemma4:12b","model":"gemma4:12b","modified_at":"2026-06-06T18:25:15.3379332+09:00","size":7556508396,"digest":"4eb23ef187e2c5462566d6a1d3bbbc2f1346d0b4327cbb66d58fffbcc9b2b05c","details":{"parent_model":"","format":"gguf","family":"gemma4","families":["gemma4"],"parameter_size":"11.9B","quantization_level":"Q4_K_M","context_length":262144,"embedding_length":3840},"capabilities":["completion","tools","thinking","vision"]}]}
satoshi@Satoshi-MacBook-Pro ~ %
OTA APIが HTTP 200 で応答
StackChanへ返すWebSocket先が ws://192.168.0.202:8000/xiaozhi/v1/ になっている
DockerコンテナからMac上のOllamaへ接続でき、gemma4:12b を認識できている
問題なさそう!これで、
xiaozhi-server
↓
host.docker.internal:11434
↓
Mac上のOllama
↓
Gemma4 12Bという経路が正しく確立したことが確認できました。
YAMLファイルにベタ書きしたMacのIPがコロコロ変わるのがよくないですねぇ。Wi-Fiルーターで自動になってるからしょうがない。
この辺はまた別途検討しよう。ホスト名でなんとかなるのかしら。
ここからはStackChan本体側です。
1. StackChanを開封して純正状態を確認
まずは改造せずに、
電源ON
Wi-Fi接続
AI.AGENT画面の起動
ファームウェアバージョン確認
ボタン、スピーカー、画面の動作確認
を行います。

デフォルトの状態での動作確認はOK
めちゃくちゃ可愛いですねぇ。
ファームウエアはVersion 1.4.3
です。現時点で最新かな。
もうちょいでスタックチャンまでたどり着くねー
進捗
#0 企画 ✅
#1 環境構築 ✅
#2 StackChan接続 ⬜ 👈次はココ!
#3 初めての会話 ⬜
#4 Skill ⬜
#5 Vision ⬜
#6 MCP ⬜
#7 Home Assistant⬜
#8 YOLO/OCR ⬜
#9 完成検査 ⬜
【参考にしていただけましたら、よかったらフォローと、スキ❤️を、そしてX(Twitter)でシェアと感想を頂けると幸いです】
いいなと思ったら応援しよう!
お読みいただきありがとうございました。もし参考になったり面白かったと思っていただけましたらサポートよろしくお願いします。次の執筆のモチベになります。