Ctrlable/ha-ctrlable-snapcast-tts
GitHub: Ctrlable/ha-ctrlable-snapcast-tts
这是一个Home Assistant集成,用于低延迟地将TTS语音响应路由到特定Snapcast音频客户端,解决标准播放路径的延迟和配置灵活性问题。
Stars: 0 | Forks: 0
# 可控的 Snapcast TTS 流媒体服务器
将 Home Assistant Assist 的 TTS 响应路由到特定的 Snapcast 客户端——实现低延迟、按房间定向,且路由更改时无需修改固件。
## 为什么需要
Home Assistant 的 `media_player.play_media` 在 HAOS 2026.5.x 中无法保持流式 TTS 行为。当 Piper 流式传输 TTS 输出时,标准路径会等待完整音频生成完毕才开始播放,从而产生明显的延迟。本项目通过 ESPHome 的 `on_intent_progress` 事件将 TTS 直接路由到 Snapcast 客户端——完全绕过 `media_player.play_media`——因此第一个音频字节在最后一部分生成前就会播放。
本项目解决的其他痛点:
- 音乐助手广播路由需要逐卫星配置,当音箱移动时配置会失效。
- ESPHome 原生 TTS 仅在卫星设备上播放,无法在房间整体音箱上播放。
- 更改语音命令定向的房间通常需要刷新固件。
## 架构
```
┌─────────────────────┐ ┌──────────────────────┐ ┌─────────────────────┐
│ ESPHome Satellite │ │ HA Custom Integ. │ │ HAOS Add-on │
│ (Atom Echo etc.) │ │ ctrlable_snapcast_ │ │ ctrlable-snapcast- │
│ │ │ tts │ │ streamer │
│ on_intent_progress │──┬──▶│ │ │ │
│ fires homeassistant│ │ │ Service: │ │ HTTP endpoint: │
│ .service call with │ │ │ .announce │─────▶│ POST /announce │
│ url + satellite_id │ │ │ Owns mapping: │ │ │
│ + wake_word │ │ │ (sat_id, wake) → │ │ Snapcast JSON-RPC │
│ │ │ │ target snapclient │ │ topology mgmt │
│ on_tts_end (fallbk)│──┘ │ + UI config flow │ │ │
└─────────────────────┘ └──────────────────────┘ │ Per-client lock │
│ Stream PCM/MP3 to │
│ Snapcast TCP port │
│ Move client to │
│ announce group, │
│ play, restore │
└─────────┬───────────┘
│
┌─────────▼───────────┐
│ Snapcast Server │
│ (existing LXC) │
│ Per-client streams │
│ + announce groups │
└─────────────────────┘
```
三个组件,一个安装链接:
| 组件 | 功能 |
|-----------|-------------|
| **HAOS 插件** (`ctrlable-snapcast-streamer`) | 管理 Snapcast 拓扑,流式传输音频,暴露 HTTP API 和入口界面 |
| **HA 集成** (`ctrlable_snapcast_tts`) | 管理卫星到 snapclient 的映射,暴露 `announce` 服务,提供配置界面 |
| **ESPHome YAML 包** | 参考卫星配置(每设备 3 行替换内容) |
## 安装
### 安装插件
1. 在 Home Assistant 中:**设置 → 插件 → 插件商店 → ⋮ → 仓库**
2. 粘贴地址:`https://github.com/Ctrlable/ha-ctrlable-snapcast-tts`
3. 在商店中找到 **Ctrlable Snapcast TTS Streamer** 并安装。
4. 配置插件的 Snapcast 服务器地址,然后启动。
5. 从插件的入口界面复制 Bearer 令牌。
### 安装集成(通过 HACS)
1. 在 HACS 中:**⋮ → 自定义仓库**
2. 粘贴地址:`https://github.com/Ctrlable/ha-ctrlable-snapcast-tts`,分类:**集成**
3. 安装 **Ctrlable Snapcast TTS**
4. 重启 Home Assistant
5. 进入 **设置 → 设备与服务 → 添加集成** → 搜索 "Ctrlable Snapcast TTS"
6. 输入插件地址 (`http://localhost:8765`) 和上述步骤获取的 Bearer 令牌。
两者使用相同的仓库地址。一个链接,两种安装流程。
## 配置
完整设置说明请参阅[安装文档](docs/installation.md),包括:
- Snapcast 服务器前置条件
- SSH 访问设置(用于文件编辑模式)
- 卫星 ESPHome YAML
- 映射配置
## 刷写卫星设备
为每个卫星创建 YAML 配置(3 行替换内容):
```
# 客厅卫星.yaml
substitutions:
name: ctrlable-living-room
friendly_name: "Ctrlable Living Room"
micro_wake_word_model: okay_nabu
packages:
ctrlable_base: !include packages/ctrlable_atom_echo_base.yaml
```
`name` 字段将成为路由映射中使用的 `satellite_id`。基础包和示例请参阅 [esphome/packages/](esphome/packages/)。
## 与其他方案对比
| 功能 | 本项目 | 音乐助手 | ESPHome 原生 TTS |
|---------|-------------|----------------|---------------------|
| 低延迟流式 TTS | 是(绕过 play_media) | 否(缓冲) | 否(缓冲) |
| 路由到 Snapcast 客户端 | 是 | 否 | 否 |
| 无需刷写即可更改路由 | 是(界面映射) | 不适用 | 否 |
| 多房间同步 | 是 (M4) | 通过 MA 房间 | 否 |
| 无需音乐助手即可工作 | 是 | 必需 | 是 |
## 兼容性
| 组件 | 最低版本 |
|-----------|----------------|
| Home Assistant OS | 2026.5.1 |
| Home Assistant | 2026.5.0 |
| Snapcast 服务器 | 0.27+ |
| ESPHome | 2025.5.0 |
| ESP32 开发板 | M5Stack Atom Echo 或任何兼容板 |
## 许可证
Apache 2.0 — 详见 [LICENSE](LICENSE)。
由 [Ctrlable](https://ctrlable.com) 构建 — 面向酒店和商业空间的智能楼宇自动化解决方案。
标签:ESPHome开发, Home Assistant插件, Python脚本, Snapcast集成, UI可配置, 低延迟音频, 实时音频, 家庭自动化, 房间定向播放, 插件开发, 文本到语音, 无线扬声器, 智能家居, 智能音箱, 流媒体技术, 自定义集成, 语音助手, 语音命令处理, 路由系统, 逆向工具, 音频播放优化, 音频流