Voice interface that connects a Reachy Mini robot to OpenClaw over WebSocket.
|
Quickstart
|
This project runs a conversation loop on a machine connected to Reachy Mini:
- capture microphone audio
- transcribe speech (Whisper, Faster-Whisper, or OpenAI)
- send text to OpenClaw Gateway
- receive AI response
- speak response and animate the robot
git clone https://github.com/ArturSkowronski/clawd-reachy-mini.git
cd clawd-reachy-mini
uv sync --extra dev --extra audio
uv run clawd-reachy --gateway-host 127.0.0.1Standalone mode (no gateway, echoes what it heard):
uv run clawd-reachy --standaloneRobot demo mode:
uv run clawd-reachy --demoMic/Reachy Media -> STT -> OpenClaw Gateway -> text response -> TTS + Reachy motion
Main modules:
src/clawd_reachy_mini/main.py: CLI entrypoint and runtime wiringsrc/clawd_reachy_mini/interface.py: conversation loop and robot behaviorsrc/clawd_reachy_mini/gateway.py: OpenClaw protocol + websocket clientsrc/clawd_reachy_mini/audio.py: utterance capture and silence detectionsrc/clawd_reachy_mini/stt.py: STT backend implementationsaction-skill/: OpenClaw skill package/tool wrappers
- Python 3.10+
- Reachy Mini SDK (
reachy-mini) ffmpeg(required for mp3->wav conversion before Reachy playback)- macOS
afplayis used as local playback fallback
uv syncDevelopment install:
uv sync --extra dev- local faster transcription:
uv sync --extra local-stt - OpenAI cloud transcription:
uv sync --extra cloud-stt - local mic deps:
uv sync --extra audio - Reachy vision extras:
uv sync --extra vision
cd action-skill
uv sync --extra devPublished package name for the skill is clawd-reachy-mini-skill.
uv run clawd-reachy --gateway-host <GATEWAY_IP>Example:
uv run clawd-reachy \
--gateway-host 192.168.1.100 \
--gateway-port 18789 \
--stt faster-whisper \
--whisper-model base \
--wake-word "hey reachy"--gateway-host: OpenClaw host (default:127.0.0.1)--gateway-port: OpenClaw port (default:18789)--gateway-token: bearer token for gateway auth--reachy-mode:auto|localhost_only|network--stt:whisper|faster-whisper|openai--whisper-model:tiny|base|small|medium|large--audio-device: input device name for local mic capture--wake-word: activate only after wake phrase is detected--no-emotions: disable emotion animations on errors/responses--no-idle: disable idle motion loop--standalone: run without gateway (local echo behavior)--demo: run a short direct robot movement demo and exit-v, --verbose: debug logs
OPENCLAW_HOST: default gateway host overrideOPENCLAW_PORT: default gateway port overrideOPENCLAW_TOKEN: default gateway tokenSTT_BACKEND: default STT backend (whisper,faster-whisper,openai)WHISPER_MODEL: default Whisper modelWAKE_WORD: default wake wordOPENCLAW_OPENAI_TOKENorOPENAI_API_KEY: used for--stt openai
ElevenLabs TTS:
REACHY_ELEVENLABS_API_KEYorELEVENLABS_API_KEY(required for speech)REACHY_ELEVENLABS_VOICE_IDorELEVENLABS_VOICE_ID(optional, default:JBFqnCBsd6RMkjVDRZzb)REACHY_ELEVENLABS_MODEL_IDorELEVENLABS_MODEL_ID(optional, default:eleven_multilingual_v2)REACHY_ELEVENLABS_OUTPUT_FORMATorELEVENLABS_OUTPUT_FORMAT(optional, default:mp3_44100_128)
The action skill provides tool wrappers for robot control:
- connect/disconnect
- head movement
- antenna movement
- emotions and dance
- image capture
- robot speech
- status checks
Skill docs: action-skill/SKILL.md.
- Gateway-originated
tool.requesthandling in the main app is currently a placeholder and returns an error fromsrc/clawd_reachy_mini/gateway.py. - Root CI currently runs lint for the main app and tests only for
action-skill/tests. - Local fallback playback uses
afplay(macOS-specific).
From repo root:
uv sync --extra dev
uv tool run ruff check .Action skill tests:
cd action-skill
uv sync --extra dev
uv run pytestGitHub Actions CI runs on Python 3.10 and 3.11.
