[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-nova3 provider
  • Audio chunks are sent continuously (342 bytes each at ~10ms intervals)
  • No onTranscript callbacks are ever received
  • Bun warning: ws.WebSocket 'unexpected-response' event is not implemented — could be masking a server-side rejection
  • Feature flag tengu_cobalt_frost enables Nova 3 gate — this may be a recent server-side rollout

Additional Verification

  • Microphone hardware confirmed working (both sox rec and ffmpeg -f avfoundation capture audio)
  • macOS TCC microphone permissions granted
  • Claude binary has com.apple.security.device.audio-input entitlement
  • 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

View original on GitHub ↗

This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗