Reachy Stage Chat

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:

  1. App on your computer (any mic the computer can see, including Bluetooth headsets). Launch with the launcher for your OS (below); the SDK finds the robot on the network and streams Reachy's voice to his speaker over WebRTC.
  2. Wireless robot + USB mic plugged into the robot (wired/USB mics only). The Wireless's USB-C is a host port: plug in a USB mic or a wireless mic's USB receiver dongle (USB-C→A adapter if needed), run the app from the dashboard as usual, and the mic appears in the device dropdown within a few seconds. Fully self-contained — no computer-side install.

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.

Features

Quick start (presenters)

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.

Configuration

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.

Install as a Reachy Mini app

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

Repo layout

GitHub → Hugging Face sync

The 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).

Known gotchas