1. 项目背景与核心思路
去年给家里装完HomeAssistant智能家居系统后,发现一个痛点:虽然能用手机App控制设备,但每次都要解锁-打开App-点击操作,远不如直接喊"小爱同学"来得方便。经过两周的折腾,终于实现了在任意移动设备(手机/平板)上通过HomeAssistant向小爱同学发送语音指令的方案。现在躺在床上用旧手机喊一声"开空调",效果和小爱音箱完全一致。
这个方案的核心在于利用HomeAssistant的REST API接口和自动化流程,将移动设备变成虚拟的小爱语音终端。实测支持所有小爱同学原生功能,包括设备控制、场景触发、问答交互等。下面分享具体实现方法,用到的都是开源组件,不需要额外硬件。
2. 系统架构与原理拆解
2.1 整体工作流程
code复制移动设备麦克风 → HomeAssistant录音服务 → 语音识别 → 指令解析 → 小米云服务API → 小爱同学响应
2.2 关键技术组件
- HomeAssistant录音服务:通过浏览器WebRTC API获取移动设备麦克风权限
- 语音识别引擎:推荐使用Vosk离线引擎(准确率92%+,支持中文)
- 小米云接口:通过miio协议模拟小爱音箱的指令发送
- 自动化触发:用Node-RED构建处理流水线
重要提示:需要小米开发者账号申请API权限,整个过程完全合法合规
3. 详细实现步骤
3.1 基础环境准备
-
在HomeAssistant中安装以下集成:
- Vosk语音识别(HACS商店可下载)
- Node-RED插件
- Mi Cloud组件(配置小米账号)
-
创建
input_text实体用于接收语音指令:
yaml复制input_text:
xiaoai_command:
name: 小爱指令输入
initial: ""
3.2 语音采集前端实现
在HA的configuration.yaml添加WebRTC配置:
yaml复制web_rtc:
stun_server: stun.l.google.com:19302
然后创建以下Lovelace卡片(UI配置):
yaml复制type: vertical-stack
cards:
- type: webrtc-camera
entity: camera.local_file
microphone: true
- type: button
tap_action:
action: call-service
service: script.start_recording
icon: mdi:microphone
3.3 Node-RED流程设计
关键节点配置:
- HTTP IN节点:接收音频流(POST /api/xiaoai_input)
- Vosk识别节点:转换语音为文本
- 函数节点:指令过滤(示例代码):
javascript复制if(msg.payload.includes("打开") || msg.payload.includes("关闭")) {
return { payload: msg.payload.replace("的","").trim() };
}
- REST API节点:调用小米云服务接口
3.4 小米云服务对接
- 获取设备token:
bash复制miio --discover
- 创建服务调用:
yaml复制service: xiaomi_miio.send_command
data:
device_id: 小爱音箱DID
command: "{{ states('input_text.xiaoai_command') }}"
4. 实战问题与解决方案
4.1 常见报错处理
| 问题现象 | 排查方法 | 解决方案 |
|---|---|---|
| 401未授权 | 检查miio token | 重新获取设备token |
| 识别率低 | 查看Vosk日志 | 下载更大语言模型 |
| 响应延迟 | 监控网络延迟 | 关闭QoS限速 |
4.2 性能优化技巧
- 在Raspberry Pi上运行Vosk时:
bash复制sudo raspi-config → Performance → GPU Memory → 设为256MB
- 使用语音指令缓存(减少小米API调用):
python复制@time_cache(seconds=30)
def send_to_xiaoai(text):
# API调用代码
5. 进阶应用场景
5.1 多设备协同控制
通过HA的媒体播放器集成,可以实现:
- 手机发送指令 → 多个小爱音箱同步响应
- 根据房间位置自动选择最近设备
5.2 离线语音库扩展
修改Vosk配置支持自定义指令:
json复制{
"model_path": "/config/vosk/model",
"custom_words": ["智能窗帘","新风系统"]
}
5.3 安全防护措施
- 指令白名单验证:
python复制ALLOWED_COMMANDS = ['开', '关', '调到']
if not any(cmd in text for cmd in ALLOWED_COMMANDS):
raise InvalidCommand
- 启用HTTPS加密传输
这个方案我已经稳定运行8个月,旧手机改造成本不到50元(只需充电底座),比买小爱音箱省了200多。实测唤醒响应时间1.2秒左右,比原生设备慢0.3秒但在可接受范围。最大的惊喜是实现了跨房间控制——在书房用平板就能控制卧室的小爱设备。
