🧪 新教程持續更新中 · 由機械臂到傳感器,跟隨教程從零搭建
跳到主要內容

第 10 章:AI 視覺理解

淘寶店鋪

本章目標:讓 NanoCam 拍照並交給多模態大模型分析,「說出」它看到的畫面。

關於本章

AI 視覺理解是 **ESP-Claw(模式 7)**的獨有功能,不在 XiaoZhi AI(模式 6)中使用。

本章使用的 self.camera.take_photoself.camera.inspect_image 工具,視覺分析 API 地址由伺服器端在 MCP 握手階段透過 capabilities.vision 欄位自動下發。固件端不需要手動配置 API URL —— 這意味著 API 配置在 xiaozhi.me 控制台或自建伺服器端完成,詳情參考第 11 章:ESP-Claw 語音控制

原理

視覺分析的完整流程:

Plain
用戶語音 "看看桌上有什麼"
  → 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 模式

Plain
ai_mode:7

設備重啟後進入 ESP-Claw 模式。

完整指令見串口協議手冊

10.2 拍照+AI 分析

喚醒後直接說出問題:

Plain
💬 "看看這裏有什麼"
💬 "我面前有杯子嗎"
💬 "這本書是什麼顏色的"
💬 "桌上放了幾個蘋果"
💬 "幫我看看這張紙上面寫了什麼字"

NanoCam 會拍照、上傳、分析,然後語音回答結果。

10.3 場景識別示例

語音輸入AI 返回示例
「這是什麼」「這是一台黑色的筆記本電腦,旁邊有一個白色的咖啡杯」
「有蘋果嗎」「沒有看到蘋果。桌上有兩本書和一支筆」
「什麼顏色」「你指著的是一個紅色的馬克杯」
「幾個杯子」「畫面上有 2 個杯子」

程式碼

核心拍照+分析回調

nanocam_espclaw/main/boards/nanocam/nanocam_board.cc — MCP 工具註冊:

C++
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() 實現:

C++
std::string Esp32Camera::Explain(const std::string &question) {
    // explain_url_ 由伺服器端在 MCP 握手時透過 capabilities.vision.url 下發
    // 抓幀 → JPEG 壓縮 → HTTP POST 到多模態 API
    // 返回 LLM 分析結果
}

伺服器端 MCP 握手(Vision API 下發)

json
{
  "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-4ohttps://api.openai.com/v1/chat/completions最強綜合能力
gpt-4o-minihttps://api.openai.com/v1/chat/completions性價比高
qwen-vl-maxhttps://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 眼睛。

下一章:第 11 章:ESP-Claw 語音控制