見出し画像

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.py
cd /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)でシェアと感想を頂けると幸いです】


いいなと思ったら応援しよう!

ドイのnote お読みいただきありがとうございました。もし参考になったり面白かったと思っていただけましたらサポートよろしくお願いします。次の執筆のモチベになります。