智能家居
Home Assistant 离线语音助手搭建:Whisper 语音识别 + Piper 中文 TTS 本地控制全屋
2026年9月10日
用本地 Whisper 识别与 Piper 中文合成在 Home Assistant 上搭建断网可用的语音助手。
Home Assistant 离线语音助手搭建:Whisper 语音识别 + Piper 中文 TTS 本地控制全屋
摘要
厂商语音助手依赖云端、断网即瘫痪、对话还上传服务器。本文给出一套完全跑在本地的方案:用 Whisper 做中文语音识别、Piper 做中文语音合成,接入 Home Assistant 的 Assist 流水线,实现断网也能语音控灯、查状态、触发场景,全程数据不出户。
为什么要把语音助手搬回本地
我用小爱、Siri 多年,最大的痛有三点:一是路由器一抖或宽带掉线,语音控制直接失效;二是每次指令都要回厂商云,家里说了什么自己完全没掌控;三是中文唤醒和方言支持经常被阉割。Home Assistant 从 2023 年起把语音能力做成可插拔的 pipeline,识别、合成、对话三个环节都能换成自托管组件。只要有一台常开的小主机(树莓派 4、N100 迷你机都行),就能把"耳朵"和"嘴巴"都留在本地。
基础环境与前提
假设你已经跑起 Home Assistant(Supervised 或 Container 均可,本文以 Container 为例,宿主机为 Ubuntu 22.04)。CPU 建议 4 核以上,内存 4GB 起步;若想识别更快,可加一块入门独显做 Whisper 的 GPU 推理,没有也能跑,只是延迟高一点。
先确认 HA 能正常访问,且已装好 HACS(方便装社区插件)。本文用到两个核心组件:
whisper-asr:本地语音识别,把音频转成文字。piper:本地 TTS,把文字合成为自然的中文语音。
部署 Whisper 语音识别
推荐用 Rhasspy 维护的 docker-wyoming-whisper 镜像,通过 Wyoming 协议与 HA 通信。在宿主机新建 docker-compose.yml:
services:
whisper:
image: rhasspy/wyoming-whisper:latest
container_name: whisper
restart: unless-stopped
command:
- "--model=base"
- "--language=zh"
- "--download-dir=/data"
volumes:
- ./whisper-data:/data
ports:
- "10300:10300"
base 模型在 CPU 上识别一句 5 秒中文约 1.5 秒,精度够用;若主机有 8GB 内存可上 small 提升准确率。--language=zh 强制中文,避免中英混说时误判。HA 里添加"Whisper"集成,填 tcp://宿主机IP:10300 即可发现。
配置 Piper 中文 TTS
同样用 Wyoming 方式部署 Piper:
services:
piper:
image: rhasspy/wyoming-piper:latest
container_name: piper
restart: unless-stopped
command:
- "--voice=zh_CN-huayan-medium"
- "--download-dir=/data"
volumes:
- ./piper-data:/data
ports:
- "10200:10200"
zh_CN-huayan-medium 是中文"华妍"女声,中等音质体积约 40MB,听感比早期模型自然得多。HA 中添加"Piper"集成指向 tcp://宿主机IP:10200。注意首次合成会联网下载一次语音模型,之后完全离线。
在 HA 中打通语音流水线
进入 设置 → 语音助手 → 添加助手,新建一条 pipeline:
- 语音识别(STT)选 Whisper;
- 对话代理(Conversartion)选默认的 Home Assistant Agent,或接本地的 LLM(如 Ollama 跑 qwen2.5:3b)让回答更聪明;
- 语音合成(TTS)选 Piper。
保存后把它设为默认助手。此时你在 HA 前端的"语音助手"输入框说话,已经能本地识别并执行"打开客厅灯""现在几点"这类指令。
实用自动化示例
语音的价值在于联动。举一个真实可用的场景:回家说"我回来了",HA 通过 Whisper 识别后执行:
automation:
- alias: 语音回家模式
trigger:
- platform: conversation
command: "我回来了"
action:
- service: light.turn_on
target: { entity_id: light.living_room }
- service: climate.set_temperature
target: { entity_id: climate.ac }
data: { temperature: 26 }
- service: tts.speak
data:
entity_id: tts.piper
message: "欢迎回家,已为你打开客厅灯和空调"
关键点:用 conversation 触发器的 command 做意图匹配,比依赖 LLM 更稳、更可控;复杂语义再交给本地大模型。
性能与避坑清单
- 延迟:纯 CPU 跑 base 模型,识别+合成一轮约 2–3 秒,能接受;想秒回就上
small模型或 GPU 推理。 - 麦克风:HA 本身不采集麦克风,需配合 ESP32-S3-Box、手机 App 的 Assist 微件或浏览器麦克风。我用在墙上的安卓平板跑 HA Companion,长按说话最顺手。
- 模型下载:Whisper/Piper 首次都要拉模型,部署阶段确保宿主机能联网一次,之后可断网。
- 内存泄漏:whisper 容器长期运行偶有内存增长,加
restart: unless-stopped让它在崩了自动拉起即可。 - 中文分词:Whisper 对"打开书房的灯"识别很好,但"把卧室空调调到二十五度"数字可能识别成"25",在
conversation命令里同时写"二十五"和"25"两种写法更稳。
小结
本地语音助手不是玩具:断网可用、隐私不出户、中文支持可控,这三点是厂商方案给不了的。整套组件都跑在 Docker 里,半小时就能起来。下一步可以把对话代理换成本地大模型,让它能回答"今天湿度多少、要不要开窗"这类需要查传感器的问题,智能化体验会再上一个台阶。