A Reachy Mini chat app built for live stage demos. Audio input comes from an external microphone paired to the host computer (Bluetooth mic/headset, or wireless lav/handheld with a USB receiver dongle) instead of the robot's onboard mic array, which picks up crowd noise and PA bleed on stage. Audio output still plays through Reachy Mini's speaker, so the robot appears to talk on stage.
Two supported setups:
What does not work: the app running on-board with no USB mic attached (it
can then only see the robot's own mic, reachymini_audio_src — the settings
page warns about this), and Bluetooth headphones paired to the robot (the
robot has no Bluetooth audio stack; its Bluetooth is a setup/provisioning
channel only).
| OS | Launcher | One-time prerequisite |
|---|---|---|
| macOS | launch_stage_chat.command (double-click) |
— |
| Windows | launch_stage_chat.bat (double-click) |
Python 3.10+, GStreamer (MSVC 64-bit "Complete") — see comments in the .bat |
| Linux | launch_stage_chat.sh |
GStreamer + PyGObject distro packages — see comments in the .sh |
Pipeline: external mic → sounddevice capture → OpenAI Realtime API
(gpt-realtime-2, speech-to-speech) → resample → Reachy Mini speaker via the
SDK (push_audio_sample()). Turn detection is done locally (VAD + gating +
push-to-talk), not by the API — the app decides when a turn starts and ends.
The SDK handles output only. Input is captured directly from the chosen macOS device — the robot's mics are never opened.
MIC_DEVICE env var
/ config file for scripted launches. Devices are matched by name substring
(device indices shift when devices connect/disconnect). The last-used device
is persisted.OPENAI_API_KEY env var still works
as a fallback.See docs/RUN_SHEET.md for the one-page run sheet.
Short version: pair the mic → open the Reachy Mini desktop app → launch
Reachy Stage Chat (or double-click launch_stage_chat.command) → open the
app's settings page → pick your mic and check the level meter is green → go.
| Setting | How |
|---|---|
| OpenAI API key | Web UI (persisted), or OPENAI_API_KEY env var / .env file next to the launcher — never committed |
| Microphone | Web UI dropdown, or MIC_DEVICE env var (name substring preferred, index accepted) |
| Speaker volume | Web UI slider 0–200% (default 200%), or VOLUME env var (e.g. VOLUME=1.5) |
| Opening line / system prompt | Web UI (with "Save for next launch"), or OPENING_LINE / SYSTEM_PROMPT env vars |
| Push-to-talk | Web UI toggle, or PUSH_TO_TALK=1 env var |
| Model / voice | Web UI dropdowns (persisted; defaults gpt-realtime-2 + cedar), or REALTIME_MODEL / TTS_VOICE env vars |
Settings chosen in the web UI are persisted to the platform user config directory and restored on the next launch. Env vars override persisted config for that session.
The app follows the Reachy Mini app format: a Python package exposing a
ReachyMiniApp subclass through the reachy_mini_apps entry-point group. Once
the Hugging Face Space mirror is tagged reachy_mini, it is discoverable and
installable from the Reachy Mini desktop app dashboard.
Manual install for development:
pip install -e .
python -m reachy_stage_chat.main
reachy_stage_chat/ — the app packagemain.py — ReachyMiniApp subclass, FastAPI settings endpoints, main loopaudio_input.py — sounddevice capture, device matching, VAD, gating, fallbackrealtime_pipeline.py — OpenAI Realtime API session (gpt-realtime-2)speech_output.py — resampling, volume, robot speaker playbacksettings.py — env/config-file settings with persistencestatic/ — settings web UI (device dropdown, level meter, push-to-talk)launch_stage_chat.command — double-clickable macOS launcher for mentorsdocs/RUN_SHEET.md — one-page presenter run sheet.github/workflows/sync-to-hf.yml — mirrors main to the Hugging Face SpaceThe GitHub repo is the source of truth; the HF Space mirrors it. Every push to
main force-pushes to the Space via .github/workflows/sync-to-hf.yml. It
requires an HF_TOKEN repository secret (write-scoped Hugging Face token).
launch_stage_chat.command (or python -m reachy_stage_chat.main) on the
computer, with the robot reachable on the network. On a Wireless robot,
installing from the dashboard runs the app on-board the Pi: the device
dropdown then only shows reachymini_audio_src (the robot's own mic), and
mics paired to your computer can never appear. The settings page warns when
it detects this.