- 新增完整的 Home Assistant 集成示例,支持文本对话与上下文会话 - 实现小爱音箱事件解析与 TTS 播报,支持实时打断功能 - 添加连续会话管理,支持区域上下文注入和会话超时结束 - 提供完整的配置系统、类型定义和错误处理 - 包含 Rust 扩展模块用于小爱音箱通信,支持音频流处理 - 添加单元测试、集成测试脚本和 Docker 部署支持 - 提供详细的使用文档和配置说明
5.1 KiB
5.1 KiB
Open-XiaoAI x Home Assistant Assist
该示例用于将小爱音箱接入 Home Assistant 的对话/语音助手能力,支持文本对话与上下文会话,并提供可选的语音输入管线对接能力。
功能说明
- 文本对话:对接 Home Assistant
conversation.processAPI,支持自然语言控制设备/查询信息 - 实时打断:接收到新用户消息时先中断当前播报,再处理新输入,避免并发播报
- 连续对话会话管理:默认开启连续对话;当命中结束词或语音静默超时时自动结束并重建
conversation_id - 区域上下文注入:支持客户端 IP 到 Home Assistant 区域映射,命中后在每次请求前注入区域前置提示词
- 小爱音箱 I/O:从小爱音箱事件中提取最终识别文本(ASR),将回复通过小爱本机 TTS 播放
- 可选音频能力(扩展点):支持接收小爱录音流
record,用于后续对接 Assist pipeline(STT→Intent→TTS)
使用场景
- 用中文/英文自然语言控制 Home Assistant:开灯、关灯、调亮度、问温度/天气、查询传感器状态
- 把小爱音箱作为 Home Assistant 的“外置麦克风 + 扬声器”(局域网内运行)
架构概览
- 小爱音箱 →(WebSocket 4399)→ Rust 网关(
open_xiaoai_server)→ Python 回调 - 文本链路(默认,低延迟):
- 设备事件
instruction/NewLine→ 抽取SpeechRecognizer.RecognizeResult文本 - 调用 HA
/api/conversation/process - 把返回的
response.speech.plain.speech交给小爱 TTS 播报
- 设备事件
目录结构
本目录包含:
hass_assistant.py:主入口config.example.json:配置模板requirements.txt:Python 依赖src/:Rust(PyO3) 扩展模块(小爱音箱 I/O 网关)hass/:Python 实现(HA 客户端、对话编排、上下文记忆)tests/:单元测试scripts/:集成测试脚本
安装与运行
前置条件
- 你的小爱音箱已刷机并运行 Rust 客户端补丁(否则服务端收不到事件/音频流)
- Home Assistant 已启用
conversation(默认配置一般已启用)并生成 Long-Lived Access Token - 本机具备 Python(建议 3.10+)与 Rust 工具链(用于编译 PyO3 扩展)
- 可选:如果你希望使用 webrtcvad(更好的语音端点检测),Windows 需要安装 MSVC Build Tools
1) 准备配置
复制配置模板:
cd examples/hass
cp config.example.json config.json
编辑 config.json:
homeassistant.url:HA 地址(例如http://192.168.1.10:8123)homeassistant.access_token:HA Long-Lived Access Tokenhomeassistant.assistant_entity_id:对话助理 ID(对应agent_id,默认home_assistant)
配置新增项说明
xiaoai 段新增以下关键配置:
interrupt_on_new_input:是否在收到新消息时立即执行打断,默认trueinterrupt_command:打断命令,默认使用ubus call mibrain ai_service触发中断continuous_conversation_enabled:是否开启连续会话,默认truesession_idle_timeout_seconds:连续会话静默超时秒数,默认15session_end_keywords:结束词列表,默认包含再见拜拜滚退下,按包含匹配client_ip_area_mapping:客户端 IP 到区域名称映射,仅在命中时注入区域提示词
区域提示词注入内容为:
当前用户对话所在区域:<区域名称>,如后续对话未明确指定区域,则默认为此区域
2) 安装依赖
pip install -r requirements.txt
3) 编译 Rust 扩展(open_xiaoai_server)
推荐使用 maturin:
pip install maturin
maturin develop --release
4) 运行
python hass_assistant.py
API 调用示例
Home Assistant conversation.process(curl)
curl -X POST \
-H "Authorization: Bearer YOUR_LONG_LIVED_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
http://HOME_ASSISTANT:8123/api/conversation/process \
-d '{"text":"打开客厅灯","language":"zh-cn","agent_id":"home_assistant"}'
Python 调用(不连接小爱,仅验证 HA)
可参考 scripts/integration_text.py。
故障排除
- 401/403:检查
access_token是否正确、是否完整复制 - 连接超时:检查
homeassistant.url是否可达、是否被防火墙/反代阻断 - 无语音输入:确认小爱已运行客户端补丁且能连到本机 4399 端口
- 无语音输出:确认小爱系统
ubus/mibrain可用(或改用play_url播放 URL) - 对话不连贯:确认
state.json能写入(用于持久化conversation_id),或删除它重置会话 - 打断不生效:检查
xiaoai.interrupt_command是否可在设备上执行,以及日志中是否出现xiaoai_interrupt_failed - 区域提示词未注入:检查
client_ip_area_mapping是否包含当前客户端 IP,并查看area_mapping_hit/area_mapping_miss日志
部署说明
- 建议仅在局域网内部署运行,避免将 4399 暴露到公网
- 如果 HA 与运行本示例的机器不在同一网段,确保 HA 的 URL 在设备侧可访问(尤其是播放 URL 时)