Example Claude Code project that uses ccv for realtime voice.
- Launch this directory with
npx -y --package github:AnEntrypoint/ccv ccv-claude. That wrapper starts Claude Code with--dangerously-load-development-channels server:ccv, which is what makes speech arrive on its own; plainclaudestill works, but the session has to callvoice_listento be woken by speech. Either way.mcp.jsonloads and startsnpx -y github:AnEntrypoint/ccv. - Optional: copy
.env.exampleto.envand setHF_TOKENfor faster model downloads. - Ask Claude to run
voice_setup, thenvoice_start, then open http://127.0.0.1:8800/ and click join. - For the chatjimmy scripts (
start.mjs,chatjimmy-bridge.mjs), runnpm installin this directory once.
Models and LiveKit install into .ccv/ in this directory (git-ignored).
Set DISCORD_TOKEN and DISCORD_CHANNEL (a voice channel URL or ID) in .env, then start Claude Code from this directory with claude --dangerously-load-development-channels server:discord. Claude Code launches the discord MCP server from .mcp.json, which joins the voice channel, transcribes speech with ccv's models, and delivers each utterance to the session. Replies go out with discord_speak. Without the flag, call discord_listen to wait for speech.
webrig-runner/ is the Discord-free counterpart of discord-runner/. Instead of joining a
Discord voice channel itself, it connects to a running WebRig
audio bridge over WebRig's audio WebSocket, so the WebRig instance keeps owning the page capture
and the voice connection.
- Start WebRig with its Discord bot configured (
DISCORD_BOT_TOKEN,GUILD_ID,CHANNEL_ID) and its audio WebSocket listening (WS_AUDIO_PORT, default 9888). The browser extensions are audio clients: in browser-extension mode the socket is served bynode companion/index.js(npm run companion), not by the extension itself. - Run
npm installinsidewebrig-runner/once, thennode webrig-runner/index.mjs(ornpm startthere). It loads the same ccv speech models, follows.webrig/heard.jsonl, and startschatjimmy-bridge.mjsagainst it. - Replies are synthesized with ccv's TTS and sent back to WebRig as stereo Float32 AUDIO frames; WebRig plays them into the voice channel.
Configuration is the WEBRIG_* block in .env.example. Set WEBRIG_BRIDGE=0 to run only the
audio bridge without the chatjimmy responder.