Evan
发布于 2026-06-02 / 3 阅读
0
0

自定义语音助手

自定义语音助手方案

概述

本方案基于 Home Assistant 内置的语音助手框架,整合了开源唤醒词、本地 STT、多选 TTS 以及 LLM 代理,构建了一套完整的中文智能家居语音控制系统。

设计目标

  • 低延迟:STT 和唤醒词均使用本地部署,避免网络往返
  • 高准确率:中文场景优化,SenseVoice + Smart Conversation 覆盖口语化表达
  • 弹性扩展:TTS 和 LLM 支持多种后端切换,降级可用
  • 经济优先:优先选择免费/开源方案,TTS 首选免费的 Edge TTS

整体架构

                         ┌──────────────────────┐
                         │       用  户          │
                         │   "嘿 Eventi,开灯"    │
                         └──────────┬───────────┘
                                    │ 语音
                                    ▼
┌──────────────────────────────────────────────────────────┐
│            linux-voice-assistant  (ESPHome 卫星)          │
│                                                          │
│  ① 唤醒词检测 (OpenWakeWord 内置) ─ 未命中 → 忽略        │
│     │ 命中                                               │
│  ② 音频采集 (PulseAudio)                                 │
│     │                                                    │
│     └── ESPHome 原生 API ──→ HA                          │
│                                                          │
│  ③ 音频播放 (PulseAudio)                                 │
│     ▲                                                    │
│     └── ESPHome 原生 API ←── HA  ←── TTS 音频返回        │
└──────────────────────────────────────────────────────────┘
           │                                    ▲
           │  音频流 (ESPHome)                   │ TTS 音频 (ESPHome)
           ▼                                    │
┌──────────────────────────────────────────────────────────┐
│                   Home Assistant                         │
│                                                          │
│  ④ STT 语音识别 (SenseVoice / Wyoming)                   │
│     │  文本(带情绪标签)                                  │
│     ▼                                                    │
│  ⑤ 意图处理                                              │
│     ├─ Smart Conversation 清洗(去标签/语气词/句式归一)   │
│     └─ HassIL 意图匹配                                    │
│           │                                              │
│     ┌─────┴─────┐                                        │
│     │ 成功       │ 失败                                   │
│     ▼           ▼                                        │
│  ⑥ 执行命令  ⑦ LLM 代理 (Openclaw)                       │
│  (直接操控     ├─ 大模型理解意图                          │
│   设备)       ├─ HA MCP 操控设备                          │
│               └─ 生成回复文本                             │
│                     │                                    │
│                     ▼                                    │
│              ⑧ TTS 语音合成 (Edge TTS)                   │
│                     │                                    │
│                     └── TTS 音频 → ESPHome → 卫星扬声器   │
└──────────────────────────────────────────────────────────┘

各组件详解

① 音频采集与输出

项目 详情
方案 linux-voice-assistant(OHF-Voice)
接入方式 ESPHome 原生协议(在 HA 中自动发现为 ESPHome 设备)
核心功能 麦克风采集 + 扬声器输出 + 唤醒词检测(三合一语音卫星)
部署方式 Docker 容器,PulseAudio 音频透传

📄 详见 → [[语音输入和输出]]

② 唤醒词检测

项目 详情
方案 OpenWakeWord(内置于 linux-voice-assistant 中
接入方式 通过 ESPHome 语音管道运行,HA 端无需额外配置
自定义唤醒词 已训练自定义唤醒词 "Eventi" (与 "okay_nabu" 同时激活)
训练仓库 HappyEventKing/openWakeWord

📄 详见 → [[设置唤醒词]]

③ 语音识别 / STT

项目 详情
方案 阿里 SenseVoice(本地部署)
接入方式 Docker + Wyoming 协议 → HA 语音管道
部署仓库 docker_wyoming_sensevoice
优势 本地部署中识别速度最快、中文准确率最高
对比 faster-whisper 速度较慢,且中英文混合场景不友好

📄 详见 → [[设置 STT]]

④ 意图处理

项目 详情
框架 HA 内置语音助手(DefaultAgent)
增强组件 Smart Conversation
处理流程 文本清洗(去 STT 标签/语气词/句式归一)→ HassIL 意图匹配 → 成功执行 / 失败上抛 LLM
关键特性 原文保留给 LLM(情绪标签不丢失),缓存不受影响

📄 详见 → [[HA 意图配置]]

⑤ LLM 代理

项目 详情
方案 Openclaw
功能 当 HA 意图匹配失败时,接收用户原文,调用大模型理解自然语言意图
HA 交互 通过 HA MCP 协议操控 HA 设备
兜底价值 处理非标准命令(闲聊、复合指令、模糊请求等)

📄 详见 → [[openclaw 配置语音代理]]

⑥ 语音合成 / TTS

项目 详情
首选方案 Edge TTS(HA 插件,免费,微软在线引擎)
备选方案 1 阿里云 TTS(HA 插件,音色丰富有情感,有免费额度)
备选方案 2 OpenAI 兼容 TTS(硅基流动语音模型 / Kokoro),本地 GPU 可加速
已排除 Piper(特殊字符/表情时易崩溃),Kokoro(中文输出不佳)

📄 详见 → [[设置 TTS]]

处理流程(时序)

用户说话
  │
  ▼
linux-voice-assistant (ESPHome 卫星)
  ├─ 唤醒词检测 → 未命中 → 忽略
  │     │ 命中
  │     ▼
  └─ 音频流 → ESPHome API → HA 语音管道
                                │
                                ▼
                          STT 语音转文本 (SenseVoice / Wyoming)
                                │ 文本(可能带情绪标签和口语词)
                                ▼
                          Smart Conversation 清洗
                                ├─ 去 STT 标签 <|zh|><|NEUTRAL|>
                                ├─ 去前缀/后缀语气词
                                └─ 句式归一化(把字句→动词前置)
                                │ 清洗文本        │ 原文本保留
                                ▼                │
                          HassIL 意图匹配         │
                                │                │
                    ┌───────────┴───────────┐    │
                    │ 成功                   │ 失败
                    ▼                       ▼
              执行设备命令          Openclaw (LLM 代理)
                    │                   │
                    │           理解意图 + HA MCP 操控设备
                    │                   │
                    │           生成回复文本
                    │                   │
                    └─────────┬─────────┘
                              │ TTS 文本
                              ▼
                        TTS 语音合成 (首选 Edge TTS)
                              │
                              ▼
                    TTS 音频 → ESPHome API → linux-voice-assistant
                              │
                              ▼
                         卫星扬声器播放回复

方案选型理由

环节 选择 理由
音频采集/输出 linux-voice-assistant OHF 官方 ESPHome 卫星,一个项目整合麦克风 + 扬声器 + 唤醒词
唤醒词 OpenWakeWord(内置在 lva 中) 纯本地、低功耗、支持自定义训练
STT SenseVoice(Wyoming) 中文 SOTA 级别识别,比 faster-whisper 快且准
意图处理 HA 内置 + Smart Conversation 无需额外服务,Monkey-Patch 方式零侵入,原文保留
LLM 代理 Openclaw + HA MCP 自然语言兜底,MCP 协议标准化 HA 设备调用
TTS Edge TTS 免费、中文可接受、HA 有现成插件、无 GPU 需求

⚠️ 重要架构更正

linux-voice-assistant​ 使用 ESPHome 原生协议(而非 Wyoming 协议)与 HA 通信。它本身就是一个完整的语音前端,整合了麦克风、扬声器和唤醒词三项功能。

Wyoming 协议在本方案中仅用于 STT (SenseVoice) 和 TTS 服务与 HA 语音管道之间的通信——这些是 HA 服务端组件。而语音卫星端(linux-voice-assistant)走的是 ESPHome 原生 API

详情参见 → [[语音输入和输出]]

完整数据流(HA 语音管道)

HA 的语音管道设计是双向的:linux-voice-assistant 既是音频输入端,也是音频输出端。TTS 合成的语音最终会通过 ESPHome 协议返回给卫星端播出。

┌────────────────────────────────────────────────────────────┐
│                    linux-voice-assistant                    │
│                    (ESPHome 语音卫星)                        │
│                                                            │
│  麦克风 ──→ ESPHome API ──→ HA                     ─┐      │
│  扬声器 ←── ESPHome API ←── HA  ←──────────────────┘      │
│                                                            │
│  内置: 唤醒词 (OpenWakeWord) + 音频处理 (PulseAudio)        │
└────────────────────────────────────────────────────────────┘
         │                                    ▲
         │ 音频流 (ESPHome)                    │ TTS 音频 (ESPHome)
         ▼                                    │
┌────────────────────────────────────────────────────────────┐
│                      Home Assistant                         │
│                                                            │
│  语音管道 (Voice Pipeline):                                 │
│                                                            │
│  音频输入 → STT (SenseVoice/Wyoming)                        │
│           → 意图匹配 (HassIL + Smart Conversation)           │
│           ├─ 成功 → 执行设备命令                             │
│           └─ 失败 → LLM 代理 (Openclaw + HA MCP)            │
│           → TTS (Edge TTS)                                  │
│           → 音频输出 → 返回卫星                              │
│                                                            │
└────────────────────────────────────────────────────────────┘

关键理解

  • linux-voice-assistant​ 在 HA 中被注册为一个 ESPHome 媒体播放器实体,TTS 输出就是通过这个实体播放的
  • 卫星采集的音频通过 ESPHome 协议传入 HA 语音管道,管道处理完成后 TTS 音频通过同一个 ESPHome 连接返回卫星,由卫星扬声器播出
  • 这是一个完整的往返:语音进 → 处理 → 语音出,全部在同一个 ESPHome 连接上完成

评论