第 10 章:AI 視覺理解
本章目標:讓 NanoCam 拍照並交給多模態大模型分析,「說出」它看到的畫面。
關於本章
AI 視覺理解是 **ESP-Claw(模式 7)**的獨有功能,不在 XiaoZhi AI(模式 6)中使用。
本章使用的
self.camera.take_photo和self.camera.inspect_image工具,視覺分析 API 地址由伺服器端在 MCP 握手階段透過capabilities.vision欄位自動下發。固件端不需要手動配置 API URL —— 這意味著 API 配置在 xiaozhi.me 控制台或自建伺服器端完成,詳情參考第 11 章:ESP-Claw 語音控制。
原理
視覺分析的完整流程:
用戶語音 "看看桌上有什麼"
→ ASR 語音識別
→ LLM 決策:需要拍照分析 → 調用 self.camera.take_photo 或 self.camera.inspect_image
→ 固件:esp_camera_fb_get() 抓幀 (VGA RGB565)
→ JPEG 壓縮
→ 透過 Explain() 發送到伺服器端下發的 Vision API
→ 多模態 LLM 返回文字描述
→ TTS 語音播報兩個拍照工具的區別
| 工具 | 用途 | 誰發 Vision API |
|---|---|---|
self.camera.take_photo | 拍照後用 LLM 內置 vision 能力描述 | 伺服器端 |
self.camera.inspect_image (NanoCam 專用) | 拍照後調用 camera->Explain() → HTTP POST 到獨立多模態 API | 固件端 |
兩者的區別:take_photo 走 XiaoZhi 伺服器端的 LLM 視覺(通用實現),inspect_image 是本項目的專用實現,固件直接調用獨立的多模態 API(地址由伺服器端下發)。
步驟
10.1 確保 ESP-Claw 模式
ai_mode:7設備重啟後進入 ESP-Claw 模式。
完整指令見串口協議手冊。
10.2 拍照+AI 分析
喚醒後直接說出問題:
💬 "看看這裏有什麼"
💬 "我面前有杯子嗎"
💬 "這本書是什麼顏色的"
💬 "桌上放了幾個蘋果"
💬 "幫我看看這張紙上面寫了什麼字"NanoCam 會拍照、上傳、分析,然後語音回答結果。
10.3 場景識別示例
| 語音輸入 | AI 返回示例 |
|---|---|
| 「這是什麼」 | 「這是一台黑色的筆記本電腦,旁邊有一個白色的咖啡杯」 |
| 「有蘋果嗎」 | 「沒有看到蘋果。桌上有兩本書和一支筆」 |
| 「什麼顏色」 | 「你指著的是一個紅色的馬克杯」 |
| 「幾個杯子」 | 「畫面上有 2 個杯子」 |
程式碼
核心拍照+分析回調
nanocam_espclaw/main/boards/nanocam/nanocam_board.cc — MCP 工具註冊:
mcp.AddTool("self.camera.inspect_image",
"Take a photo with the camera and send it to the vision AI for analysis.",
PropertyList({ Property("prompt", kPropertyTypeString) }),
[this](const PropertyList &props) -> ReturnValue {
auto camera = GetCamera();
if (!camera->Capture()) {
return std::string("{\"error\":\"Camera capture failed\"}");
}
std::string prompt = props["prompt"].value<std::string>();
return camera->Explain(prompt);
});nanocam_espclaw/main/boards/common/esp32_camera.cc — Explain() 實現:
std::string Esp32Camera::Explain(const std::string &question) {
// explain_url_ 由伺服器端在 MCP 握手時透過 capabilities.vision.url 下發
// 抓幀 → JPEG 壓縮 → HTTP POST 到多模態 API
// 返回 LLM 分析結果
}伺服器端 MCP 握手(Vision API 下發)
{
"capabilities": {
"vision": {
"url": "https://api.openai.com/v1/chat/completions",
"token": "sk-..."
}
}
}固件收到後調用 camera->SetExplainUrl(url, token) 保存 API 地址,後續 inspect_image 調用時直接使用。
支援的多模態模型
透過伺服器端下發不同的 vision.url,可以使用任何 OpenAI 兼容 API:
| 模型 | API 地址示例 | 適用場景 |
|---|---|---|
gpt-4o | https://api.openai.com/v1/chat/completions | 最強綜合能力 |
gpt-4o-mini | https://api.openai.com/v1/chat/completions | 性價比高 |
qwen-vl-max | https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions | 中文理解更優 |
llava:13b (Ollama) | http://localhost:11434/v1/chat/completions | 完全離線 |
claude-fable-5 | 需配置代理 | 詳細場景描述 |
效果
「看看這裏有什麼」→ 拍照上傳 → AI 分析 → 語音播報 "I see a red cup on a wooden table" —— 真正的 AI 眼睛。

