This project is a voice bridge:
- Watcher captures and plays audio
- Voice requests are routed to OpenClaw
- OpenClaw replies are repackaged into Watcher-ready binary output
In plain words: this is a voice entry point for OpenClaw.
It gives your lobster ears and a voice first.
Eyes can come next, because Watcher already has a camera.
Watcher -> watcher-OI -> OpenClaw(watcher) -> watcher-OI -> Watcher
- You speak to Watcher
- Watcher uploads audio to the bridge
- OpenClaw generates a reply
- Watcher plays speech and shows text
End-to-end loop: speak -> understand -> reply -> play.
Official getting started:
You need:
- Watcher is online
- Watcher can reach bridge host (for example
http://192.168.1.20:8000) - SenseCraft Private AI Service URL points to this bridge
Pitfalls:
- Point Private AI URL to
watcher-OI, not directly to OpenClaw - Use stable LAN IP/DNS instead of temporary hotspot addresses
Watcher support in OpenClaw is currently a development-stage integration. It has already been validated end to end with this bridge, but it is not yet published as an official installable plugin release.
This setup does not use stock OpenClaw. It relies on a modified OpenClaw branch with Watcher-related changes:
Enable watcher channel:
channels:
watcher:
enabled: true
webhookPath: /v2/watcher/talk/audio_stream
webhookToken: <shared-token>
bigmodelApiKey: <your-bigmodel-key>Pass criteria:
- OpenClaw logs show watcher webhook route registered
npm install
cp .env.example .envMinimum .env:
WATCHER_TARGET=http://<openclaw-host>:<gateway-port>
WATCHER_AUTH_TOKEN=<shared-token>Start:
npm run startPass criteria:
- Startup log includes
Server running on port 8000
If Watcher can already reach this bridge host directly, you can stop here.
frpc is only needed for public tunneling, port forwarding, or other relay
network setups.
Pitfall:
WATCHER_AUTH_TOKENmust match OpenClawwebhookToken
- Bridge process is alive (
404on/is expected):
curl -i http://127.0.0.1:8000/Pass criteria:
- Not a connection error (404 is acceptable)
- Bridge host can reach OpenClaw:
curl -i http://<openclaw-host>:<gateway-port>/healthPass criteria:
- 200 (or your environment's health status code)
- Send one real voice request from Watcher
Pass criteria:
- Bridge logs show
upstream status=... - Device receives voice playback and visible text
[k9a2nd] -> POST /v2/watcher/talk/audio_stream
[k9a2nd] -> upstream http://openclaw:3000/v2/watcher/talk/audio_stream
[k9a2nd] upstream status=200 bytes=48236
[k9a2nd] <- 200 POST /v2/watcher/talk/audio_stream duration=1520ms
OpenClaw watcher returns JSON (text + base64 audio).
Watcher devices prefer packed binary payloads (JSON + boundary + WAV).
This project translates between both sides so integration is simpler.
This README targets OpenClaw extensions/watcher responses with:
data.reply_textdata.reply_wav_base64- optional
data.stt_result
- Now: ears + voice
- Next: eyes (camera understanding flow)
401: shared token mismatch502: bridge cannot reach OpenClaw- text but no audio: check OpenClaw TTS config and bridge logs