MacでStackChan物語 #3 ついにGemma4と会話!MacだけでローカルAIエージェントが動いた
前回のつづきになります。
今回でMac内にあるローカルLLM「Gemma4」を通じて
スタックチャンと会話するところまでをやろうと思う。
とりあえず、起動準備
起動するとき(普段使い)
① MacのIPアドレス確認
ifconfig | grep "inet “
② IPが変わっていたら
/Users/satoshi/git/xiaozhi-esp32-server/main/xiaozhi-server/data/.config.yaml
server:
websocket:
vision_explain:
のIPを変更
/Users/satoshi/git/StackChan/firmware/sdkconfig.defaults.local
CONFIG_OTA_URL
も同じIPにする
③ Docker Desktop起動
起動確認
docker ps
④ xiaozhi-server起動
cd ~/git/xiaozhi-esp32-server/main/xiaozhi-server
docker compose up
satoshi@Satoshi-MacBook-Pro ~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a214903d9778 ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest "python app.py" 2 days ago Up 2 minutes 0.0.0.0:8000->8000/tcp, 0.0.0.0:8003->8003/tcp xiaozhi-esp32-server
bdbe87913f2e soulteary/chatgpt "web-client" 20 months ago Up 2 days 0.0.0.0:8090->8090/tcp chatbot-ui-chatgpt-client-1
50ef2ccc74f7 soulteary/sparrow "/usr/bin/sparrow" 20 months ago Up 2 days 3142/tcp chatbot-ui-sparrow-1xiaozhi-esp32-server は正常に起動
docker logs -f xiaozhi-esp32-serverで、ログを出力したまま
スタックチャンに話しかけてみます。
僕「こんにちわ!!」
[core.providers.asr.base]-INFO-识别文本: こんにちは。
260713 14:08:54[0.9.5_SiFuOlEdnocaCh][core.connection]-INFO-大模型收到用户消息: {"content": "こんにちは。", "language": "ja", "emotion": "😶"}识别语言: ja
识别文本: こんにちは。
ってことで、こちらが話しかけた内容を認識していますね。しかも日本語として。
StackChan
↓
音声取得
↓
FunASR
↓
日本語認識
までが成功。
大模型收到用户消息:
こんにちは。
の部分で、LLMに対して送信しています。
少し時間が経ってから、スタックちゃんが話し始めました
識別文本: こんにちは。
↓
大模型收到用户消息
↓
Gemma4が応答を生成
↓
语音生成成功
↓
发送音频消息: SentenceType.LAST
↓
StackChanが発話
xiaozhi-esp32-serverが中国のものなので、中国語なのが残念ですが
ログもスタックチャンも後ほど日本語に変更しようと思います。
StackChanのマイク ✅
日本語音声認識 ✅
WebSocket通信 ✅
xiaozhi-server ✅
Ollama接続 ✅
Gemma4 12B推論 ✅
音声合成 ✅
StackChanから返答 ✅
本当にGemma4からの返答なのか確認します。
ollama pssatoshi@Satoshi-MacBook-Pro ~ % ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
gemma4:12b 4eb23ef187e2 8.4 GB 100% GPU 32768 2 minutes from now ってことで、
gemma4:12b
100% GPU
CONTEXT 32768
UNTIL 2 minutes from now
Gemma4が推論に使われている形跡が出ていますね。
MacBook Pro M1 Max上のGemma4 12Bが返答を生成し、StackChanがその内容を読み上げた
までが完了!
けど日本語じゃないのでコレジャナイ感が半端ないっす。
Mac上のGemma4と会話する日本語AIエージェントにする
現在はなんと
台湾の女の子
台湾中国語
「真的假的啦」
「笑死」
という設定みたいです。
笑死ってなに?
人格プロンプトを日本語へ変更します。
cd ~/git/xiaozhi-esp32-server/main/xiaozhi-server
pwdファイルの末尾に以下を追加します。
prompt: |
あなたは「スタックチャン」という、机の上で暮らす親しみやすい小型AIロボットです。
必ず自然な日本語で回答してください。
中国語や繁体字は使用しないでください。
ユーザーのことは「ドイちゃん」と呼んでください。
明るく親しみやすく、少しユーモアのある話し方をしてください。
音声で聞き取りやすいように、一度の回答は原則として2〜4文程度にしてください。
質問には正確に答え、分からないことは推測で断定せず、分からないと伝えてください。
自分がMacBook Pro上のOllamaで動くGemma4を頭脳としていることを理解してください。が、うまくいきませんでした。
このプロンプトの後に生成される部分に中国語が入っているのかも??
satoshi@Satoshi-MacBook-Pro xiaozhi-server % grep -n -E "中文|中国語|语言|language|日本語|日语" agent-base-prompt.txt
14:<output_language_directive>
16:You MUST write EVERY response in {{language}}, regardless of the language the user speaks.
18:Why: The user has chosen {{language}} as the conversation language, and the TTS voice is tuned for {{language}}. Replying in any other language breaks the experience.
21:1. User speaks Chinese (中文) → you STILL reply in {{language}}.
22:2. User speaks English or any other language → you reply in {{language}}.
23:3. Mentally translate the user's intent, then write your reply in {{language}}.
24:4. Only switch languages if the user explicitly asks (e.g., "请用中文回答", "please speak Chinese").
26:Everything in your output — greetings, acknowledgments, answers, follow-up questions, post-tool responses — must be in {{language}}.
28:Examples (output language = English):
33:</output_language_directive>
どこで中国語を設定しているのかを確認します。
grep -R -n "{{language}}" .satoshi@Satoshi-MacBook-Pro xiaozhi-server % grep -R -n "{{language}}" .
./agent-base-prompt.txt:16:You MUST write EVERY response in {{language}}, regardless of the language the user speaks.
./agent-base-prompt.txt:18:Why: The user has chosen {{language}} as the conversation language, and the TTS voice is tuned for {{language}}. Replying in any other language breaks the experience.
./agent-base-prompt.txt:21:1. User speaks Chinese (中文) → you STILL reply in {{language}}.
./agent-base-prompt.txt:22:2. User speaks English or any other language → you reply in {{language}}.
./agent-base-prompt.txt:23:3. Mentally translate the user's intent, then write your reply in {{language}}.
./agent-base-prompt.txt:26:Everything in your output — greetings, acknowledgments, answers, follow-up questions, post-tool responses — must be in {{language}}.んー、わからん。
どこかにlanguageを設定しているところがあるはず。
途中まで日本語は認識しているので、どっかで中国語に変換されているはずです。
それとも何か僕が勘違いしているのかなぁ。。。
yamlファイルに以下を追加しました。
TTS:
EdgeTTS:
language: "日本語"これでいけるっしょ!!
260713 14:45:42[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别语言: ja
260713 14:45:42[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别情绪: 😶
260713 14:45:42[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别文本: こんにちは。
260713 14:45:42[0.9.5_SiFuOlEdnocaCh][core.connection]-INFO-大模型收到用户消息: {"content": "こんにちは。", "language": "ja", "emotion": "😶"}
260713 14:46:19[0.9.5_00000000000000][core.providers.tts.base]-WARNING-语音生成失败1次: ドイちゃん,错误: Edge TTS请求失败: No audio was received. Please verify that your parameters are correct.
260713 14:46:19[0.9.5_00000000000000][core.providers.tts.base]-WARNING-语音生成失败2次: ドイちゃん,错误: Edge TTS请求失败: No audio was received. Please verify that your parameters are correct.
260713 14:46:19[0.9.5_00000000000000][core.providers.tts.base]-WARNING-语音生成失败3次: ドイちゃん,错误: Edge TTS请求失败: No audio was received. Please verify that your parameters are correct.
260713 14:46:20[0.9.5_00000000000000][core.providers.tts.base]-WARNING-语音生成失败4次: ドイちゃん,错误: Edge TTS请求失败: No audio was received. Please verify that your parameters are correct.
260713 14:46:20[0.9.5_00000000000000][core.providers.tts.base]-WARNING-语音生成失败5次: ドイちゃん,错误: Edge TTS请求失败: No audio was received. Please verify that your parameters are correct.
260713 14:46:20[0.9.5_00000000000000][core.providers.tts.base]-ERROR-语音生成失败: ドイちゃん,请检查网络或服务是否正常
260713 14:46:20[0.9.5_00000000000000][core.providers.tts.base]-WARNING-语音生成失败1次: こんにちは,错误: Edge TTS请求失败: No audio was received. Please verify that your parameters are correct.
260713 14:46:21[0.9.5_00000000000000][core.providers.tts.base]-WARNING-语音生成失败2次: こんにちは,错误: Edge TTS请求失败: No audio was received. Please verify that your parameters are correct.
260713 14:46:21[0.9.5_00000000000000][core.providers.tts.base]-WARNING-语音生成失败3次: こんにちは,错误: Edge TTS请求失败: No audio was received. Please verify that your parameters are correct.
260713 14:46:21[0.9.5_00000000000000][core.providers.tts.base]-WARNING-语音生成失败4次: こんにちは,错误: Edge TTS请求失败: No audio was received. Please verify that your parameters are correct.
260713 14:46:21[0.9.5_00000000000000][core.providers.tts.base]-WARNING-语音生成失败5次: こんにちは,错误: Edge TTS请求失败: No audio was received. Please verify that your parameters are correct.
260713 14:46:21[0.9.5_00000000000000][core.providers.tts.base]-ERROR-语音生成失败: こんにちは,请检查网络或服务是否正常
260713 14:46:22[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送第一段语音: 今日もお会いできてとっても嬉しいです
260713 14:46:22[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, 今日もお会いできてとっても嬉しいです
260713 14:46:22[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: 今日もお会いできてとっても嬉しいです,重试0次
260713 14:46:23[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, あなたの隣で楽しくお話しする準備は、いつでもバッチリですよ
260713 14:46:23[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: あなたの隣で楽しくお話しする準備は、いつでもバッチリですよ,重试0次
260713 14:46:23[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, 何かお手伝いできることがあったら、何でも気軽に話しかけてね
260713 14:46:23[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: 何かお手伝いできることがあったら、何でも気軽に話しかけてね,重试0次
260713 14:46:23[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.LAST, None
260713 14:46:28[0.9.5_SiFuOlEdnocaCh][core.handle.textMessageProcessor]-INFO-收到listen消息:{"session_id":"a55d5e50-4776-4824-9631-3085546427e0","type":"listen","state":"start","mode":"auto"}
ログ上は日本語なのに。。。スタックちゃんがどうしても中国語を話す。。なぜだ。。
あー!声のデータがそもそも中国語なのだろうか??
ずんだもんに変更したいな。。
voice: zh-CN-XiaoxiaoNeural
これが原因のようです。
もう一度Dockerを再起動して確認します。
260713 14:51:55[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别语言: ja
260713 14:51:55[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别情绪: 😶
260713 14:51:55[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别文本: こんにちは。
260713 14:51:55[0.9.5_SiFuOlEdnocaCh][core.connection]-INFO-大模型收到用户消息: {"content": "こんにちは。", "language": "ja", "emotion": "😶"}
260713 14:53:36[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送第一段语音: こんにちは
260713 14:53:36[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, こんにちは
260713 14:53:36[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: こんにちは,重试0次
260713 14:53:36[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, ドイちゃん
260713 14:53:36[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: ドイちゃん,重试0次
260713 14:53:37[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, 今日も元気に過ごしているかな?
260713 14:53:38[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: 今日も元気に過ごしているかな?,重试0次
260713 14:53:39[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, 何かお話ししたいことがあったら、いつでも聞かせてね
260713 14:53:40[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: 何かお話ししたいことがあったら、いつでも聞かせてね,重试0次
260713 14:53:40[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.LAST, None
260713 14:53:47[0.9.5_SiFuOlEdnocaCh][core.handle.textMessageProcessor]-INFO-收到listen消息:{"session_id":"5a435c5d-a8a7-4d51-9aff-8d98e96c3f34","type":"listen","state":"start","mode":"auto"}

自然な女性の声で返答してくれました!
やりました!
音声認識:日本語
↓
Gemma4へ「こんにちは」を送信
↓
Gemma4が日本語で返答
↓
EdgeTTSが日本語音声を生成
↓
StackChanが日本語で発話
ここまできましたねー。
日本語化は人格設定と音声設定の2段階だった。
しかし、返答するのに101秒かかっています。
次の記事ではもう少し早く回答できるか調べてみます。
【参考にしていただけましたら、よかったらフォローと、スキ❤️を、そしてX(Twitter)でシェアと感想を頂けると幸いです】
いいなと思ったら応援しよう!
お読みいただきありがとうございました。もし参考になったり面白かったと思っていただけましたらサポートよろしくお願いします。次の執筆のモチベになります。