WebChat Voice GUI
by @neldar
Voice input and microphone button for OpenClaw WebChat Control UI. Adds a mic button to chat, records audio via browser MediaRecorder, transcribes locally vi...
clawhub install webchat-voice-guiπ About This Skill
name: webchat-voice-gui description: > Voice input and microphone button for OpenClaw WebChat Control UI. Adds a mic button to chat, records audio via browser MediaRecorder, transcribes locally via faster-whisper, and injects text into the conversation. Includes gateway hook for update safety. Real-time VU meter shows voice activity. Push-to-Talk (hold to speak) and Toggle mode (click start/stop), switchable via double-click. Keyboard shortcuts: Ctrl+Space PTT, Ctrl+Shift+M continuous recording, Ctrl+Shift+B live transcription [beta]. Localized UI (English, German, Chinese built-in, extensible). Fully local speech-to-text, no API costs. Keywords: voice input, microphone, WebChat, Control UI, speech to text, STT, local transcription, MediaRecorder, voice button, mic button, push-to-talk, PTT, keyboard shortcut, i18n, localization. requires: skills: - webchat-https-proxy (HTTPS/WSS reverse proxy β must be deployed first) - faster-whisper-local-service (local STT backend on port 18790) modified_paths: -
WebChat Voice GUI
Voice input GUI for OpenClaw WebChat Control UI:
Ctrl+Space Push-to-Talk, Ctrl+Shift+M start/stop continuous recording, Ctrl+Shift+B live transcription [beta]openclaw updatePrerequisites
1. webchat-https-proxy β HTTPS/WSS reverse proxy must be deployed and running.
2. faster-whisper-local-service β Local STT backend on port 18790.
Verify:
systemctl --user is-active openclaw-voice-https.service
systemctl --user is-active openclaw-transcribe.service
Deploy
bash scripts/deploy.sh
With language override:
VOICE_LANG=de bash scripts/deploy.sh
When run interactively without VOICE_LANG, the script will ask you to choose a UI language.
This script is idempotent.
Quick verify
bash scripts/status.sh
Security Notes
Client-side JS (voice-input.js)
eval(), new Function(), or innerHTML with user data./transcribe when served over HTTPS. Only falls back to http://127.0.0.1:18790 in local dev./transcribe is accepted via same-origin browser requests; Bearer auth remains optional fallback at the proxy.textContent for all toast messages (no XSS vector).Deployment scripts
VOICE_LANG must match ^([a-zA-Z]{2,5}(-[a-zA-Z]{2,5})?|auto)$ β prevents injection via sed.execFileSync with array args β no shell interpolation. Script path derived from __dirname, not user input.No data exfiltration
What this skill modifies
| What | Path | Action |
|---|---|---|
| Control UI HTML | | Adds tag for voice-input.js |
| Control UI asset | | Copies mic button JS |
| Gateway hook | ~/.openclaw/hooks/voice-input-inject/ | Installs startup hook that re-injects JS after updates |
| Workspace files | ~/.openclaw/workspace/voice-input/ | Copies voice-input.js, i18n.json |
Mic Button Controls
| Action | Effect | |---|---| | Hold (PTT mode) | Record while held, transcribe on release | | Click (Toggle mode) | Start recording / stop and transcribe | | Double-click | Switch between PTT and Toggle mode | | Right-click | Toggle beep sound on/off | | Ctrl+Space (hold) | Push-to-Talk via keyboard | | Ctrl+Shift+M | Start/stop recording | | Ctrl+Shift+B | Start/stop live transcription [beta] |
Language / i18n
Auto-detects browser language. Built-in: English (en), German (de), Chinese (zh).
Override in browser console:
localStorage.setItem('oc-voice-lang', 'de'); // force German
localStorage.removeItem('oc-voice-lang'); // back to auto-detect
See assets/i18n.json for all translation keys.
Uninstall
bash scripts/uninstall.sh
This removes the UI injection, hook, and workspace files. Does not touch the HTTPS proxy or faster-whisper backend β uninstall those separately.
βοΈ Configuration
1. webchat-https-proxy β HTTPS/WSS reverse proxy must be deployed and running.
2. faster-whisper-local-service β Local STT backend on port 18790.
Verify:
systemctl --user is-active openclaw-voice-https.service
systemctl --user is-active openclaw-transcribe.service