Files
open-xiaoai/examples/hass/README.md
T

126 lines
5.1 KiB
Markdown
Raw Normal View History

# Open-XiaoAI x Home Assistant Assist
该示例用于将小爱音箱接入 Home Assistant 的对话/语音助手能力,支持文本对话与上下文会话,并提供可选的语音输入管线对接能力。
## 功能说明
- 文本对话:对接 Home Assistant `conversation.process` API,支持自然语言控制设备/查询信息
- 实时打断:接收到新用户消息时先中断当前播报,再处理新输入,避免并发播报
- 连续对话会话管理:默认开启连续对话;当命中结束词或语音静默超时时自动结束并重建 `conversation_id`
- 区域上下文注入:支持客户端 IP 到 Home Assistant 区域映射,命中后在每次请求前注入区域前置提示词
- 小爱音箱 I/O:从小爱音箱事件中提取最终识别文本(ASR),将回复通过小爱本机 TTS 播放
- 可选音频能力(扩展点):支持接收小爱录音流 `record`,用于后续对接 Assist pipelineSTT→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) 准备配置
复制配置模板:
```bash
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 Token
- `homeassistant.assistant_entity_id`:对话助理 ID(对应 `agent_id`,默认 `home_assistant`
### 配置新增项说明
`xiaoai` 段新增以下关键配置:
- `interrupt_on_new_input`:是否在收到新消息时立即执行打断,默认 `true`
- `interrupt_command`:打断命令,默认使用 `ubus call mibrain ai_service` 触发中断
- `continuous_conversation_enabled`:是否开启连续会话,默认 `true`
- `session_idle_timeout_seconds`:连续会话静默超时秒数,默认 `15`
- `session_end_keywords`:结束词列表,默认包含 `再见` `拜拜` `滚` `退下`,按包含匹配
- `client_ip_area_mapping`:客户端 IP 到区域名称映射,仅在命中时注入区域提示词
区域提示词注入内容为:
`当前用户对话所在区域:<区域名称>,如后续对话未明确指定区域,则默认为此区域`
### 2) 安装依赖
```bash
pip install -r requirements.txt
```
### 3) 编译 Rust 扩展(open_xiaoai_server
推荐使用 maturin
```bash
pip install maturin
maturin develop --release
```
### 4) 运行
```bash
python hass_assistant.py
```
## API 调用示例
### Home Assistant conversation.processcurl
```bash
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 时)