Spaces:
Running
Running
File size: 5,016 Bytes
834e04c 611ac6f 834e04c 611ac6f 834e04c 611ac6f 834e04c 611ac6f 834e04c 611ac6f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | ---
title: Tater Voice Sat
emoji: 🥔
colorFrom: red
colorTo: gray
sdk: static
pinned: false
short_description: Voice satellite for Tater and Home Assistant.
tags:
- reachy_mini
- reachy_mini_python_app
- Voice-Assistant
- Ai
- Ai-Assistant
- Conversational-Ai
- Tater
- voice-assistant
- home-assistant
---
# Tater Voice Sat
Reachy Mini as a Tater and Home Assistant voice satellite with movement.
This project treats Reachy Mini Wireless as a Linux-based satellite powered by
OHF's `linux-voice-assistant` (LVA). LVA handles the ESPHome-style voice
protocol used by Tater/Home Assistant satellites, local wake words, and the
voice state machine. Audio flows through the Reachy Mini SDK media APIs. This
bridge adds Reachy movement around those voice states.
Until we have hardware, the movement layer can target the official Reachy Mini
MuJoCo simulation.
## Shape
```text
Reachy mic array
-> LVA local microWakeWord on the Reachy Pi
-> LVA ESPHome voice protocol session to Tater
-> Tater native voice pipeline
-> LVA TTS playback URL/audio back to Reachy
-> Reachy speaker plus Tater motion renderer
```
The important idea: Reachy is not a separate assistant. It is another Tater
satellite, with a richer renderer than LEDs.
## First Milestone
- Run on Reachy Mini Wireless Pi, or the Reachy Mini simulator with SDK media.
- Run LVA with a microWakeWord model for "Hey Tater".
- Expose LVA's ESPHome-compatible voice satellite endpoint.
- Connect to Tater's existing Voice Core ESPHome path.
- Map voice pipeline events to Reachy motion states.
- Play Tater TTS replies through Reachy's speaker.
- Simulate Reachy motion locally with `reachy-mini-daemon --sim`.
## Later Milestones
- Reachy-specific side channel for rich motion commands.
- Tater UI card with Reachy status, motion intensity, idle animation, and room.
- Camera snapshots as Tater vision context.
- Camera stream/object awareness.
- Hydra tools like `reachy_emote`, `reachy_look_at`, and `reachy_capture_frame`.
## Project Layout
```text
tater_voice_sat/
bridge.py Main orchestration loop sketch.
config.py Typed config loader.
lva_adapter.py LVA runner plus motion-aware protocol hook.
motion.py Voice-state to movement renderer.
reachy_client.py Reachy SDK wrapper.
sdk_app.py Reachy SDK app entrypoint and settings API.
static/ Wake-word picker UI for the SDK app.
wakeword_catalog.py microWakeWord catalog/install helper.
docs/
architecture.md
implementation-plan.md
motion-states.md
simulation.md
sounds/
wake_word_triggered.wav
wakewords/
hey_tater.json
hey_tater.tflite
stop.json
stop.tflite
config.example.toml
```
## Current Behavior
Running `tater-voice-sat --config config.toml` starts LVA in-process, patches
LVA's `VoiceSatelliteProtocol` with Reachy motion hooks, and then lets LVA do
the real satellite work. The bridge adapts LVA's microphone and playback calls
to Reachy SDK media. Reachy motion currently dry-runs when the Reachy SDK is
not installed.
The SDK app entrypoint, `tater-voice-sat-app`, starts the same bridge inside
`ReachyMiniApp` and exposes a tiny settings page for choosing a microWakeWord
from the shared Tater manifest.
## Install Sketch
```bash
python3 -m venv .venv
. .venv/bin/activate
pip install -e .
cp config.example.toml config.toml
tater-voice-sat --config config.toml
```
Runtime paths in `config.toml` are resolved relative to the config file. The
`wakewords/` folder holds the local microWakeWord models LVA loads, and
`sounds/` holds the small playback cues LVA uses for wake, timer, processing,
mute, and unmute events.
For simulation:
```bash
pip install -e ".[simulation]"
reachy-mini-daemon --sim
tater-voice-sat --config config.toml
```
On macOS, use `mjpython -m reachy_mini.daemon.app.main --sim` for the simulator
and set `[reachy].media_backend = "local"` or `"default"` so the SDK exposes
mic/speaker streams.
To test just the Reachy SDK microphone and wake model without ESPHome or Reachy
motion:
```bash
python -m tater_voice_sat.wake_monitor --config config.toml
```
For the Reachy SDK app/settings flow:
```bash
tater-voice-sat-app --config config.toml
```
Open the app settings page from the Reachy dashboard to choose a wake word.
To test Reachy movement without the voice pipeline:
```bash
tater-voice-sat --config config.toml --motion-test
tater-voice-sat --config config.toml --motion-test obvious
tater-voice-sat --config config.toml --motion-test wake
tater-voice-sat --config config.toml --motion-test speaking --motion-intensity 1.0
```
## Watchful Idle
The optional `[watch]` config watches camera frames while Reachy is idle. When
motion is detected, Reachy turns toward the movement and holds a quiet watching
pose. After a short quiet period, it returns to the normal idle animation.
This is enabled by default and uses lightweight frame-difference motion
tracking with smoothed target updates; person/face detection can layer on later.
|