[BUG] Voice mode returns empty transcript — audio captures but deepgram-nova3 STT returns nothing
Resolved 💬 4 comments Opened Mar 23, 2026 by km061597 Closed Apr 24, 2026
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Voice mode (/voice) captures audio and sends it over WebSocket successfully, but the transcript always comes back empty. The audio pipeline works end-to-end — native NAPI module loads, audio chunks are buffered and sent — but the Deepgram Nova 3 STT provider returns no transcription.
This previously worked and stopped working recently, suggesting a server-side change (possibly the tengu_cobalt_frost feature flag enabling the deepgram-nova3 STT provider).
Debug Log (captured with claude -d voice)
[voice] audio-capture-napi loaded in 602ms
[voice] handleKeyEvent: idle, starting recording session immediately
[voice] Starting recording session, connecting voice stream
[voice] startRecording: buffering audio while WebSocket connects
[voice] startRecording called, platform=darwin
[voice_stream] Nova 3 gate enabled (tengu_cobalt_frost)
[voice_stream] Connecting to wss://api.anthropic.com/api/ws/speech_to_text/voice_stream?encoding=linear16&sample_rate=16000&channels=1&endpointing_ms=300&utterance_end_ms=1000&language=en&use_conversation_engine=true&stt_provider=deepgram-nova3
[ERROR] Error: console.error: [bun] Warning: ws.WebSocket 'unexpected-response' event is not implemented in bun
[voice_stream] WebSocket connected
[voice_stream] Sending initial KeepAlive
[voice] onReady: flushing 55 buffered chunks (18810 bytes) as 1 coalesced frame(s)
[voice_stream] Sending audio chunk: 18810 bytes
[voice_stream] Sending audio chunk: 342 bytes (continues...)
[voice] finishRecording: stopping recording, transitioning to processing
[voice] Recording stopped
[voice] Final transcript assembled (0 chars): ""
Key Observations
- Audio capture works: 55 chunks, 18810 bytes buffered and flushed
- WebSocket connects successfully to
deepgram-nova3provider - Audio chunks are sent continuously (342 bytes each at ~10ms intervals)
- No
onTranscriptcallbacks are ever received - Bun warning:
ws.WebSocket 'unexpected-response' event is not implemented— could be masking a server-side rejection - Feature flag
tengu_cobalt_frostenables Nova 3 gate — this may be a recent server-side rollout
Additional Verification
- Microphone hardware confirmed working (both
sox recandffmpeg -f avfoundationcapture audio) - macOS TCC microphone permissions granted
- Claude binary has
com.apple.security.device.audio-inputentitlement - OAuth account is configured
- Default input device: MacBook Pro Microphone at 48kHz
- Input volume verified at 80/100
Environment
- OS: macOS 26.3 (Tahoe), Darwin 25.3.0, Apple Silicon
- Claude Code: 2.1.81
- Terminal: Ghostty (also tested outside tmux — same result)
- Shell: zsh
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗