AI 機能の役割分担:デバイスが担う部分とサーバーが担う部分
小智ファームウェアは音声対話の入口であり、大規模モデルの実行環境ではありません。デバイスはウェイクアップ、音声処理、符号化と復号、表示、ツールの実行を担当し、音声認識(ASR)、LLM 対話、音声合成(TTS)はサーバーが行います。このページでは、ファームウェア v2.5.2 のソースコードと上流ドキュメントに基づいて、その役割分担、各スイッチの場所、よくある誤解を整理します。
1 回の対話の流れ
flowchart LR
A[ウェイクワードまたはボタン] --> B[デバイス:音声の取得と処理]
B --> C[Opus 符号化・アップリンク]
C --> D[サーバー:ASR、LLM、TTS<br>または Realtime エンドツーエンドモデル]
D --> E[Opus ダウンリンク]
E --> F[デバイス:復号して再生]
D -. stt / llm / tts メッセージ .-> G[デバイス:文字と表情を表示]
D -. MCP 呼び出し .-> H[デバイス:ツールを実行]
- アップリンク:デバイスはマイクのモノラル 16 kHz 音声を Opus(フレーム長 60 ms)に符号化してサーバーへ送ります。
- ダウンリンク:サーバーは Opus 音声を送ります。プロトコル文書の例では、ダウンリンクのサンプリングレートは 24000 Hz です。
- JSON メッセージ:
sttは認識テキスト、llmは表情(emotion)、ttsは音声合成の開始、各文のテキスト、終了を表します。フィールドは WebSocket通信プロトコル を参照してください。 - 対話方式:従来のストリーミング ASR + LLM + TTS と、Realtime エンドツーエンド音声モデルの両方に対応しており、どちらもサーバー側で実装されます。
デバイスが担う処理
| 段階 | デバイスの処理 | 条件とスイッチ |
|---|---|---|
| ウェイクワード | ESP-SR によるオフライン検出:WakeNet、カスタムウェイクワードには MultiNet。ESP32-S3 のデフォルト設定は「你好小智」モデルを使用 | Kconfig の WAKE_WORD_TYPE。カスタムウェイクワードには PSRAM 付きの ESP32-S3 / P4 / S31 が必要。ピンインをスペース区切りで指定し、しきい値は 1~99(小さいほど敏感、デフォルト 20) |
| エコーキャンセルと VAD | ESP32-S3 / P4 / S31 は AFE を使い、音声処理が有効なときは AEC と VAD が入ります。ESP32 / C3 / C5 / C6 は AEC・VAD なしでモノラル PCM をそのまま出力 | USE_AUDIO_PROCESSOR はデフォルトでオン。デバイス側 AEC の USE_DEVICE_AEC はデフォルトでオフで、Kconfig に挙げられたボードのみ選択可能。サーバー側 AEC は Kconfig で不安定と注記 |
| 符号化と伝送 | Opus の符号化と復号。WebSocket または MQTT + UDP | どちらを使うかはサーバーが OTA 応答で指定します。初回起動 を参照 |
| リスニングモード | 自動停止、手動停止、Realtime。Realtime には AEC が必要 | listen メッセージの mode は auto、manual、realtime |
| ウェイクワード音声のアップロード | ウェイクアップ後、直近約 2 秒の音声を対話の最初のデータとしてサーバーへ送信 | SEND_WAKE_WORD_DATA はデフォルトでオン。AFE ウェイクワードとカスタムウェイクワードでのみ利用可能 |
| 表示と表情 | llm メッセージの emotion に従って表情を切り替え | Emoji感情表示 を参照 |
チップごとに選べるウェイクワードの種類、オーディオエンジン、PSRAM の要件は チップ対応とストレージ仕様 に、拡張の入口は 拡張ポイント にあります。
デバイス制御とカメラ
デバイス側 MCP は、LLM がデバイス上のツール(音量、ライト、モーター、GPIO など)を呼び出せるようにします。クラウド側 MCP は LLM 自体の能力を拡張します。プロトコルと使い方は MCP ドキュメント を参照してください。
カメラ付きのボードはツール self.camera.take_photo を登録します。パラメータは question です。LLM が呼び出しを決めると、デバイスは撮影して JPEG に符号化し、multipart/form-data(フィールド question と file)でサーバーが指定したアドレスへ POST し、返ってきたテキストをツールの結果として返します。このアドレスとトークンは、サーバーが MCP initialize の capabilities.vision で渡します(MCPプロトコル を参照)。渡されていない場合、ツールは「Image explain URL or token is not set」を返します。画像の理解はサーバー側で行われます。
声紋認識
上流の README は、3D Speaker に基づく声紋認識を実装済み機能として挙げています。v2.5.2 のファームウェアのソースコードには声紋に関するコードはなく、README などのドキュメントで触れられているだけです。利用できるかどうかは、接続するサーバーの説明に従ってください。
インターフェース言語
menuconfig の Default Language には 40 の選択肢があり、main/assets/locales にも 40 の言語ディレクトリがあります。上流 README の文面は 38 種類です。言語ディレクトリ(例:en-US)には、数字、ようこそ、アクティベーション、Wi-Fi 設定、アップグレード、PIN と登録エラーなどの案内の OGG 音声と language.json が入っています。音声案内はローカライズされたリソースを優先し、なければ英語にフォールバックします。ウェイクワード、フォント、表情、チャット背景は、上流の Assets ジェネレーター でオンラインでカスタマイズできます。カスタム Assets ガイド を参照してください。
よくある誤解
- 「デバイスがローカルで大規模モデルや TensorFlow Lite を動かす」:v2.5.2 のリポジトリに TensorFlow Lite 関連のファイルはなく、ファームウェアのソースと依存関係リストにも ESP-DL はありません。デバイス上のモデルは ESP-SR のウェイクワードと AFE の音声処理だけで、対話はサーバーが担当します。
- 「ファームウェアに特定の LLM や音声サービスへの接続が組み込まれている」:ファームウェアが実装しているのは、サーバーと通信するためのプロトコル(WebSocket、MQTT + UDP)だけです。どのモデルを使うかはサーバーの設定次第です。公式サーバーと自前サーバーの違いは 自前サーバー を参照してください。
- 「認識率、遅延、消費電力に標準の数値がある」:上流はデバイス単位の認識率、遅延、消費電力の数値を公開していません。これらは接続するサーバー、ネットワーク、ボードによって変わります。当サイトは上流の根拠がない数値を掲載しません。
続けて読む
- 機能使用チュートリアル:ファームウェアが実装している機能の一覧;
- 自前サーバー:認識、対話、合成を自分のサーバーで動かす;
- WebSocket通信プロトコル と MQTT + UDP プロトコル:デバイスとサーバー間のメッセージ;
- チップ対応とストレージ仕様:チップごとのオーディオエンジンとウェイクワードの選択肢。
出典:78/xiaozhi-esp32 v2.5.2 の main/audio/README.md、main/Kconfig.projbuild、main/mcp_server.cc、main/boards/common/esp32_camera.cc、sdkconfig.defaults.esp32s3、README_ja.md。