方案1:用「小爱开放平台-自定义技能」把语音文本转发到 OpenClaw
(最像“接入音箱”)
目标效果:
你对小米音箱说一句话 → 小爱把识别出来的文本发到你的服务器 → 服务器调用 OpenClaw /v1/chat/completions → 把回复文本回给小爱 → 音箱播报。
架构
小米音箱(ASR) → 小爱技能云回调(HTTPS) → 你的 Webhook 服务 → OpenClaw HTTP → 返回文本 → 小爱(TTS)播报
需要准备
- 小爱开放平台账号 & 创建自定义技能(控制台里“技能开发 → 自定义技能”
- 一台公网可访问的 HTTPS 服务(域名+证书,平台回调一般要求 HTTPS)
- OpenClaw 开启 OpenAI 兼容 HTTP 端点:
POST /v1/chat/completions
关键实现点(最少集成步骤)
- 在小爱平台创建“自定义技能”,配置:
- 唤醒词/技能名称
- 意图/槽位(最简单:把用户整句当作 query 文本)
- 服务端回调 URL(你的
https://xxx.com/xiaoai/webhook)
- 你的 Webhook 服务收到小爱请求后:
- 校验签名/Token(按小爱平台文档要求)
- 取出用户说的话
query - 调 OpenClaw:
POST http://<openclaw-gateway-host>:<port>/v1/chat/completions([OpenClaw][2])
- 把 OpenClaw 返回的
content拼回小爱要求的 JSON 响应格式(让它走 TTS)
一个“桥接服务”的最小示例(Node/Express)
下面示例只演示“把文本转给 OpenClaw 再返回文本”,小爱那边的签名校验/响应格式字段你需要按平台文档补齐。
import express from "express";
const app = express();
app.use(express.json());
app.post("/xiaoai/webhook", async (req, res) => {
// 1) TODO: 校验小爱签名/鉴权(按平台文档)
const userText =
req.body?.request?.intent?.query ||
req.body?.query ||
req.body?.request?.query ||
"";
// 2) 调 OpenClaw OpenAI 兼容端点
const r = await fetch("http://127.0.0.1:18789/v1/chat/completions", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
model: "auto",
messages: [
{ role: "system", content: "你是简洁的中文语音助手,回答尽量短。" },
{ role: "user", content: userText },
],
}),
});
const data = await r.json();
const answer = data?.choices?.[0]?.message?.content?.trim() || "我没听清。";
// 3) TODO: 按小爱自定义技能要求组织响应 JSON(这里先用占位)
return res.json({
// 你需要替换成小爱平台规定的字段
reply: answer,
});
});
app.listen(3000, () => console.log("xiaoai bridge on :3000"));
方案2:用 Home Assistant 把「小米生态」接进来,再用自动化把文本丢给 OpenClaw
(更适合“语音触发联动”)
目标效果:你对音箱说“打开客厅灯 / 执行某个场景” → 小米生态设备/场景状态进 Home Assistant → HA 自动化触发 → 调 OpenClaw(做总结/播报/记录/执行额外动作)。
需要准备
- Home Assistant
- 小米官方 Xiaomi Home 集成(支持 OAuth2 登录)
- (可选)用 HA 的 webhook / REST 命令把事件转发给 OpenClaw
这条路的优点:不需要做小爱技能审核流程也能玩很多联动;缺点:更像“智能家居联动”,不是真正的“任意问答式聊天”。
选型建议(直接结论)
- 你要的是:“把音箱当语音入口,能跟 OpenClaw 自由聊天” → 选 A(小爱自定义技能)。
- 你要的是:“小米设备/场景进中枢,再让 OpenClaw 参与自动化” → 选 B(Home Assistant)
可以,用 Home Assistant 的思路大概是:把“小米生态”接进 HA,当成触发源/执行器;OpenClaw 当成“脑子”;音箱负责“听/说”或“播报”。(但要注意:很多小米音箱在 HA 里不一定能作为标准 media_player 直接播 TTS,这跟型号/协议有关。)
用 Home Assistant 的两种典型玩法
玩法 A:小爱负责语音(云),HA 做自动化,OpenClaw 做决策/生成文本
你对音箱说:“打开客厅灯,并告诉我今天待办”
- 小爱 -> 触发米家场景/设备
- HA 监听设备状态变化 / 场景触发
- HA 调 OpenClaw 生成一句“播报文本/总结”
- HA 再把文本“播”到某个可播报的设备(Chromecast/Google speaker/ESPHome speaker 等)
适合:你已经有 HA 中枢、想把 OpenClaw 变成“解释器/总结器/记录员”。
玩法 B:HA 本地 Assist 做语音入口(更像“本地语音助手”)
- 用 HA Assist(本地/半本地的语音管线)做 STT/TTS
- OpenClaw 作为对话后端(你写一个 middleware 把文本转给 OpenClaw)
- HA 负责把回复 TTS 播出来(到 HA 的 voice satellite 或 media_player)
适合:你想把整个链路尽量“本地化”,但工程量更高。
2)接入小米设备(HA 侧)
现在主流是用 Xiaomi Home Integration(官方/官方合作路线,OAuth2 登录,不保存密码)。
做法(很短):
- HA:Settings → Devices & services → Add Integration → Xiaomi Home(会引导 OAuth 登录)
- 登录后,设备会以 entity 的形式出现(灯、插座、传感器、空调等)
3)HA 里怎么“调用 OpenClaw”
核心就是:HA 自动化 → 发 HTTP 请求给 OpenClaw。HA 里常见做法是 rest_command(以及自动化 action 调用它),社区里也经常这么用来“发 webhook / HTTP 请求”。
例:configuration.yaml
rest_command:
openclaw_chat:
url: "http://127.0.0.1:18789/v1/chat/completions"
method: POST
headers:
content-type: "application/json"
payload: >
{
"model":"auto",
"messages":[
{"role":"system","content":"你是简洁的中文家庭助手。"},
{"role":"user","content":"{{ prompt }}"}
]
}
然后自动化里:
- Trigger:某个小米设备状态变化(比如门磁打开)
- Action:调用
rest_command.openclaw_chat,把prompt填进去 - 再把返回内容做播报/通知(见下一节)
自动化触发器的基本概念参考 HA 文档:状态变化、事件等都能触发。
4)OpenClaw 的回复怎么“播出来”
这一步是最容易踩坑的:小米音箱能不能被 HA 当作 media_player 播 TTS,很多时候并不稳/不通用(社区里关于 Xiaomi Smart Speaker / network speaker 的讨论很多,但并没有“统一的官方可行方式”适配所有型号)。
所以一般有三条“务实”路线:
路线 1:播到“HA 里已经稳定的播报设备”
- Chromecast / Google Nest / Sonos / ESPHome speaker / HA Voice Assistant satellite 等
(这类在 HA 里 TTS/播放链路更成熟)
路线 2:不播 TTS,改成通知
- HA 手机 App 推送
- Telegram/飞书(你本来就有 bot 体系)
路线 3:音箱继续走“小爱云播报”
- 让 HA 调用米家场景/小爱技能去播报(取决于你能否把“播报动作”做成场景/服务)
5)该怎么选
(现在的 OpenClaw 目标)
- 你要的是“音箱=自由聊天入口”:优先走“小爱自定义技能 → OpenClaw”(不需要 HA)
- 你要的是“全屋自动化 + OpenClaw 参与决策/总结”:用 HA(设备接入、触发、联动都在 HA)