LLMの知性をハードに注入!MCPベースのESP32チャットボットで未来のIoT制御をマスター
特に、その核心にある技術や、組み込みシステムとクラウドAIを連携させる手法は、組み込み開発やIoT、AI連携に関心のあるエンジニアにとって「激安で驚いた商品」を紹介するような感動を提供してくれるでしょう!
「78/xiaozhi-esp32」は、ESP32という安価で多機能なマイコンを使い、MCP (Model Context Protocol)という仕組みを通じて、クラウドのLLM(大規模言語モデル)やTTS(Text-to-Speech、音声合成)サービスと連携させることで、本格的な音声対話型AIアシスタントを実現しています。
| 特徴 | エンジニア視点のメリットと「驚き」 |
| 低コストハードウェア | ESP32(またはESP32-S3など)という数千円程度のマイコンで、音声認識・対話・IoT制御が可能なAIデバイスが作れます。高価なシングルボードコンピュータが不要なのが「激安!」ポイント。 |
| MCP (Model Context Protocol) | LLM(大規模言語モデル)の推論結果を、ハードウェア制御に簡単に結びつけるための通信規約。これにより、LLMが生成した「エアコンを消して」という指示を、マイコンが理解できる制御コマンド(JSONなど)に変換し、実行できます。AIとIoTの連携が劇的に簡単になります。 |
| LLMオフロード | LLMの重い処理(推論)はクラウドで行い、ESP32は音声の入出力とネットワーク通信、そしてMCPによる制御に特化します。これにより、リソースの限られたマイコンでも最新のAI能力をフル活用できます。 |
| 豊富な機能 | 音声ウェイクアップ、ASR(自動音声認識)、TTS(音声合成)のストリーミング対話、マルチプロトコル(WebSocket/MQTT/UDP)対応、IoTデバイス制御など、商用製品に匹敵する機能が詰まっています。 |
| オープンソース | MITライセンスで公開されており、自由に利用・改変・商用利用が可能です。C++/ESP-IDFで書かれているため、組み込みエンジニアは細部まで学習・カスタマイズできます。 |
このプロジェクトを始めるには、主にESP32マイコンボードと、開発環境の準備が必要です。
ESP32-S3開発ボード
特に、RAMが8MB以上搭載されたモデル(例
M5Stack CoreS3、M5Stack Atom S3R + Echo Baseなど)。音声入出力が必要なため、マイクとスピーカー機能があるか、外付けできるものが推奨されます。
USBケーブル
PCとボードを接続するため。
このプロジェクトはEspressif社の開発フレームワークであるESP-IDFをベースにしています。
開発環境
VSCodeとESP-IDF Extensionの組み合わせが最も推奨されます。
ESP-IDFのインストール
VSCodeの拡張機能を使って、ESP-IDF v5.4以降のSDKをインストールします。
プロジェクトのクローン
GitHubからソースコードをダウンロードします。
git clone https://github.com/78/xiaozhi-esp32.git
cd xiaozhi-esp32
設定の構成
ESP-IDFのツールを使って、ボードの種類、Wi-Fi情報、LLM/TTSサービスのAPIキーなどの設定を行います。
idf.py menuconfig
ここで、クラウド側のサービス(LLMやTTS)へのアクセスに必要なAPIキーやエンドポイントURLを設定します。
ビルドと書き込み
設定が完了したら、ファームウェアをビルドし、ESP32ボードに書き込みます。
idf.py -p /dev/ttyUSB0 flash monitor
# /dev/ttyUSB0 の部分は環境に合わせて変更してください
「78/xiaozhi-esp32」プロジェクトでは、ESP32側でMCPプロトコルに基づいたサービスディスパッチ(処理振り分け)を実装します。
ユーザーが「電気を消して」と話すと、以下のステップがクラウドとESP32間で実行されます。
音声入力 → ASR(クラウド) → テキスト
テキスト → LLM(クラウド) → MCPコマンド(JSON形式)
MCPコマンド → ESP32へ送信 (WebSocket/MQTTなど)
ESP32 → MCPコマンドを解析 → 実際のGPIO制御を実行
LLMは対話の文脈を理解し、ハードウェアを制御するための以下のようなJSON形式のメッセージを生成します。
{
"type": "control_device",
"data": {
"device": "light",
"action": "turn_off",
"param": {}
}
}
ESP32のファームウェアは、受信したJSONを解析し、actionやdeviceに基づいて適切なハードウェア関数を呼び出します。
// 簡略化された擬似コード
void handle_mcp_command(const char* json_payload) {
// 1. JSONを解析
JsonDocument doc;
deserializeJson(doc, json_payload);
const char* type = doc["type"];
const char* device = doc["data"]["device"];
const char* action = doc["data"]["action"];
if (strcmp(type, "control_device") == 0) {
if (strcmp(device, "light") == 0) {
if (strcmp(action, "turn_off") == 0) {
// 2. 実際のハードウェア制御関数を呼び出す
control_gpio_for_light(0); // 電気のGPIOをLOWに設定
send_response_to_cloud("ライトを消しました");
} else if (strcmp(action, "turn_on") == 0) {
control_gpio_for_light(1); // 電気のGPIOをHIGHに設定
send_response_to_cloud("ライトをつけました");
}
}
// 他のデバイス(エアコン、扇風機など)の制御ロジックを追加...
}
}