Document Speaches speech layer, on-device processing limits, latency constraints

- STT/TTS move to a shared Speaches container (OpenAI-format, GPU, port
  8601 proposed); gateway becomes a thin orchestrator with pluggable
  speech backends (speaches default, embedded fallback)
- Record the on-device ceiling: WakeNet wake word, VAD, ES7210 AEC,
  optional MultiNet fixed commands; open-vocabulary STT permanently out
- Record the real latency bottleneck (Tatlock ~2 min full local flow):
  gateway must stream chat tokens and synthesize sentence-by-sentence
- Plan reply_delta + barge-in protocol additions

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 17:14:44 +02:00
co-authored by Claude Fable 5
parent 576fd7d237
commit 0886c84d5e
3 changed files with 160 additions and 42 deletions
+21 -20
View File
@@ -25,28 +25,28 @@ happens on this server.
## Architecture
```
┌─────────────────────┐ WebSocket (PCM audio + JSON events)
│ DeskLock device │◄──────────────────────────────────────────
│ (ESP32-P4) │
┌────────────────────────────────────┐
│ • LVGL face │ │ DeskLock Gateway (container)
│ • Touch input │ │ on tower-of-joy
│ • Mic capture+AEC │
│ • TTS playback │ │ • STT: faster-whisper (GPU) │
└─────────────────────┘ • TTS: Piper
│ • Chat: Tatlock /v1/chat/completions│
└──────────────────┬───────────────────┘
│ HTTP (LAN, :8000)
┌──────────┴──────────┐
│ Tatlock (butler)
tatlock.schweitz.
│ internal │
└─────────────────────┘
┌─────────────────────┐ WebSocket: PCM audio + JSON events
│ DeskLock device │◄───────────────────────────────────┐
│ (ESP32-P4) │ │
• LVGL face │ ┌──────────────────────────────┴───────────┐
│ • touch / wake word │ │ DeskLock Gateway (container, :8600)
│ • mic capture + AEC │ │ thin orchestrator — no ML dependencies
│ • TTS playback└───────┬──────────────────┬───────────────┘
└──────────────────────┘ │ │ OpenAI-format HTTP
HTTP (LAN) │ ┌─────────────────────────────┐
▼ │ Speaches (container, GPU) │
┌────────────────────┐ │ • STT: faster-whisper │
│ Tatlock (butler) │ │ • TTS: Kokoro / Piper │
tatlock.schweitz. │ │ also usable by Open WebUI,
internal :8000 Home Assistant, …
└────────────────────┘ └─────────────────────────────┘
```
Tatlock stays a text-only brain. The **gateway** is Tatlock's ears and mouth: it converts
speech to text on the way in and text to speech on the way out, keeping the device firmware
thin (audio transport + face rendering only).
Tatlock stays a text-only brain. The **gateway** orchestrates speech-to-text, chat, and
text-to-speech; the **Speaches** container owns the actual STT/TTS models on the GPU,
shared homelab-wide. The device firmware stays thin: audio transport, wake word, and
face rendering only. Everything runs on the LAN — no cloud in the voice path.
See [docs/architecture.md](docs/architecture.md) for the full design.
@@ -69,4 +69,5 @@ See [docs/architecture.md](docs/architecture.md) for the full design.
- [Waveshare wiki: ESP32-P4-WIFI6-Touch-LCD-3.4C](https://www.waveshare.com/wiki/ESP32-P4-WIFI6-Touch-LCD-3.4C)
- [Official examples repo (waveshareteam/ESP32-P4-WIFI6-Touch-LCD-XC)](https://github.com/waveshareteam/ESP32-P4-WIFI6-Touch-LCD-XC)
- [BSP component: waveshare/esp32_p4_wifi6_touch_lcd_xc](https://components.espressif.com/components/waveshare/esp32_p4_wifi6_touch_lcd_xc)
- [Speaches — self-hosted OpenAI-compatible speech server](https://github.com/speaches-ai/speaches)
- Tatlock backend: `/mnt/media/Projects/tatlock` — https://tatlock.schweitz.net