{
  "schemaVersion": "1.0",
  "item": {
    "slug": "webchat-voice-proxy",
    "name": "WebChat Voice Proxy",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/neldar/webchat-voice-proxy",
    "canonicalUrl": "https://clawhub.ai/neldar/webchat-voice-proxy",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/webchat-voice-proxy",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=webchat-voice-proxy",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SECURITY-AUDIT.md",
      "SKILL.md",
      "assets/https-server.py",
      "assets/i18n.json",
      "assets/voice-input.js",
      "hooks/HOOK.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/webchat-voice-proxy"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/webchat-voice-proxy",
    "agentPageUrl": "https://openagent3.xyz/skills/webchat-voice-proxy/agent",
    "manifestUrl": "https://openagent3.xyz/skills/webchat-voice-proxy/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/webchat-voice-proxy/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "WebChat Voice Proxy",
        "body": "Set up a reboot-safe voice stack for OpenClaw WebChat (including the current polished mic/stop/hourglass UI states):\n\nHTTPS Control UI on port 8443\n/transcribe proxy to local faster-whisper service\nWebSocket passthrough to gateway (ws://127.0.0.1:18789)\nVoice button script injection into Control UI\nReal-time VU meter: button shadow/scale reacts to voice level\nPush-to-Talk: hold mic button to record, release to send (default mode)\nToggle mode: click to start, click to stop (switch via double-click on mic button)\nKeyboard shortcuts: Ctrl+Space Push-to-Talk, Ctrl+Shift+M start/stop continuous recording\nLocalized UI: auto-detects browser language (English, German, Chinese built-in), customizable"
      },
      {
        "title": "Prerequisites (required)",
        "body": "This skill requires a local faster-whisper HTTP service.\nExpected default:\n\nURL: http://127.0.0.1:18790/transcribe\nsystemd user service: openclaw-transcribe.service\n\nVerify before deployment:\n\nsystemctl --user is-active openclaw-transcribe.service\ncurl -s -o /dev/null -w '%{http_code}\\n' http://127.0.0.1:18790/transcribe -X POST -H 'Content-Type: application/octet-stream' --data-binary 'x'\n\nIf this dependency is missing, set up faster-whisper first (model load + HTTP endpoint), then run this skill.\n\nRelated skills:\n\nfaster-whisper-local-service (backend prerequisite)\nwebchat-voice-full-stack (meta-installer that deploys both backend + proxy)"
      },
      {
        "title": "Workflow",
        "body": "Ensure transcription service exists and is running (openclaw-transcribe.service).\nDeploy voice-input.js to Control UI assets and inject script tag into index.html.\nConfigure gateway allowed origin for external HTTPS UI.\nRun HTTPS+WSS proxy as persistent user systemd service (openclaw-voice-https.service).\nVerify pairing/token/origin errors and resolve in order."
      },
      {
        "title": "Security Notes",
        "body": "Localhost by default: The HTTPS proxy binds to 127.0.0.1 only. It is not reachable from other devices on your network unless you explicitly set VOICE_HOST to a LAN IP.\nLAN exposure: Setting VOICE_HOST=<LAN-IP> exposes the proxy (and by extension the gateway WebSocket and transcription endpoint) to all devices on that network. Only do this on trusted networks.\nPersistence: This skill installs a user systemd service (openclaw-voice-https.service) that starts automatically on boot, and a gateway hook that re-injects the UI script after updates. Use uninstall.sh to fully revert.\nSelf-signed TLS: The auto-generated certificate is not trusted by browsers. You will see a certificate warning on first access."
      },
      {
        "title": "Deploy",
        "body": "Run (localhost only — default, most secure):\n\nbash scripts/deploy.sh\n\nOr expose on LAN (required to access from other devices):\n\nVOICE_HOST=10.0.0.42 VOICE_HTTPS_PORT=8443 VOICE_LANG=de bash scripts/deploy.sh\n\nWhen run interactively without VOICE_LANG, the script will ask you to choose a UI language (auto, en, de, zh). Set VOICE_LANG=auto to skip the prompt.\n\nThis script is idempotent."
      },
      {
        "title": "Quick verify",
        "body": "Run:\n\nbash scripts/status.sh\n\nExpected:\n\nboth services active\ninjection present\nhttps:200"
      },
      {
        "title": "Common fixes",
        "body": "404 /chat?... → SPA fallback missing in HTTPS proxy.\norigin not allowed → ensure deploy used correct VOICE_HOST and added matching HTTPS origin to gateway.controlUi.allowedOrigins.\ntoken missing → open URL with ?token=... once.\npairing required → approve pending device via openclaw devices approve <requestId> --token <gateway-token>.\nMic breaks after reboot → cert paths must be persistent (not /tmp).\nNo transcription result → check local faster-whisper endpoint first.\n\nSee references/troubleshooting.md for exact commands."
      },
      {
        "title": "What this skill modifies",
        "body": "Before installing, be aware of all system changes deploy.sh makes:\n\nWhatPathActionControl UI HTML<npm-global>/openclaw/dist/control-ui/index.htmlAdds <script> tag for voice-input.jsControl UI asset<npm-global>/openclaw/dist/control-ui/assets/voice-input.jsCopies mic button JSGateway config~/.openclaw/openclaw.jsonAdds HTTPS origin to gateway.controlUi.allowedOriginsSystemd service~/.config/systemd/user/openclaw-voice-https.serviceCreates + enables persistent HTTPS proxyGateway hook~/.openclaw/hooks/voice-input-inject/Installs startup hook that re-injects JS after updatesWorkspace files~/.openclaw/workspace/voice-input/Copies voice-input.js, https-server.pyTLS certs~/.openclaw/workspace/voice-input/certs/Auto-generated self-signed cert on first run\n\nThe injected JS (voice-input.js) runs inside the Control UI and interacts with the chat input. Review the source before deploying."
      },
      {
        "title": "Mic Button Controls",
        "body": "ActionEffectHold (PTT mode)Record while held, transcribe on releaseClick (Toggle mode)Start recording / stop and transcribeDouble-clickSwitch between PTT and Toggle modeRight-clickToggle beep sound on/offCtrl+Space (hold)Push-to-Talk via keyboard (works even with text field focused)Ctrl+Shift+MStart/stop recording (transcribes on stop)Ctrl+Shift+BStart/stop live transcription [beta] — text appears in real-time, auto-sends after 2s review, stops on 5s silence or \"Stop Hugo\" keyword\n\nThe current mode and available actions are shown in the button tooltip on hover."
      },
      {
        "title": "Language / i18n",
        "body": "The UI automatically detects the browser language and shows tooltips, toasts, and placeholder text in the matching language.\n\nBuilt-in languages: English (en), German (de), Chinese (zh)"
      },
      {
        "title": "Override language",
        "body": "Set a language override in the browser console:\n\nlocalStorage.setItem('oc-voice-lang', 'de');  // force German\nlocalStorage.setItem('oc-voice-lang', 'zh');  // force Chinese\nlocalStorage.removeItem('oc-voice-lang');      // back to auto-detect\n\nThen reload the page."
      },
      {
        "title": "Add a custom language",
        "body": "Edit voice-input.js and add a new entry to the I18N object. Use assets/i18n.json as a template — it contains all translation keys with the built-in translations.\n\nExample for adding French:\n\nconst I18N = {\n  // ... existing entries ...\n  fr: {\n    tooltip_ptt: \"Maintenir pour parler\",\n    tooltip_toggle: \"Cliquer pour démarrer/arrêter\",\n    tooltip_next_toggle: \"Mode clic\",\n    tooltip_next_ptt: \"Push-to-Talk\",\n    tooltip_beep_off: \"Désactiver le bip\",\n    tooltip_beep_on: \"Activer le bip\",\n    tooltip_dblclick: \"Double-clic\",\n    tooltip_rightclick: \"Clic droit\",\n    toast_ptt: \"Push-to-Talk\",\n    toast_toggle: \"Mode clic\",\n    toast_beep_on: \"Bip activé\",\n    toast_beep_off: \"Bip désactivé\",\n    placeholder_suffix: \" — Voix : (Ctrl+Espace Push-To-Talk, Ctrl+Shift+M enregistrement continu)\"\n  }\n};\n\nAfter editing, redeploy with bash scripts/deploy.sh to copy the updated JS to the Control UI."
      },
      {
        "title": "CORS Policy",
        "body": "The /transcribe proxy endpoint uses a configurable Access-Control-Allow-Origin header.\nSet VOICE_ALLOWED_ORIGIN env var to restrict. Default: https://<VOICE_HOST>:<VOICE_HTTPS_PORT>."
      },
      {
        "title": "Uninstall",
        "body": "To fully revert all changes:\n\nbash scripts/uninstall.sh\n\nThis will:\n\nStop and remove openclaw-voice-https.service\nRemove the gateway startup hook\nRemove voice-input.js from Control UI and undo the index.html injection\nRemove the HTTPS origin from gateway config\nRestart the gateway\nRemove TLS certificates\nRemove workspace runtime files (voice-input.js, https-server.py, i18n.json)\n\nThe faster-whisper backend is not touched by uninstall — remove it separately via faster-whisper-local-service if needed."
      }
    ],
    "body": "WebChat Voice Proxy\n\nSet up a reboot-safe voice stack for OpenClaw WebChat (including the current polished mic/stop/hourglass UI states):\n\nHTTPS Control UI on port 8443\n/transcribe proxy to local faster-whisper service\nWebSocket passthrough to gateway (ws://127.0.0.1:18789)\nVoice button script injection into Control UI\nReal-time VU meter: button shadow/scale reacts to voice level\nPush-to-Talk: hold mic button to record, release to send (default mode)\nToggle mode: click to start, click to stop (switch via double-click on mic button)\nKeyboard shortcuts: Ctrl+Space Push-to-Talk, Ctrl+Shift+M start/stop continuous recording\nLocalized UI: auto-detects browser language (English, German, Chinese built-in), customizable\nPrerequisites (required)\n\nThis skill requires a local faster-whisper HTTP service. Expected default:\n\nURL: http://127.0.0.1:18790/transcribe\nsystemd user service: openclaw-transcribe.service\n\nVerify before deployment:\n\nsystemctl --user is-active openclaw-transcribe.service\ncurl -s -o /dev/null -w '%{http_code}\\n' http://127.0.0.1:18790/transcribe -X POST -H 'Content-Type: application/octet-stream' --data-binary 'x'\n\n\nIf this dependency is missing, set up faster-whisper first (model load + HTTP endpoint), then run this skill.\n\nRelated skills:\n\nfaster-whisper-local-service (backend prerequisite)\nwebchat-voice-full-stack (meta-installer that deploys both backend + proxy)\nWorkflow\nEnsure transcription service exists and is running (openclaw-transcribe.service).\nDeploy voice-input.js to Control UI assets and inject script tag into index.html.\nConfigure gateway allowed origin for external HTTPS UI.\nRun HTTPS+WSS proxy as persistent user systemd service (openclaw-voice-https.service).\nVerify pairing/token/origin errors and resolve in order.\nSecurity Notes\nLocalhost by default: The HTTPS proxy binds to 127.0.0.1 only. It is not reachable from other devices on your network unless you explicitly set VOICE_HOST to a LAN IP.\nLAN exposure: Setting VOICE_HOST=<LAN-IP> exposes the proxy (and by extension the gateway WebSocket and transcription endpoint) to all devices on that network. Only do this on trusted networks.\nPersistence: This skill installs a user systemd service (openclaw-voice-https.service) that starts automatically on boot, and a gateway hook that re-injects the UI script after updates. Use uninstall.sh to fully revert.\nSelf-signed TLS: The auto-generated certificate is not trusted by browsers. You will see a certificate warning on first access.\nDeploy\n\nRun (localhost only — default, most secure):\n\nbash scripts/deploy.sh\n\n\nOr expose on LAN (required to access from other devices):\n\nVOICE_HOST=10.0.0.42 VOICE_HTTPS_PORT=8443 VOICE_LANG=de bash scripts/deploy.sh\n\n\nWhen run interactively without VOICE_LANG, the script will ask you to choose a UI language (auto, en, de, zh). Set VOICE_LANG=auto to skip the prompt.\n\nThis script is idempotent.\n\nQuick verify\n\nRun:\n\nbash scripts/status.sh\n\n\nExpected:\n\nboth services active\ninjection present\nhttps:200\nCommon fixes\n404 /chat?... → SPA fallback missing in HTTPS proxy.\norigin not allowed → ensure deploy used correct VOICE_HOST and added matching HTTPS origin to gateway.controlUi.allowedOrigins.\ntoken missing → open URL with ?token=... once.\npairing required → approve pending device via openclaw devices approve <requestId> --token <gateway-token>.\nMic breaks after reboot → cert paths must be persistent (not /tmp).\nNo transcription result → check local faster-whisper endpoint first.\n\nSee references/troubleshooting.md for exact commands.\n\nWhat this skill modifies\n\nBefore installing, be aware of all system changes deploy.sh makes:\n\nWhat\tPath\tAction\nControl UI HTML\t<npm-global>/openclaw/dist/control-ui/index.html\tAdds <script> tag for voice-input.js\nControl UI asset\t<npm-global>/openclaw/dist/control-ui/assets/voice-input.js\tCopies mic button JS\nGateway config\t~/.openclaw/openclaw.json\tAdds HTTPS origin to gateway.controlUi.allowedOrigins\nSystemd service\t~/.config/systemd/user/openclaw-voice-https.service\tCreates + enables persistent HTTPS proxy\nGateway hook\t~/.openclaw/hooks/voice-input-inject/\tInstalls startup hook that re-injects JS after updates\nWorkspace files\t~/.openclaw/workspace/voice-input/\tCopies voice-input.js, https-server.py\nTLS certs\t~/.openclaw/workspace/voice-input/certs/\tAuto-generated self-signed cert on first run\n\nThe injected JS (voice-input.js) runs inside the Control UI and interacts with the chat input. Review the source before deploying.\n\nMic Button Controls\nAction\tEffect\nHold (PTT mode)\tRecord while held, transcribe on release\nClick (Toggle mode)\tStart recording / stop and transcribe\nDouble-click\tSwitch between PTT and Toggle mode\nRight-click\tToggle beep sound on/off\nCtrl+Space (hold)\tPush-to-Talk via keyboard (works even with text field focused)\nCtrl+Shift+M\tStart/stop recording (transcribes on stop)\nCtrl+Shift+B\tStart/stop live transcription [beta] — text appears in real-time, auto-sends after 2s review, stops on 5s silence or \"Stop Hugo\" keyword\n\nThe current mode and available actions are shown in the button tooltip on hover.\n\nLanguage / i18n\n\nThe UI automatically detects the browser language and shows tooltips, toasts, and placeholder text in the matching language.\n\nBuilt-in languages: English (en), German (de), Chinese (zh)\n\nOverride language\n\nSet a language override in the browser console:\n\nlocalStorage.setItem('oc-voice-lang', 'de');  // force German\nlocalStorage.setItem('oc-voice-lang', 'zh');  // force Chinese\nlocalStorage.removeItem('oc-voice-lang');      // back to auto-detect\n\n\nThen reload the page.\n\nAdd a custom language\n\nEdit voice-input.js and add a new entry to the I18N object. Use assets/i18n.json as a template — it contains all translation keys with the built-in translations.\n\nExample for adding French:\n\nconst I18N = {\n  // ... existing entries ...\n  fr: {\n    tooltip_ptt: \"Maintenir pour parler\",\n    tooltip_toggle: \"Cliquer pour démarrer/arrêter\",\n    tooltip_next_toggle: \"Mode clic\",\n    tooltip_next_ptt: \"Push-to-Talk\",\n    tooltip_beep_off: \"Désactiver le bip\",\n    tooltip_beep_on: \"Activer le bip\",\n    tooltip_dblclick: \"Double-clic\",\n    tooltip_rightclick: \"Clic droit\",\n    toast_ptt: \"Push-to-Talk\",\n    toast_toggle: \"Mode clic\",\n    toast_beep_on: \"Bip activé\",\n    toast_beep_off: \"Bip désactivé\",\n    placeholder_suffix: \" — Voix : (Ctrl+Espace Push-To-Talk, Ctrl+Shift+M enregistrement continu)\"\n  }\n};\n\n\nAfter editing, redeploy with bash scripts/deploy.sh to copy the updated JS to the Control UI.\n\nCORS Policy\n\nThe /transcribe proxy endpoint uses a configurable Access-Control-Allow-Origin header. Set VOICE_ALLOWED_ORIGIN env var to restrict. Default: https://<VOICE_HOST>:<VOICE_HTTPS_PORT>.\n\nUninstall\n\nTo fully revert all changes:\n\nbash scripts/uninstall.sh\n\n\nThis will:\n\nStop and remove openclaw-voice-https.service\nRemove the gateway startup hook\nRemove voice-input.js from Control UI and undo the index.html injection\nRemove the HTTPS origin from gateway config\nRestart the gateway\nRemove TLS certificates\nRemove workspace runtime files (voice-input.js, https-server.py, i18n.json)\n\nThe faster-whisper backend is not touched by uninstall — remove it separately via faster-whisper-local-service if needed."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/neldar/webchat-voice-proxy",
    "publisherUrl": "https://clawhub.ai/neldar/webchat-voice-proxy",
    "owner": "neldar",
    "version": "0.2.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/webchat-voice-proxy",
    "downloadUrl": "https://openagent3.xyz/downloads/webchat-voice-proxy",
    "agentUrl": "https://openagent3.xyz/skills/webchat-voice-proxy/agent",
    "manifestUrl": "https://openagent3.xyz/skills/webchat-voice-proxy/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/webchat-voice-proxy/agent.md"
  }
}