AI 機能の役割分担:デバイスが担う部分とサーバーが担う部分

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)
エコーキャンセルと VADESP32-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)だけです。どのモデルを使うかはサーバーの設定次第です。公式サーバーと自前サーバーの違いは 自前サーバー を参照してください。
  • 「認識率、遅延、消費電力に標準の数値がある」:上流はデバイス単位の認識率、遅延、消費電力の数値を公開していません。これらは接続するサーバー、ネットワーク、ボードによって変わります。当サイトは上流の根拠がない数値を掲載しません。

続けて読む

出典: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。