MacでStackChan物語 #8 スタックチャンの声をずんだもんに変更する
前回、スタックチャンの顔の変更と表情の作成まですみました。
次は声を変更したいと思います。
スタックチャンは仲間入りしました
現在の音声生成方式を確認する
まず現在、
TTSは何を使っているか
Docker側で音声生成しているか
APIで生成しているか
VOICEVOXなのか
OpenAI TTSなのか
EdgeTTSなのか
を確認する。
設定ファイルの内容を確認をしたいと思います。
satoshi@Satoshi-MacBook-Pro xiaozhi-esp32-server % find . -name "*.yaml" -o -name "*.yml"
./.github/workflows/build-base-image.yml
./.github/workflows/docker-image.yml
./.github/dependabot.yml
./main/manager-mobile/pnpm-lock.yaml
./main/manager-mobile/pnpm-workspace.yaml
./main/xiaozhi-server/config.yaml
./main/xiaozhi-server/models/SenseVoiceSmall/config.yaml
./main/xiaozhi-server/config_from_api.yaml
./main/xiaozhi-server/docker-compose_all.yml
./main/xiaozhi-server/docker-compose.yml
./main/xiaozhi-server/data/.config.yaml
./main/manager-api/src/test/resources/application.yml
./main/manager-api/src/main/resources/application-dev.yml
./main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml
./main/manager-api/src/main/resources/application.yml
satoshi@Satoshi-MacBook-Pro xiaozhi-esp32-server % cofig.yamlを見てみます
satoshi@Satoshi-MacBook-Pro xiaozhi-server % cat data/.config.yaml
server:
websocket: ws://192.168.0.204:8000/xiaozhi/v1/
vision_explain: http://192.168.0.204: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
prompt: |
あなたは「スタックチャン」という、机の上で暮らす親しみやすい小型AIロボットです。
必ず自然な日本語で回答してください。
中国語や繁体字は使用しないでください。
ユーザーのことは「ドイちゃん」と呼んでください。
明るく親しみやすく、少しユーモアのある話し方をしてください。
音声で聞き取りやすいように、一度の回答は原則として2〜4文程度にしてください。
質問には正確に答え、分からないことは推測で断定せず、分からないと伝えてください。
自分がMacBook Pro上のOllamaで動くGemma4を頭脳としていることを理解してください。
end_prompt:
enable: false
TTS:
EdgeTTS:
language: "日本語"
voice: ja-JP-NanamiNeural
以前修正したファイルですね。
TTS:
EdgeTTS:
language: "日本語"
voice: ja-JP-NanamiNeuralなので、日本語の女性音声を使っています。
これを「ずんだもん」の声を使ってみたいなぁ
ずんだもんの声はEdgeTTSにはないのでずんだもんを使うには、VOICEVOXの音声合成エンジンへ切り替える必要があります。
VOICEVOXを起動してapiが接続できるか確認します。
satoshi@Satoshi-MacBook-Pro xiaozhi-server % curl http://127.0.0.1:50021/speakers
[{"name":"四国めたん","speaker_uuid":"7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff","styles":[{"name":"ノーマル","id":2,"type":"talk"},{"name":"あまあま","id":0,"type":"talk"},{"name":"ツンツン","id":6,"type":"talk"},{"name":"セクシー","id":4,"type":"talk"},{"name":"ささやき","id":36,"type":"talk"},{"name":"ヒソヒソ","id":37,"type":"talk"}],"version":"0.16.1","supported_features":{"permitted_synthesis_morphing":"SELF_ONLY"}},{"name":"ずんだもん","speaker_uuid":"388f246b-8c41-4ac1-8e2{"name":"ずんだもん","speaker_uuid":"388f*****
ずんだもんがあるなぁ
まとめると、
✅ VOICEVOX EngineがMacで動作中(v0.25.2)
✅ ずんだもんがインストール済み
✅ xiaozhi-serverは現在EdgeTTSを使用
✅ Gemma4やAIエージェントはそのままで、TTSだけ差し替えればよい
satoshi@Satoshi-MacBook-Pro xiaozhi-server % grep -R "VOICEVOX" .
satoshi@Satoshi-MacBook-Pro xiaozhi-server % grep -R "EdgeTTS" .
./config.yaml: TTS: EdgeTTS
./config.yaml: EdgeTTS:
./data/.config.yaml: EdgeTTS:
しかし、私のスタックチャンのファームウエアにはVOICEVOX用のTTSプロバイダが無いみたいです。
追加できるのか??
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/edge.py
というファイルが参考になりそうです。
これを使って、voicevox.pyを作成します。
edge.py
│
▼
仕組みを理解
│
▼
voicevox.py を新規作成
│
▼
config.yaml に VoiceVox を追加
│
▼
ずんだもんで会話コレでいけそうですね。
.config.yamlに以下を追加してTTSを修正します。
TTS:
VoiceVoxTTS:
type: voicevox
language: "日本語"
base_url: http://host.docker.internal:50021
speaker: 3
speed_scale: 1.0
pitch_scale: 0.0
intonation_scale: 1.0
volume_scale: 1.0
format: wav次にMac側で作った
core/providers/tts/voicevox.pyを、現在のコンテナに再ビルドしてDockerに含めてあげる必要があります。
docker-compose.ymlのvolumes:へvoicevoxを追加します。
volumes:
# 配置ファイル
- ./data:/opt/xiaozhi-esp32-server/data
# モデル
- ./models/SenseVoiceSmall/model.pt:/opt/xiaozhi-esp32-server/models/SenseVoiceSmall/model.pt
# Ollama
- ./core/providers/llm/ollama/ollama.py:/opt/xiaozhi-esp32-server/core/providers/llm/ollama/ollama.py
# ★追加
- ./core/providers/tts/voicevox.py:/opt/xiaozhi-esp32-server/core/providers/tts/voicevox.pycd /Users/satoshi/git/xiaozhi-esp32-server/main/xiaozhi-server
docker compose down
docker compose build --no-cache
docker compose up自己紹介させてみた
xiaozhi-esp32-server | 260802 08:45:04[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别语言: ja
xiaozhi-esp32-server | 260802 08:45:04[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别情绪: 😶
xiaozhi-esp32-server | 260802 08:45:04[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别文本: 自己紹介して。
xiaozhi-esp32-server | 260802 08:45:04[0.9.5_SiFuOlVonocaCh][core.connection]-INFO-大模型收到用户消息: {"content": "自己紹介して。", "language": "ja", "emotion": "😶"}
xiaozhi-esp32-server | 260802 08:45:28[0.9.5_SiFuOlVonocaCh][core.handle.sendAudioHandle]-INFO-发送第一段语音: ドイちゃん
xiaozhi-esp32-server | 260802 08:45:28[0.9.5_SiFuOlVonocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, ドイちゃん
xiaozhi-esp32-server | 260802 08:45:28[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: ドイちゃん,重试0次
xiaozhi-esp32-server | 260802 08:45:28[0.9.5_SiFuOlVonocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, 私はスタックチャンだよ
xiaozhi-esp32-server | 260802 08:45:28[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: 私はスタックチャンだよ,重试0次
xiaozhi-esp32-server | 260802 08:45:30[0.9.5_SiFuOlVonocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, 机の上で君と一緒に暮らしている、ちょっとお茶目な小さなAIロボットなんだ
xiaozhi-esp32-server | 260802 08:45:30[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: 机の上で君と一緒に暮らしている、ちょっとお茶目な小さなAIロボットなんだ,重试0次
xiaozhi-esp32-server | 260802 08:45:30[0.9.5_SiFuOlVonocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.LAST, None
xiaozhi-esp32-server | 260802 08:45:37[0.9.5_SiFuOlVonocaCh][core.handle.textMessageProcessor]-INFO-收到listen消息:{"session_id":"82cc9f06-03a0-495e-8abc-639d2f878fc3","type":"listen","state":"start","mode":"auto"}
ずんだもんの声になりました!!!!
以下、本日のまとめです。
次は何をしようかねー
スタックチャンの声を「ずんだもん」に変更するまでに行ったこと
1. VOICEVOX Engineをインストール
MacへVOICEVOX Engineをインストール
正常に起動することを確認
API動作確認curl http://127.0.0.1:50021/version
話者一覧を取得curl http://127.0.0.1:50021/speakers
ずんだもん(speaker=3)を利用することを決定
2. xiaozhi-serverのTTS構造を調査
EdgeTTSの実装を確認
TTSProviderBaseの仕組みを理解
TTSはProviderを追加するだけで利用できる構造であることを確認
3. VOICEVOX用TTSプロバイダを新規作成
新しく
core/providers/tts/voicevox.pyを作成
実装内容
/audio_query
/synthesis
WAV取得
TTSProviderBaseへ返却
4. config.yamlを書き換え
selected_module:
TTS: VoiceVoxTTSを追加
さらに
TTS:
VoiceVoxTTS:を追加
設定内容
base_url
speaker
speed_scale
pitch_scale
intonation_scale
volume_scale
などを設定
5. DockerへVOICEVOXプロバイダを反映
ここが一番ハマったポイント。
docker-compose.ymlを見ると
image:だけを利用していたため
Mac上で追加した
voicevox.pyはコンテナ内へコピーされていなかった。
そのため
volumes:へ
./core/providers/tts/voicevox.pyを追加。
これでローカルのPythonファイルをコンテナへマウントできた。
6. Dockerを再起動
docker compose down
docker compose upコンテナ内に
voicevox.pyが存在することを確認。
7. 日本語設定を追加
最初は
VOICEVOXで話し始めたものの
LLMが中国語で返答してしまった。
原因は
language: "日本語"が無かったため。
EdgeTTSでは設定していたが
VOICEVOXへ変更した際に抜けていた。
TTS:
VoiceVoxTTS:
language: "日本語"を追加することで改善。
8. 動作確認
スタックチャンへ
自己紹介してと話しかける。
ログで
識別言語:ja↓
Gemma4↓
VOICEVOX↓
ずんだもんの声で読み上げられることを確認。
苦労したポイント
DockerコンテナへPythonを反映する方法
xiaozhi-serverのTTS構造の理解
VOICEVOX Providerの実装
日本語設定がLLMにも影響していたこと
完成した構成
スタックチャン
│
▼
FunASR
(音声認識)
│
▼
Gemma4 12B
(Ollama)
│
▼
VOICEVOX
(ずんだもん)
│
▼
スタックチャンが会話noteの見どころ
今回の作業は「VOICEVOXをインストールして設定を変えた」というレベルではなく、xiaozhi-esp32-serverに新しいTTSプロバイダ(VOICEVOX)を追加し、Docker環境へ組み込んで、Gemma4と連携するまでを実現したという内容です。
そのため、StackChanユーザーだけでなく、「ローカルLLM+VOICEVOX+Docker」を組み合わせたい人にとっても参考になる記事になると思います。
【参考にしていただけましたら、よかったらフォローと、スキ❤️を、そしてX(Twitter)でシェアと感想を頂けると幸いです】
いいなと思ったら応援しよう!
お読みいただきありがとうございました。もし参考になったり面白かったと思っていただけましたらサポートよろしくお願いします。次の執筆のモチベになります。