{"_id":"@aayushdebugging/claude-voice","_rev":"6-4075687c1be802b5b784db0cd93046ba","name":"@aayushdebugging/claude-voice","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"name":"@aayushdebugging/claude-voice","version":"0.1.0","keywords":["claude","claude-code","voice","speech-to-text","text-to-speech","stt","tts","whisper","groq","elevenlabs","cli","ai","assistant","voice-assistant"],"author":{"name":"claude-voice contributors"},"license":"MIT","_id":"@aayushdebugging/claude-voice@0.1.0","maintainers":[{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"}],"homepage":"https://github.com/claude-voice/claude-voice#readme","bugs":{"url":"https://github.com/claude-voice/claude-voice/issues"},"bin":{"claude-voice":"dist/cli/index.js"},"dist":{"shasum":"2aa54e896ed58f0ebcda84650cdf014096b42bbc","tarball":"https://registry.npmjs.org/@aayushdebugging/claude-voice/-/claude-voice-0.1.0.tgz","fileCount":283,"integrity":"sha512-+eQSMJqagcuqFByOQUYrZJZMszGm9nafs+yoBHXS7sM0hR+FMwbUKGn5sBYpHJMUoiShUsl/6A3IAhTkgrPNlA==","signatures":[{"sig":"MEUCIAuXlY+zm1VAIr+JwKXkH0zhlrqDMIjJKaVWe799PPngAiEAm5KbxQ+CLFNyFEWlf3tpDosRgvgaDWof+Rs3e1Kxjns=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":564130},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c62ee4c003133d0dc483da51e1294831ef5983e6","scripts":{"dev":"tsx src/cli/index.ts","lint":"eslint . --max-warnings 0","test":"vitest run","build":"tsc -p tsconfig.build.json && chmod +x dist/cli/index.js","clean":"rimraf dist coverage","start":"node dist/cli/index.js","format":"prettier --write \"**/*.{ts,js,json}\"","prepare":"husky || true","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"**/*.{ts,js,json}\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"},"repository":{"url":"git+https://github.com/claude-voice/claude-voice.git","type":"git"},"_npmVersion":"11.8.0","description":"Real-time voice conversations for the Claude CLI — talk to Claude naturally from your terminal.","directories":{},"lint-staged":{"*.json":["prettier --write"],"*.{ts,js}":["eslint --fix","prettier --write"]},"_nodeVersion":"25.5.0","dependencies":{"ws":"^8.21.0","ink":"^5.1.0","ora":"^8.1.0","chalk":"^5.3.0","react":"^18.3.1","commander":"^12.1.0","selfsigned":"^2.4.1","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","husky":"^9.1.6","eslint":"^9.11.0","rimraf":"^6.0.1","vitest":"^2.1.2","globals":"^15.15.0","prettier":"^3.3.3","@types/ws":"^8.18.1","@eslint/js":"^9.11.0","typescript":"^5.6.2","@types/node":"^20.14.0","lint-staged":"^15.2.10","@types/react":"^18.3.12","@vitest/coverage-v8":"^2.1.2","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.8.0","@typescript-eslint/eslint-plugin":"^8.8.0"},"optionalDependencies":{"speaker":"^0.5.5","node-record-lpcm16":"^1.0.1"},"_npmOperationalInternal":{"tmp":"tmp/claude-voice_0.1.0_1783711453834_0.6606045672303329","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aayushdebugging/claude-voice","version":"0.1.1","keywords":["claude","claude-code","voice","speech-to-text","text-to-speech","stt","tts","whisper","groq","elevenlabs","cli","ai","assistant","voice-assistant"],"author":{"name":"claude-voice contributors"},"license":"MIT","_id":"@aayushdebugging/claude-voice@0.1.1","maintainers":[{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"}],"homepage":"https://github.com/claude-voice/claude-voice#readme","bugs":{"url":"https://github.com/claude-voice/claude-voice/issues"},"bin":{"claude-voice":"dist/cli/index.js"},"dist":{"shasum":"e92f9c92cb75ac12dbbf563eeaea0bab0440ff3d","tarball":"https://registry.npmjs.org/@aayushdebugging/claude-voice/-/claude-voice-0.1.1.tgz","fileCount":283,"integrity":"sha512-lH/sEIW5VhyTFC4yCnDPooi/9TVjnSDLNPb6EK/aEIICqNrPEoVcZYQX/UQGFuxlQ43iyAX2pWr0UKUk9Lofjw==","signatures":[{"sig":"MEYCIQDAXKwqCGwVqnbkemWumIJ45jNwf+FDvmcmCWlZhStz5QIhAKvP/hmaWomGYbfd1D22qKltNkdxPQA0xvumidGdbgzk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":568259},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"b226b10788e4268ad3fc1166e4c79834801935af","scripts":{"dev":"tsx src/cli/index.ts","lint":"eslint . --max-warnings 0","test":"vitest run","build":"tsc -p tsconfig.build.json && chmod +x dist/cli/index.js","clean":"rimraf dist coverage","start":"node dist/cli/index.js","format":"prettier --write \"**/*.{ts,js,json}\"","prepare":"husky || true","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"**/*.{ts,js,json}\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"},"repository":{"url":"git+https://github.com/claude-voice/claude-voice.git","type":"git"},"_npmVersion":"11.8.0","description":"Real-time voice conversations for the Claude CLI — talk to Claude naturally from your terminal.","directories":{},"lint-staged":{"*.json":["prettier --write"],"*.{ts,js}":["eslint --fix","prettier --write"]},"_nodeVersion":"25.5.0","dependencies":{"ws":"^8.21.0","ink":"^5.1.0","ora":"^8.1.0","chalk":"^5.3.0","react":"^18.3.1","commander":"^12.1.0","selfsigned":"^2.4.1","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","husky":"^9.1.6","eslint":"^9.11.0","rimraf":"^6.0.1","vitest":"^2.1.2","globals":"^15.15.0","prettier":"^3.3.3","@types/ws":"^8.18.1","@eslint/js":"^9.11.0","typescript":"^5.6.2","@types/node":"^20.14.0","lint-staged":"^15.2.10","@types/react":"^18.3.12","@vitest/coverage-v8":"^2.1.2","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.8.0","@typescript-eslint/eslint-plugin":"^8.8.0"},"optionalDependencies":{"speaker":"^0.5.5","node-record-lpcm16":"^1.0.1"},"_npmOperationalInternal":{"tmp":"tmp/claude-voice_0.1.1_1783712965622_0.49834743913383583","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aayushdebugging/claude-voice","version":"0.1.2","keywords":["claude","claude-code","voice","speech-to-text","text-to-speech","stt","tts","whisper","groq","elevenlabs","cli","ai","assistant","voice-assistant"],"author":{"name":"claude-voice contributors"},"license":"MIT","_id":"@aayushdebugging/claude-voice@0.1.2","maintainers":[{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"}],"homepage":"https://github.com/claude-voice/claude-voice#readme","bugs":{"url":"https://github.com/claude-voice/claude-voice/issues"},"bin":{"claude-voice":"dist/cli/index.js"},"dist":{"shasum":"2ad9d993eaff6c50f28e2b0523fa42a5a3583492","tarball":"https://registry.npmjs.org/@aayushdebugging/claude-voice/-/claude-voice-0.1.2.tgz","fileCount":283,"integrity":"sha512-83ksawOVMD3f/FGQd4aYlhUWqTmt7kIlxoN2Yhkk8sF0ZS1Uyg4q0p4ahxFuvlENKXls+8zARO/tfuGYvynJ0g==","signatures":[{"sig":"MEUCIQCCDkTcDM4EqG2+ljnaFkY1Tkfwfw8y+9/fgynVrpMlTgIgLIt5vEc+8QaHJs34eaXJPRZipqCUR24MagaC/aTKGhU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":569609},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"4d2e2139f86cc62a6d10425c35c9c3c5ece41c12","scripts":{"dev":"tsx src/cli/index.ts","lint":"eslint . --max-warnings 0","test":"vitest run","build":"tsc -p tsconfig.build.json && chmod +x dist/cli/index.js","clean":"rimraf dist coverage","start":"node dist/cli/index.js","format":"prettier --write \"**/*.{ts,js,json}\"","prepare":"husky || true","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"**/*.{ts,js,json}\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"},"repository":{"url":"git+https://github.com/claude-voice/claude-voice.git","type":"git"},"_npmVersion":"11.8.0","description":"Real-time voice conversations for the Claude CLI — talk to Claude naturally from your terminal.","directories":{},"lint-staged":{"*.json":["prettier --write"],"*.{ts,js}":["eslint --fix","prettier --write"]},"_nodeVersion":"25.5.0","dependencies":{"ws":"^8.21.0","ink":"^5.1.0","ora":"^8.1.0","chalk":"^5.3.0","react":"^18.3.1","commander":"^12.1.0","selfsigned":"^2.4.1","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","husky":"^9.1.6","eslint":"^9.11.0","rimraf":"^6.0.1","vitest":"^2.1.2","globals":"^15.15.0","prettier":"^3.3.3","@types/ws":"^8.18.1","@eslint/js":"^9.11.0","typescript":"^5.6.2","@types/node":"^20.14.0","lint-staged":"^15.2.10","@types/react":"^18.3.12","@vitest/coverage-v8":"^2.1.2","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.8.0","@typescript-eslint/eslint-plugin":"^8.8.0"},"optionalDependencies":{"speaker":"^0.5.5","node-record-lpcm16":"^1.0.1"},"_npmOperationalInternal":{"tmp":"tmp/claude-voice_0.1.2_1783713447688_0.2894747470420571","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@aayushdebugging/claude-voice","version":"0.1.3","keywords":["claude","claude-code","voice","speech-to-text","text-to-speech","stt","tts","whisper","groq","elevenlabs","cli","ai","assistant","voice-assistant"],"author":{"name":"Aayush Kumar"},"license":"MIT","_id":"@aayushdebugging/claude-voice@0.1.3","maintainers":[{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"}],"homepage":"https://github.com/aayushdebugging/claude-voice#readme","bugs":{"url":"https://github.com/aayushdebugging/claude-voice/issues"},"bin":{"claude-voice":"dist/cli/index.js"},"dist":{"shasum":"4982df31f0210e6cb5f9cf3427c469198ea5ba15","tarball":"https://registry.npmjs.org/@aayushdebugging/claude-voice/-/claude-voice-0.1.3.tgz","fileCount":283,"integrity":"sha512-Jx2sWyrsD1Jr2cfRwMR7VzqcH3pfr6EyLJrpwvE8OK2prYt0EYJtTUd7L7zpjLyTedB/Ogfhci+YlqokGu11mQ==","signatures":[{"sig":"MEUCIQCY/4JKbJDvFW+eTI2fV13mDdw7fMbfWl+PNuTEhWRsOQIgLWcLcUAm8Xbdtn/PvgXtQz7bms/tCxoJlXYRbiXB6pM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":576303},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ed1a57da3c8c3d556f1a2818649b80a623b727c3","scripts":{"dev":"tsx src/cli/index.ts","lint":"eslint . --max-warnings 0","test":"vitest run","build":"tsc -p tsconfig.build.json && chmod +x dist/cli/index.js","clean":"rimraf dist coverage","start":"node dist/cli/index.js","format":"prettier --write \"**/*.{ts,js,json}\"","prepare":"husky || true","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"**/*.{ts,js,json}\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"},"repository":{"url":"git+https://github.com/aayushdebugging/claude-voice.git","type":"git"},"_npmVersion":"11.8.0","description":"Real-time voice conversations for the Claude CLI — talk to Claude naturally from your terminal.","directories":{},"lint-staged":{"*.json":["prettier --write"],"*.{ts,js}":["eslint --fix","prettier --write"]},"_nodeVersion":"25.5.0","dependencies":{"ws":"^8.21.0","ink":"^5.1.0","ora":"^8.1.0","chalk":"^5.3.0","react":"^18.3.1","commander":"^12.1.0","selfsigned":"^2.4.1","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","husky":"^9.1.6","eslint":"^9.11.0","rimraf":"^6.0.1","vitest":"^2.1.2","globals":"^15.15.0","prettier":"^3.3.3","@types/ws":"^8.18.1","@eslint/js":"^9.11.0","typescript":"^5.6.2","@types/node":"^20.14.0","lint-staged":"^15.2.10","@types/react":"^18.3.12","@vitest/coverage-v8":"^2.1.2","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.8.0","@typescript-eslint/eslint-plugin":"^8.8.0"},"optionalDependencies":{"speaker":"^0.5.5","node-record-lpcm16":"^1.0.1"},"_npmOperationalInternal":{"tmp":"tmp/claude-voice_0.1.3_1783748658418_0.9428361655493982","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@aayushdebugging/claude-voice","version":"0.1.4","keywords":["claude","claude-code","voice","speech-to-text","text-to-speech","stt","tts","whisper","groq","elevenlabs","cli","ai","assistant","voice-assistant"],"author":{"name":"Aayush Kumar"},"license":"MIT","_id":"@aayushdebugging/claude-voice@0.1.4","maintainers":[{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"}],"homepage":"https://github.com/aayushdebugging/claude-voice#readme","bugs":{"url":"https://github.com/aayushdebugging/claude-voice/issues"},"bin":{"claude-voice":"dist/cli/index.js"},"dist":{"shasum":"497a93d1f1f27938e3341681302ecee660ef5e32","tarball":"https://registry.npmjs.org/@aayushdebugging/claude-voice/-/claude-voice-0.1.4.tgz","fileCount":283,"integrity":"sha512-IWlRB1pmHnLQEIGfROYdkGCeSKUBlXMmb8kTHD2rtJW0yCnJ/cQ2tDK5LwBsysu2iUIO94ngSu1hNOoSjLCsxA==","signatures":[{"sig":"MEUCIQC56zmT6kIED7+UWA9GF1Q3PBVNsfORk5z3lj69mj9nagIgA7tpkHu+9fVMnpBSFvGyuQGxZXCW6tf6Arw4inkxOP8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":575709},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"74a412bbb737666bee9ac92e2676037e149224e8","scripts":{"dev":"tsx src/cli/index.ts","lint":"eslint . --max-warnings 0","test":"vitest run","build":"tsc -p tsconfig.build.json && chmod +x dist/cli/index.js","clean":"rimraf dist coverage","start":"node dist/cli/index.js","format":"prettier --write \"**/*.{ts,js,json}\"","prepare":"husky || true","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"**/*.{ts,js,json}\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"},"repository":{"url":"git+https://github.com/aayushdebugging/claude-voice.git","type":"git"},"_npmVersion":"11.8.0","description":"Real-time voice conversations for the Claude CLI — talk to Claude naturally from your terminal.","directories":{},"lint-staged":{"*.json":["prettier --write"],"*.{ts,js}":["eslint --fix","prettier --write"]},"_nodeVersion":"25.5.0","dependencies":{"ws":"^8.21.0","ink":"^5.1.0","ora":"^8.1.0","chalk":"^5.3.0","react":"^18.3.1","commander":"^12.1.0","selfsigned":"^2.4.1","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","husky":"^9.1.6","eslint":"^9.11.0","rimraf":"^6.0.1","vitest":"^2.1.2","globals":"^15.15.0","prettier":"^3.3.3","@types/ws":"^8.18.1","@eslint/js":"^9.11.0","typescript":"^5.6.2","@types/node":"^20.14.0","lint-staged":"^15.2.10","@types/react":"^18.3.12","@vitest/coverage-v8":"^2.1.2","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.8.0","@typescript-eslint/eslint-plugin":"^8.8.0"},"optionalDependencies":{"speaker":"^0.5.5","node-record-lpcm16":"^1.0.1"},"_npmOperationalInternal":{"tmp":"tmp/claude-voice_0.1.4_1783760240213_0.25778120542186156","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@aayushdebugging/claude-voice","version":"0.1.5","description":"Real-time voice conversations for the Claude CLI — talk to Claude naturally from your terminal.","keywords":["claude","claude-code","voice","speech-to-text","text-to-speech","stt","tts","whisper","groq","elevenlabs","cli","ai","assistant","voice-assistant"],"homepage":"https://github.com/aayushdebugging/claude-voice#readme","bugs":{"url":"https://github.com/aayushdebugging/claude-voice/issues"},"repository":{"type":"git","url":"git+https://github.com/aayushdebugging/claude-voice.git"},"license":"MIT","author":{"name":"Aayush Kumar"},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"main":"./dist/index.js","types":"./dist/index.d.ts","bin":{"claude-voice":"dist/cli/index.js"},"engines":{"node":">=18.0.0"},"scripts":{"build":"tsc -p tsconfig.build.json && chmod +x dist/cli/index.js","dev":"tsx src/cli/index.ts","start":"node dist/cli/index.js","clean":"rimraf dist coverage","typecheck":"tsc --noEmit","lint":"eslint . --max-warnings 0","lint:fix":"eslint . --fix","format":"prettier --write \"**/*.{ts,js,json}\"","format:check":"prettier --check \"**/*.{ts,js,json}\"","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build","prepare":"husky || true"},"dependencies":{"chalk":"^5.3.0","commander":"^12.1.0","ink":"^5.1.0","ora":"^8.1.0","qrcode-terminal":"^0.12.0","react":"^18.3.1","selfsigned":"^2.4.1","ws":"^8.21.0"},"optionalDependencies":{"node-record-lpcm16":"^1.0.1","speaker":"^0.5.5"},"devDependencies":{"@eslint/js":"^9.11.0","@types/node":"^20.14.0","@types/react":"^18.3.12","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.8.0","@typescript-eslint/parser":"^8.8.0","@vitest/coverage-v8":"^2.1.2","eslint":"^9.11.0","eslint-config-prettier":"^9.1.0","globals":"^15.15.0","husky":"^9.1.6","lint-staged":"^15.2.10","prettier":"^3.3.3","rimraf":"^6.0.1","tsx":"^4.19.1","typescript":"^5.6.2","vitest":"^2.1.2"},"lint-staged":{"*.{ts,js}":["eslint --fix","prettier --write"],"*.json":["prettier --write"]},"gitHead":"5f7d2b19f316f7b08bd68cfc63bf481197776d28","_id":"@aayushdebugging/claude-voice@0.1.5","_nodeVersion":"25.5.0","_npmVersion":"11.8.0","dist":{"integrity":"sha512-zu6DBBrRVr2BRuS1Mh5obe33Ky/Nw8ETQ4XDbbbXqk/HTE1fdjP/B71qs5N68INTPDv0bux/VN6S5sg8FdqiSw==","shasum":"340372c74ab27cef0188368efccf37b416fb5326","tarball":"https://registry.npmjs.org/@aayushdebugging/claude-voice/-/claude-voice-0.1.5.tgz","fileCount":283,"unpackedSize":587079,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFfk2dQvA1qaD3W7DPQgl9P3RPP+vvDE8KjGTAeKtWfyAiEA88SBBddGol8S32hUOMM4tXnEReTodSqZfqGl3jturdM="}]},"_npmUser":{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"},"directories":{},"maintainers":[{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/claude-voice_0.1.5_1783788326664_0.27192496319075166"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-10T19:24:13.660Z","modified":"2026-07-11T16:45:26.925Z","0.1.0":"2026-07-10T19:24:13.969Z","0.1.1":"2026-07-10T19:49:25.821Z","0.1.2":"2026-07-10T19:57:27.849Z","0.1.3":"2026-07-11T05:44:18.647Z","0.1.4":"2026-07-11T08:57:20.365Z","0.1.5":"2026-07-11T16:45:26.820Z"},"bugs":{"url":"https://github.com/aayushdebugging/claude-voice/issues"},"author":{"name":"Aayush Kumar"},"license":"MIT","homepage":"https://github.com/aayushdebugging/claude-voice#readme","keywords":["claude","claude-code","voice","speech-to-text","text-to-speech","stt","tts","whisper","groq","elevenlabs","cli","ai","assistant","voice-assistant"],"repository":{"type":"git","url":"git+https://github.com/aayushdebugging/claude-voice.git"},"description":"Real-time voice conversations for the Claude CLI — talk to Claude naturally from your terminal.","maintainers":[{"name":"aayushdebugging","email":"aayushrajbinod@gmail.com"}],"readme":"<div align=\"center\">\n\n# 🎙️ Claude Voice AI\n\n**Real-time voice conversations for the [Claude CLI](https://claude.com/claude-code).**\n\nTalk to Claude naturally from your terminal — speak, and hear it think back.\n\n[![CI](https://github.com/aayushdebugging/claude-voice/actions/workflows/ci.yml/badge.svg)](https://github.com/aayushdebugging/claude-voice/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/@aayushdebugging/claude-voice.svg)](https://www.npmjs.com/package/@aayushdebugging/claude-voice)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)\n[![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org)\n\n<img src=\"./assets/demo.svg\" alt=\"claude-voice demo\" width=\"680\" />\n\n</div>\n\n---\n\n`claude-voice` is a **native voice layer on top of the Claude CLI**, not a\nspeech-to-text wrapper. You speak; your words are transcribed and sent to\n`claude`; the streamed response is printed live **and spoken aloud sentence by\nsentence** as it is generated. Start talking again at any time and it stops,\nlistens, and hands your interruption straight to Claude — like pair programming\nout loud.\n\n## ✨ Features\n\n- 🎤 **Speak to Claude** — continuous listening with silence detection, or push-to-talk.\n- 🧠 **Wraps the Claude CLI** — uses your existing `claude` install and session; **no Claude API key required**.\n- 🔊 **Speaks as it thinks** — responses are streamed to TTS one complete sentence at a time, so audio starts almost immediately.\n- ✋ **Barge-in / interruption** — cut in mid-sentence; playback and generation stop instantly and it starts listening again.\n- 🔌 **Pluggable providers** — Groq Whisper (default) or any OpenAI-compatible STT; ElevenLabs or Sarvam TTS. Add your own.\n- 🩺 **`doctor`** — one command verifies your CLI, keys, mic, speaker, and network.\n- 🧩 **Extensible** — an event-driven core with a plugin API for wake-words, clipboard, memory, notifications, MCP, and more.\n- 🎨 **Polished, branded TUI** — an [Ink](https://github.com/vadimdemedes/ink)-powered **Claude Voice AI** interface: a gradient-branded header with a persistent watermark, a spinner that shimmers through the brand palette, a scrollback transcript, live token streaming, colored role labels (`❯ You`, `✦ Claude`), and a status bar with a mic meter + timings.\n- ⌨️ **Talk or type** — press **`t`** to type a message instead of speaking, so you can use it even without a working mic.\n\n## 🚀 Quick start\n\n```bash\n# 1. Install globally\nnpm install -g @aayushdebugging/claude-voice\n\n# 2. Make sure the Claude CLI is installed and logged in\n#    https://claude.com/claude-code\nclaude --version\n\n# 3. Set your provider keys (see \"Configuration\" below)\nexport GROQ_API_KEY=\"…\"        # speech-to-text\nexport ELEVENLABS_API_KEY=\"…\"  # text-to-speech\n\n# 4. Check everything is wired up\nclaude-voice doctor\n\n# 5. Talk to Claude\nclaude-voice\n```\n\nYou'll also need a microphone recorder backend and audio output:\n\n| Platform | Install |\n| --- | --- |\n| macOS | `brew install sox` (and `brew install ffmpeg` for gapless streaming) |\n| Debian/Ubuntu | `sudo apt-get install sox libsox-fmt-all alsa-utils ffmpeg` |\n| Windows | [Install SoX](https://sourceforge.net/projects/sox/) and add it to `PATH` |\n\n> `ffmpeg` (its `ffplay`) is optional but recommended: it enables **gapless** streamed speech. Without it, playback falls back to `afplay`/`aplay` clips (still works, with a tiny seam between sentences).\n\nSee the [Installation guide](./docs/INSTALLATION.md) for details and troubleshooting.\n\n## 🎛️ Usage\n\n```bash\nclaude-voice                      # start a conversation (continuous mode)\nclaude-voice --model opus         # pick a Claude model (opus | sonnet | fable)\nclaude-voice --voice river        # pick a TTS voice\nclaude-voice --stt groq           # choose the speech-to-text provider\nclaude-voice --tts sarvam         # choose the text-to-speech provider (elevenlabs | sarvam)\nclaude-voice --push-to-talk       # press SPACE to talk instead of continuous\nclaude-voice --no-speak           # text only, no spoken responses\nclaude-voice --language hi        # set STT + TTS language (ISO-639-1) or \"auto\"\nclaude-voice --speed 1.5          # speech rate multiplier, 0.5–3.0 (1 = natural)\nclaude-voice --no-stream          # speak the whole reply at once (default: as it streams)\nclaude-voice --fast-speech        # lowest latency: start after the first clause (may sound choppier)\nclaude-voice --local              # fully-local, free stack (whisper.cpp + Kokoro)\n```\n\n**In-session keys** (default push-to-talk):\n\n| Key | Action |\n| --- | --- |\n| **SPACE** | tap to start talking → it auto-stops when you finish speaking and transcribes. Tap again to send immediately, or to interrupt while Claude is replying. |\n| **`t`** | type a message instead of speaking (Enter sends, Esc cancels, ↑/↓ recalls previous prompts) |\n| **`/`** | open the command palette |\n| **`q`** / **Ctrl-C** | quit |\n\n**Command palette** (press `/`):\n\n| Command | Action |\n| --- | --- |\n| `/help` | show keys & commands |\n| `/clear` | clear the transcript |\n| `/mute` · `/speak` | toggle spoken responses on the fly |\n| `/voice <name>` | switch the TTS voice live (e.g. `/voice karun`) |\n| `/model <name>` | switch the Claude model (opus/sonnet/fable) for the next turn |\n| `/speed <rate>` | set the speech rate live — `0.5`–`3.0` (e.g. `/speed 1.5` or `/speed 2x`) |\n| `/lang <code>` | switch language for STT + TTS (e.g. `/lang hi`, `/lang auto`) |\n| `/stream` | toggle speaking-as-Claude-writes vs speaking the whole reply at once |\n| `/quit` | exit |\n\nWhile listening, a live **mic-level meter** in the status bar fills green as it hears you, so you always know the mic is working. Claude's answer streams to the screen as it's written and is **spoken as it streams** — text is chunked one **sentence** at a time and each sentence is synthesized *ahead* of playback, so audio starts moments after the first sentence and tracks the text as it appears. Sentences are the unit (rather than clauses) so the TTS engine voices internal punctuation — commas, dashes, colons — as natural pauses: splitting on every comma makes engines like Kokoro pad each fragment with a beat of trailing silence, i.e. an audible stop at each mark. For the lowest possible first-word latency at the cost of choppier prosody, **`--fast-speech`** chunks at clause boundaries instead. Generation, synthesis, and playback all run in parallel and never block each other.\n\nFor **gapless** streaming, install `ffmpeg` (`brew install ffmpeg`): the reply is fed sentence-by-sentence into a single persistent audio stream (`ffplay`), which waits during pauses rather than reopening the device — so it sounds like one continuous answer. Without a streaming player it falls back to playing a few back-to-back clips via `afplay` (a small seam between clips), and `--no-stream` (or `/stream`) speaks the whole reply at once with no seams at all. sox `play` is intentionally not used for streaming — it cuts off on the first pause.\n\nWhile Claude generates, the status bar shows a live **word count and words/sec**, and each reply is tagged with its time and length (e.g. `Claude · 2.4s · 45w`).\n\n> The rich UI needs a real terminal. When output is piped or `CLAUDE_VOICE_PLAIN=1` is set, it falls back to a plain streaming UI.\n\n### Commands\n\n| Command | What it does |\n| --- | --- |\n| `claude-voice` / `claude-voice chat` | Start a live voice conversation. |\n| `claude-voice serve` | Host a remote voice client on your Wi-Fi — talk to Claude from your phone. |\n| `claude-voice say \"<text>\"` | Speak a phrase aloud with the configured voice (no mic needed). |\n| `claude-voice config` | View or edit configuration. |\n| `claude-voice local` | Set up / check the fully-local, free stack (whisper.cpp + Kokoro). |\n| `claude-voice doctor` | Diagnose your setup (CLI, keys, mic, speaker, network). |\n| `claude-voice update` | Check for and install the latest version. |\n| `claude-voice version` | Print the installed version. |\n\n## ⬆️ Updating\n\nAlready installed it? Upgrade to the latest published version:\n\n```bash\n# global install:\nnpm install -g @aayushdebugging/claude-voice@latest\n\n# or, if it's a project dependency:\nnpm update @aayushdebugging/claude-voice\n```\n\nFrom **v0.1.2** onward you can also self-update in place:\n\n```bash\nclaude-voice update          # checks npm and installs the newest version\nclaude-voice update --check  # just check, don't install\nclaude-voice version         # what you're on now\n```\n\n> Note: `npm update` takes a bare package name (no `@latest`); use `npm install …@latest` to force the newest, or `npm update …` to move within your saved range.\n\n## 🔒 Fully local & free (no API keys)\n\nRun entirely offline with open-source models — no cloud, no keys, $0:\n\n- **STT:** [whisper.cpp](https://github.com/ggml-org/whisper.cpp) (Metal-accelerated on Apple Silicon)\n- **TTS:** [Kokoro](https://github.com/hexgrad/kokoro) (`kokoro-onnx`, CPU, no PyTorch)\n\nIt's a few one-time steps. **`claude-voice local` downloads the models and reports\nstatus; you install the native runtimes once and start the two local servers**\n(npm can't install compiled binaries, and the servers are long-running, so those\nstay in your hands).\n\n**1. Install the runtimes** (one-time — native/Python, not from npm):\n\n| Platform | Command |\n| --- | --- |\n| macOS | `brew install sox ffmpeg whisper-cpp uv` |\n| Debian/Ubuntu | `sudo apt-get install sox ffmpeg` · then [build whisper.cpp](https://github.com/ggml-org/whisper.cpp#quick-start) and [install `uv`](https://docs.astral.sh/uv/getting-started/installation/) |\n\n**2. Download the models + check what's needed:**\n\n```bash\nclaude-voice local\n```\nThis **auto-downloads the whisper model** (~150 MB, with a progress bar), writes the\nKokoro server script to `~/.claude-voice/kokoro-server.py`, and prints a ✔/✖ status\nreport with the exact command for anything still missing. (`--no-download` prints the\nmodel's `curl` command instead of fetching it.)\n\n**3. Start the two servers** — each in its own terminal, since they keep running:\n\n```bash\n# speech-to-text (whisper.cpp)\nwhisper-server -m ~/.claude-voice/models/ggml-base.en.bin --host 127.0.0.1 --port 8081\n\n# text-to-speech (Kokoro — downloads its ~340 MB model on first run)\nuv run --with kokoro-onnx --with numpy python ~/.claude-voice/kokoro-server.py --port 8880\n```\n\n**4. Talk, pointed at the local stack:**\n\n```bash\nclaude-voice --local\n# …or make it the permanent default:\nclaude-voice config --set stt=whispercpp --set tts=kokoro --set voice=af_heart\n```\n\n> Re-run `claude-voice local` any time to see live status (which servers are up, which\n> models exist). If you see `whisper.cpp request failed: fetch failed`, a server just\n> isn't running yet — start it with step 3.\n\nAny OpenAI-compatible STT/TTS server works too (point `providers.whispercpp.baseUrl` /\n`providers.kokoro.baseUrl` at it).\n\n## 📱 Talk from your phone (remote)\n\nRun a token-protected voice session on your machine and drive it from your phone on the same Wi-Fi — hands-free with headphones:\n\n```bash\nclaude-voice serve\n```\n\nIt prints a link and a **QR code**. Scan it (or open the link) on your phone:\n\n1. Accept the one-time certificate warning (it's a self-signed cert — needed so the phone's browser will allow microphone access on the LAN).\n2. Allow microphone access.\n3. **Hold the button, speak, release.** Your words are transcribed on your machine, sent to Claude, and the reply streams back as text and **plays aloud on the phone**. Tap **Stop** to cut off a reply, or type instead.\n\n> **Safe by default.** A remote session runs with **all of Claude's tools disabled** — it can talk, but it can't run shell commands, edit files, or read your disk. The link carries a secret token, but anyone on your network who has it can talk to Claude on your machine, so only share it with yourself.\n\n```bash\nclaude-voice serve --host 127.0.0.1   # keep it on this machine only\nclaude-voice serve --port 8080        # change the port\nclaude-voice serve --max-clients 2    # cap simultaneous devices\nclaude-voice serve --allow-tools      # DANGER: let remote prompts run tools\n```\n\nPlease read [SECURITY.md](./SECURITY.md) before using `--allow-tools` or exposing the server on an untrusted network.\n\n## 🔑 Configuration\n\nConfiguration lives at `~/.claude-voice/config.json`. **API keys are never\nstored there** — they are read from environment variables:\n\n| Provider | Env var |\n| --- | --- |\n| Groq (STT, default) | `GROQ_API_KEY` |\n| OpenAI (STT) | `OPENAI_API_KEY` |\n| ElevenLabs (TTS, default) | `ELEVENLABS_API_KEY` |\n| Sarvam (TTS) | `SARVAM_API_KEY` |\n\n```jsonc\n{\n  \"stt\": \"groq\",              // \"groq\" | \"openai\"\n  \"tts\": \"elevenlabs\",        // \"elevenlabs\" | \"sarvam\"\n  \"voice\": \"aria\",            // TTS voice name\n  \"model\": \"opus\",            // Claude model alias\n  \"pushToTalk\": false,        // continuous vs push-to-talk\n  \"autoSpeak\": true,          // speak responses aloud\n  \"streamSpeech\": true,       // speak as Claude writes (vs the whole reply at once)\n  \"voicePrompt\": \"…\",         // steers Claude to answer in a voice-friendly way (\"\" disables)\n  \"language\": \"auto\",         // STT + TTS language (ISO-639-1) or \"auto\"\n  \"speechRate\": 1.0,          // speech rate multiplier, 0.5–3.0 (1 = natural)\n  \"silenceTimeoutMs\": 1500,   // silence that ends an utterance\n  \"micSensitivity\": 150,      // lower = picks up quieter mics; higher = ignores noise\n  \"sampleRate\": 16000\n}\n```\n\nManage it from the CLI:\n\n```bash\nclaude-voice config                       # print current config + path\nclaude-voice config --edit                # open in $EDITOR\nclaude-voice config --set voice=river --set model=sonnet\nclaude-voice config --get providers.groq.model\nclaude-voice config --reset               # restore defaults\n```\n\n## 🧠 How it works\n\n```\n🎤 Microphone → 📝 Speech-to-Text → 🤖 Claude CLI (stream-json)\n        ↑                                     ↓\n   barge-in                          🔎 Sentence parser\n        ↑                              ↓            ↓\n  🔊 Speakers ← 🗣️ TTS queue ←──────────┘     🖥️ Terminal (live tokens)\n```\n\nClaude's output is streamed token-by-token. A streaming **sentence parser**\naccumulates tokens until a sentence completes (`.`, `?`, `!`, or a paragraph\nbreak), then hands each finished sentence to an **interruptible speech queue**\nso audio begins while Claude is still generating. Every stage communicates over\na typed **event bus**, so the UI, plugins, and providers stay decoupled.\n\nRead the full [Architecture guide](./docs/ARCHITECTURE.md).\n\n## 🧩 Programmatic use\n\n`claude-voice` is also a library. The CLI is a thin layer over these primitives:\n\n```ts\nimport { createSession, loadConfig } from '@aayushdebugging/claude-voice';\n\nconst config = await loadConfig({ model: 'opus', voice: 'river' });\nconst { conversation, bus } = createSession({ config });\n\nbus.on('SpeechRecognized', ({ text }) => console.log('You said:', text));\nbus.on('ClaudeToken', ({ text }) => process.stdout.write(text));\n\nawait conversation.start(); // Ctrl-C to stop\n```\n\nSee the [API documentation](./docs/API.md) for the full surface, including how\nto write custom STT/TTS providers and plugins.\n\n## 🩺 Troubleshooting\n\nRun `claude-voice doctor` first — it pinpoints most issues. Common ones:\n\n- **\"Claude CLI not found\"** — install it from <https://claude.com/claude-code> and ensure `claude` is on your `PATH`.\n- **\"recording backend not found\"** / **\"Microphone capture needs sox\"** — install `sox` (`brew install sox`; see the table above).\n- **\"No microphone audio detected\"** — either `sox` isn't installed, or your terminal lacks mic permission. Install `sox`, then grant access under **System Settings → Privacy & Security → Microphone** (to the *terminal app you launched from* — e.g. Terminal, iTerm, or VS Code) and restart it.\n- **\"whisper.cpp request failed: fetch failed\"** (or the same for `kokoro`) — the local STT/TTS **server isn't running**. Start it (see [Fully local & free](#-fully-local--free-no-api-keys), step 3) or run `claude-voice local` to see which servers are up. `fetch failed` = nothing is listening on the configured port.\n- **\"speaker module unavailable\"** — the optional native audio module failed to build; install your platform's build tools and reinstall. `--no-speak` works meanwhile.\n- **401 from a provider** — double-check the corresponding `*_API_KEY`.\n\n## 🔐 Security\n\n`claude-voice` drives the Claude CLI — a capable agent — from your voice. Local\nsessions have full tool access (like your terminal); **remote (`serve`) sessions\ndisable all tools by default** so a spoken or injected prompt can't run commands\nor touch your files. Before exposing a server or using `--allow-tools`, read\n[**SECURITY.md**](./SECURITY.md) for the threat model and safe-use guidance. To\nreport a vulnerability, see the reporting section there (please don't file a\npublic issue).\n\n## 🤝 Contributing\n\nContributions are very welcome! See the [Contributing guide](./docs/CONTRIBUTING.md)\nfor the dev setup, coding standards, and how to add a provider or plugin.\n\n## 📄 License\n\n[MIT](./LICENSE) © claude-voice contributors\n","readmeFilename":"README.md"}