ReachTether is a .NET codebase for building voice-first Reachy Mini robot applications.
dotNet/ReachTether.Robot: main robot runtime (hosted services, VAD, OpenAI conversation, speech playback, motion orchestration)dotNet/ReachTether.Audio: audio primitives (frames, format helpers, WAV conversion)dotNet/ReachTether.Audio.Alsa: local ALSA audio session and capture/playback device integrationdotNet/ReachTether.WebRtc: WebRTC session and signaling utilitiesdotNet/ReachyMini.Sdk: typed Reachy Mini SDK client librarydotNet/ReachTether.slnx: solution file for the active projects aboveDocs/: architecture notes, deployment notes, and design research
ReachTether.Robot is a long-running host process that:
- Connects to Reachy Mini over HTTP (
ReachyMini:BaseUrl). - Connects to local audio devices via ALSA.
- Captures speech input with VAD.
- Sends transcription/chat/speech requests to OpenAI.
- Streams/plays audio responses.
- Applies motion and talking gestures while interacting.
Voice pipeline mode is controlled by OpenAI:VoicePipeline:
auto: choose realtime for realtime-style models, otherwise legacy turn-based flow.realtime: force realtime pipeline.legacy: force turn-based STT -> chat -> TTS pipeline.
- .NET SDK 9.0+ (main projects target
net9.0) - Network access to Reachy Mini daemon endpoint (for example
http://reachy-mini.local:8000) - OpenAI API key exposed as
OPENAI_API_KEY - Linux environment with ALSA devices for robot audio runtime
Notes:
ReachyMini.Sdkmulti-targetsnet8.0,net9.0, andnet10.0.OPENAI_API_KEYis read from environment or.env; it is not read fromappsettings*.json.
From repository root:
dotnet restore dotNet/ReachTether.slnx
dotnet build dotNet/ReachTether.slnx -c ReleaseFrom repository root:
- Create
dotNet/ReachTether.Robot/.env:
OPENAI_API_KEY=your_openai_api_key_here- (Optional but recommended) Create
dotNet/ReachTether.Robot/appsettings.local.jsonfor local overrides:
{
"ReachyMini": {
"BaseUrl": "http://reachy-mini.local:8000"
},
"Audio": {
"CaptureDevice": "reachymini_audio_src",
"PlaybackDevice": "reachymini_audio_sink",
"Channels": 2
},
"OpenAI": {
"VoicePipeline": "auto",
"ChatModel": "gpt-realtime-mini",
"TranscriptionModel": "gpt-4o-mini-transcribe",
"SpeechModel": "gpt-4o-mini-tts",
"SpeechVoice": "alloy",
"TranscriptionLanguage": "en",
"Realtime": {
"Model": "gpt-realtime-mini",
"ResponseTimeoutMs": 45000,
"OutputSampleRateHz": 24000
}
}
}- Run:
dotnet run --project dotNet/ReachTether.Robot/ReachTether.Robot.csprojPrimary keys consumed by ReachTether.Robot:
| Key | Purpose |
|---|---|
ReachyMini:BaseUrl |
Reachy daemon base URL |
Audio:CaptureDevice |
ALSA capture device name |
Audio:PlaybackDevice |
ALSA playback device name |
Audio:Channels |
Audio channel count (1 or 2) |
OpenAI:VoicePipeline |
auto, realtime, or legacy |
OpenAI:ChatModel |
Chat/realtime selection model |
OpenAI:TranscriptionModel |
STT model for legacy pipeline |
OpenAI:SpeechModel |
TTS model |
OpenAI:SpeechVoice |
Voice (alloy, echo, fable, onyx, nova, shimmer) |
OpenAI:TranscriptionLanguage |
STT language hint |
OpenAI:Realtime:* |
Realtime model and timeout/sample-rate controls |
VAD:* |
Voice activity detection thresholds/timing |
Motion:* |
Gesture loop behavior and safety limits |
Personality:CatalogPath |
Personality JSON catalog path |
Personality:Default |
Default personality id |
From repository root:
dotnet publish dotNet/ReachTether.Robot/ReachTether.Robot.csproj \
-c Release -r linux-arm64 --self-contained false \
-o out/reachrobotCopy artifacts to robot:
scp -r out/reachrobot/. pollen@reachy-mini.local:/home/pollen/reachrobot/Run on robot:
ssh pollen@reachy-mini.local
cd /home/pollen/reachrobot
dotnet ReachTether.Robot.dllOPENAI_API_KEY not found: ensure.envexists in working directory or set env var before launch.- Reachy connection failure: verify
ReachyMini:BaseUrland that daemon is reachable. - ALSA device errors: confirm capture/playback device names on target host.
- Unexpected pipeline mode: set
OpenAI:VoicePipelineexplicitly torealtimeorlegacy.
Docs/ReachTether-on-reachy-mini.mdDocs/reachtether-evolution-findings.mdDocs/architectural-findings-and-roadmap.mdDocs/realtime-immediate-playback-sketch.mdDocs/deploying.md(contains older notes; prefer commands in this README for current runtime)