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.