如何使用小智机器人控制OpenClaw

小智机器人是一个开源的桌面语音聊天入口,很多 AI 玩具都是基于这个项目开发的,而 OpenClaw 又是最近非常流行的本地 AI 全能助手。
我就萌生了一个想法,如果把小智变成 OpenClaw 的一个Channel,那么就能随时随地通过语音来遥控我的 AI 助手了,比起通过飞书等聊天工具,更加具有生活化的用途,比如在玩 LOL 时饿了,喊一句“小智同学,帮我点个外卖”,那比起拿手机–打开美团–选东西–支付,方便了非常多。

一、方案目标

我们的目标很简单:把 ESP32 语音助手“小智”、本地的大模型服务 xiaozhi-server,以及 OpenClaw 这样的“高级 Agent 大脑”无缝串起来,做到:

  • 部署简单:普通用户也能部署到自己的电脑上,然后可以通过自己的小智硬件进行控制(家庭局域网下几乎零配置)。
  • 响应快,任务分层:复杂任务交给 OpenClaw,简单任务由小智的大模型直接处理,不重复调用 OpenClaw 拉长链路。
  • 侵入性较小:对于 OpenClaw,尽量只新增扩展 Channel,不对核心代码做修改;对于小智,仅增加 XiaozhiServer 部分的业务代码,不需要动硬件代码(很多同学对硬件烧录有天然的恐惧😱)。

二、方案介绍

1、整体方案角色:设备、服务器、OpenClaw、浏览器

从整体上看,系统有 4 个角色:

  • 设备(ESP32 / 小智硬件)
    运行语音固件,通过 WebSocket 和 OTA HTTP 接口连接到云端,负责采集语音、播放 TTS 等。

  • 浏览器测试页
    主要是给用户快速体验和测试用的(也等同于一个设备),可以收发消息

  • xiaozhi-server(语音助手服务)
    小智机器人的服务端,负责:

    • 管理设备的 WebSocket 长连接;
    • 直接调用 LLM 处理“简单对话”;
    • 把“复杂任务”转发给 OpenClaw;
    • 接收 OpenClaw 的处理结果,再通过 TTS 推回设备。
  • OpenClaw(智能 Agent 平台)
    通过一个自定义的 xiaozhi 扩展 Channel,与 xiaozhi-server 进行 HTTP 通信:

    • 采用 HTTP 轮询的方案拉取来自小智设备的“待处理任务”;
    • 用自己的一整套多模型、多工具能力处理;
    • 把处理结果通过 HTTP 接口通知回 xiaozhi-server

2、上行链路:用户说话 → 谁来处理?

当用户对小智说话时,信息流大致是这样:

  1. 设备采集语音,通过 WebSocket 发送到 xiaozhi-server

  2. xiaozhi-server 把语音转成文本(或者直接收到文本指令),进入核心的 ConnectionHandler.chat()

  3. chat() 里,会做一件关键的事情:判断这句话是“简单任务”还是“复杂任务”

    • 简单任务(例如查天气、询问生活常识等)
      → 直接调用本地配置好的 LLM,走小智原有流程,生成回复并 TTS 播放出来,让用户最快得到响应

    • 复杂任务(需要长流程、多轮规划、调用多种工具的指令)
      → 不再本地直接调用 LLM,而是转发给 OpenClaw 进行处理。这里目前简单按关键词判断,比如用户的关键词里"文件",就认为是复杂任务,后面可以采用更加合理的方案,比如先用大模型识别一下意图,看看任务的复杂程度。

  4. 转发给 OpenClaw 的方式是:
    通过一个 消息队列模块(可以理解为“待办箱”)调用 push_message(device_id, query),把用户这条消息放入指定设备的队列里,等待 OpenClaw 来拉取。

核心原则是:快速响应,避免无效等待,提高用户体验,当任务复杂时再交给更强大的大脑进行处理。


3、消息队列与持久化:不怕服务重启

OpenClaw 和 xiaozhi-server 之间采用了一种**“长轮询 + 持久化队列”**的通信模式:

  • 每个设备(按 device_id)都有一个独立的队列;
  • 新消息到来时,既会放进内存队列,也会缓存到本地文件。

这样可以避免 xiaozhi-server 宕机时导致 OpenClaw 丢失数据,只要本地文件还在,启动时就可以重新把历史未消费的消息加载回内存队列。


4、OpenClaw 的角色:强大的 AI 大脑

在 OpenClaw 端,我们通过 Channel 的扩展机制,实现了一个 xiaozhi Channel,核心做两件事情:

1. 轮询拉取消息

扩展中的监控逻辑会定期访问 xiaozhi-server 暴露的 GET /xiaozhi/updates 接口,采取长轮询方式拉取新消息。

2. 派发和回传最终结果

拉到的消息会进入 OpenClaw 自身的对话与工具调度系统中,可能会:

  • 调用不同的大模型(本地/云端);
  • 组合多个工具(如搜索、数据库、函数调用等);
  • 执行一系列多轮推理,直到确定“可以给设备一个最终回复”。

当 OpenClaw 完成任务时,会通过 post 通知 xiaozhi


5、下行链路:OpenClaw 回复 → 设备播报

xiaozhi-server 收到来自 OpenClaw 的回复时,会经历以下步骤:

  1. 从请求体中解析出设备 ID 和内容;
  2. 在内存的“在线连接表”中,按设备 ID 查找对应的 WebSocket 连接;
  3. 如果找到了,就调用说话接口(内部封装为 speak_txt 等),把文本转换成语音数据推送到该 WebSocket;
  4. 设备侧接收音频并播放;

从用户视角看:

用户说话 → OpenClaw 想一会儿 → 设备说出结果。


6、部署方便:普通用户可快速跑起来

如果在本地部署(局域网内使用),我们要做到:用户只要配置大模型 Key、配置设备 ID、配置小智机器人的 OTA 地址,就能够跑通整条链路。

三、方案部署教程

此处我介绍一下在本地电脑部署一整套服务的详细教程,最终实现通过一台小智真机设备,可以操作本地 OpenClaw 助手完成复杂任务。

1. 把 xiaozhi-server 跑起来

1、下载我修改过的 xiaozhi-server 项目:

git clone https://gitee.com/littleS/xiao-zhi-server.git

2、安装依赖
创建虚拟环境并激活

conda create -n xiaozhi-esp32-server python=3.10 -y
conda activate xiaozhi-esp32-server

使用国内源

# 添加清华源通道
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge

安装系统必要组件

conda install libopus -y
conda install ffmpeg -y

安装其他 Python 依赖

cd main/xiaozhi-server
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ #不能科学上网的同学,建议使用国内源
pip install -r requirements.txt

运行小智后端服务(xiaozhi-server)

python app.py

看到下面的输出代表成功了:

件: vad成功 SileroVAD
260227 16:27:22[0.9.1_00000000000000][core.providers.asr.fun_local]-INFO-funasr version: 1.2.7.
260227 16:27:22[0.9.1_00000000000000][core.utils.modules_initialize]-INFO-ASR模块初始化完成
260227 16:27:22[0.9.1_00000000000000][core.utils.modules_initialize]-INFO-初始化组件: asr成功 FunASR
260227 16:27:23[0.9.1_00000000000000][__main__]-INFO-OTA接口是          http://10.86.36.43:8003/xiaozhi/ota/
260227 16:27:23[0.9.1_00000000000000][__main__]-INFO-视觉分析接口是     http://10.86.36.43:8003/mcp/vision/explain
260227 16:27:23[0.9.1_00000000000000][__main__]-INFO-Websocket地址是    ws://10.86.36.43:8000/xiaozhi/v1/
260227 16:27:23[0.9.1_00000000000000][__main__]-INFO-=======上面的地址是websocket协议地址,请勿用浏览器访问=======
260227 16:27:23[0.9.1_00000000000000][__main__]-INFO-如想测试websocket请用谷歌浏览器打开test目录下的test_page.html
260227 16:27:23[0.9.1_00000000000000][__main__]-INFO-=============================================================

2. 把 OpenClaw 跑起来

1、下载 OpenClaw 项目,可以直接用我的仓库(已经添加好我新增的 Xiaozhi 插件):

git clone https://gitee.com/littleS/open-claw.git

2、初始化 OpenClaw:
安装 pnpm(如果电脑上没有 npm,请先安装 npm)

npm install -g pnpm

安装依赖

pnpm install
pnpm ui:build # auto-installs UI deps on first run
pnpm build

配置 OpenClaw

pnpm openclaw onboard --install-daemon

这里具体的操作不懂的话,可以参考我的这篇文章:https://www.zhihu.com/question/13059381382/answer/1999906868005458646

PS:一开始只要配置一下模型和 Channel 就行,其他的不用管
在这里插入图片描述

3、配置 Openclaw 的 xiaozhi 插件以及对应的设备 ID

~/.openclaw/openclaw.json 中:

  • 设置 xiaozhiServerUrl

    "xiaozhiServerUrl": "http://localhost:8003"
    
  • 设置一个默认的 deviceId(例如 "2E:5A:6F:AC:48:DC"),这个 ID 会被用于:

    • web 测试页面的设备 MAC会默认从这里读取,这样可以完成 OpenClaw 和 xiaozhi-server 针对这个设备的消息首发;
    • OpenClaw 标记“当前服务的是哪一台设备”。

可以参考我的完整配置 json:

{
  "meta": {
    "lastTouchedVersion": "2026.2.25",
    "lastTouchedAt": "2026-02-27T08:05:47.758Z"
  },
  "wizard": {
    "lastRunAt": "2026-02-27T08:05:47.709Z",
    "lastRunVersion": "2026.2.25",
    "lastRunCommand": "configure",
    "lastRunMode": "local"
  },
  "auth": {
    "profiles": {
      "moonshot:default": {
        "provider": "moonshot",
        "mode": "api_key"
      }
    }
  },
  "models": {
    "mode": "merge",
    "providers": {
      "moonshot": {
        "baseUrl": "https://api.moonshot.cn/v1",
        "api": "openai-completions",
        "models": [
          {
            "id": "kimi-k2.5",
            "name": "Kimi K2.5",
            "reasoning": false,
            "input": [
              "text",
              "image"
            ],
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "contextWindow": 256000,
            "maxTokens": 8192
          }
        ]
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "moonshot/kimi-k2.5"
      },
      "models": {
        "moonshot/kimi-k2.5": {
          "alias": "Kimi"
        }
      },
      "workspace": "/Users/joey/.openclaw/workspace"
    }
  },
  "commands": {
    "native": "auto",
    "nativeSkills": "auto",
    "restart": true,
    "ownerDisplay": "raw"
  },
  "session": {
    "dmScope": "per-channel-peer"
  },
  "channels": {
    "xiaozhi": {
      "enabled": true,
      "xiaozhiServerUrl": "http://localhost:8003",
      "deviceId": "2E:5A:6F:AC:48:DC",
      "timeout": 30
    }
  },
  "gateway": {
    "port": 18789,
    "mode": "local",
    "bind": "loopback",
    "auth": {
      "mode": "token",
      "token": "9ccf89f61dda2072238f458f5f671a93ed96908aea136aa4"
    },
    "tailscale": {
      "mode": "off",
      "resetOnExit": false
    },
    "nodes": {
      "denyCommands": [
        "camera.snap",
        "camera.clip",
        "screen.record",
        "calendar.add",
        "contacts.add",
        "reminders.add"
      ]
    }
  },
  "plugins": {
    "entries": {
      "xiaozhi": {
        "enabled": true
      }
    }
  }
}

2. 从 web 测试页面体验

本地浏览器打开

http://localhost:8006/
1、根据页面提示,配置大模型

需要配置 OpenClaw 和 xiaozhi 的大模型,OpenClaw 是通过终端命令配置,xiaozhi 是通过直接修改文件配置(我在前端做了个快捷修改的入口,xiaozhi 修改完之后要手动重启一下 xiaozhi-server)
在这里插入图片描述

2、连接小智

点击拨号,把 web 测试页和 xiaozhi-server 连接起来
在这里插入图片描述

3、开始体验吧

a. 第一个小任务:“你在干什么?”
这个会被识别为简单任务,会直接调用 DeepSeek 模型,直接回答
在这里插入图片描述

b. 第二个复杂任务:“帮我在桌面创建一个空文件,文件名是 a.py”
这个被识别为复杂任务,会调用 OpenClaw 完成文件创建的任务
在这里插入图片描述

3. 真正在小智设备上体验

1、记录我们的 xiaozhi-server 启动后返回的 OTA 接口地址
xiaozhi-server 启动时,会返回一个 ota 的服务器地址,复制保存这串地址,后面要配到小智设备上
http://10.86.36.43:8003/xiaozhi/ota/
在这里插入图片描述

2、把小智设备切换到配网模式。
我的设备的具体操作是在小智设备启动后,迅速点一下 boot 接口,其他设备的操作可以查看 xiaozhi 的官方文档:
https://my.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb

3、用你的手机或者电脑连接到小智设备的 wifi,并进入配网页面,配置 OTA 地址
在这里插入图片描述

具体操作可以参考这个教程:https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/docs/firmware-setting.md

4、配置完后,你对小智设备说话就相当于在 web 测试页输入了

结语

至此,我们完成了通过 xiaozhi 设备控制 OpenClaw 的整个流程,后面我们可以通过拓展 OpenClaw 的能力完成比如外卖对接,真正实现一个对生活有用的 AI 助理!

所有的代码已开源:

  • open-claw:https://gitee.com/littleS/open-claw
  • xiaozhi-server:https://gitee.com/littleS/xiao-zhi-server

一键体验

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐