ddx-cuda-live-stt

Streaming ASR · NVIDIA Parakeet-TDT-0.6B-v3 · :4600 · Deepgram-shaped wire format (v1.0.0 frozen).

Recommended SDK drop-in: point the official @deepgram/sdk base URL at the bare host. The SDK appends /v1/listen itself. Send a Deepgram credential (Authorization: Token <key> header, or the token, <key> subprotocol in the browser) and the connection routes to the Deepgram-compatible session. With no credential it falls through to the native handler. /v1/listen/dg and /deepgram/v1/listen are explicit aliases — not what you configure in the SDK.

Auth forms

FormWireUsed by
HeaderAuthorization: Token <key> (capital T, single space)server SDK (Node, Python)
SubprotocolSec-WebSocket-Protocol: token, <key>browser SDK (cannot set headers)

Audio format

16 kHz mono linear16 (int16 LE). Chunk 3200 bytes (=100 ms) every ~50 ms so live VAD/endpointing runs. Other rates/channels are resampled/downmixed server-side.

Frame sequence

On a Deepgram session: Metadata (open) → Results (interim + final) → UtteranceEnd (on VAD speech-end) → Metadata (final, on CloseStream). SpeechStarted + UtteranceEnd require vad_events=true.

Query params (live registry)

Full table with behaviour badges + notes: /v1/help/params. Rendered live from the dispatch registry — never drifts.

ParamBehaviourNote
encodingSUPPORTEDParakeet expects PCM-16 (linear16); transcode mulaw/alaw/opus.
sample_rateSUPPORTEDParakeet trained at 16 kHz; resample any declared rate.
channelsPARTIALAccept up to 2; mix to mono internally.
endpointingSUPPORTEDSilero/WebRTC VAD; emit speech_final after silence>endpointing ms.
modelPARTIALAccept any value, route to Parakeet, echo in metadata.model_info.name.
versionNOOPLegacy Deepgram field; accept silently, ignore.
tierNOOPLegacy Deepgram field; accept silently, ignore.
languageSUPPORTEDParakeet-TDT-0.6B-v3 supports 25 languages; pass as model hint.
punctuatePARTIALParakeet basic punctuation; post-processor for accuracy.
profanity_filterNOOPAccepted and echoed; the transcript is returned unfiltered. No profanity filtering is applied.
redactNOOPAccepted and echoed; the transcript is returned unredacted. No redaction is applied — do not rely on this param for PII handling.
diarizePARTIALBaseline speaker:0. When DDX_STT_DIARIZE_ENABLED=1, real Sortformer speaker labels on words[] (en supported; de/fr/es EXPERIMENTAL).
multichannelERRORReject if true with channels>1: close 1008 'multichannel not supported'.
numeralsSUPPORTEDParakeet TDT head includes ITN; enable via model config.
smart_formatPARTIALBaseline: punctuate + numerals. When DDX_STT_SMART_FORMAT_ENABLED=1, engages WFST ITN on the FINAL transcript (en production; de/fr/es EXPERIMENTAL).
replacePARTIALRepeatable 'search:replace'; simple string-replace post-processor.
keywordsSUPPORTEDPOST-TRANSCRIPTION ONLY: repeatable 'kw[:intensifier]' is parsed, stored on the session, and used to drive phonetic + fuzzy correction of the FINAL transcript against the locale medical lexicon (Cologne Phonetics for de, Double Metaphone for en/fr/es). Interim results are NEVER rewritten, so live captions do not flicker. This is NOT acoustic/decoder-level biasing: the decode is byte-identical with or without it, because the service stays pinned to decoding strategy 'greedy' to dodge an NVRTC CUDA-graph capture bug (services/nemo_decoding.py). A 2026-08-03 spike found that pin's blocker gone but did NOT demonstrate a boosting tree loading (fusion_models stayed None), so true acoustic boosting remains unproven work. The intensifier suffix is accepted for Deepgram wire compatibility but does not weight the correction. Gated by DDX_STT_TERM_CORRECTION_ENABLED.
keytermNOOPACCEPTED BUT INERT: Deepgram's Nova-3 keyterm surface (max 500 tokens) is parsed and echoed, but has no effect on the transcript — same decoder-side gap as 'keywords'. Not implemented, no acoustic or post-processing effect.
interim_resultsSUPPORTEDStream partial Results frames; if false buffer to final only.
utterancesPARTIALPer-utterance segmentation via VAD + utterance_end_ms silence.
utt_splitPARTIALSilence threshold seconds; map to VAD min_silence_ms.
utterance_end_msSUPPORTEDSilence (ms) after last word before UtteranceEnd fires; drives SDK end-of-speech timing. None falls back to VAD default.
no_delayNOOPDG smart_format no-delay flag; our streaming path emits without an endpointing buffer delay already, so honour-but-noop (echoed).
turn_detectionPARTIALDudoxx ext (shard 06). Silero endpointing is default. When DDX_STT_TURN_DETECTOR_ENABLED=1, a semantic EOU model REFINES each Silero speech_end (true turn-end vs mid-utterance pause); off = Silero only.
turn_decisionPARTIALDudoxx ext. When DDX_STT_TURN_DECISION_ENABLED=1, every is_final Results frame carries ddx_turn {decision: continue|complete|incomplete, status, source: llm|livekit, ...} — a dudoxx-LLM verdict over the turn text since the last complete, LiveKit EOU fallback (2-state). Advisory; never re-times a finalize.
vad_eventsSUPPORTEDSilero/WebRTC VAD; emit SpeechStarted + UtteranceEnd frames.
tagNOOPRepeatable opaque analytics tag; accept silently, log only.
extraNOOPOpaque echo-back string; surface in opening Metadata transaction_key.
mip_opt_outNOOPModel-improvement opt-out; honour silently (no audio retention anyway).
callbackNOOPAsync callback URL; not applicable to streaming WS.
callback_methodNOOPPOST/GET/PUT/DELETE for async callback; ignored in streaming.
wordsSUPPORTEDParakeet provides word-level timestamps natively.
paragraphsNOOPAccept; omit paragraph structure from response.
summarizeNOOPInvariant 8: NEVER call server-side LLM; return null/empty.
detect_languageNOOPInvariant 8: NEVER call server-side LLM; return null languages.
detect_topicsNOOPInvariant 8: NEVER call server-side LLM; return empty topics.
detect_entitiesNOOPInvariant 8: NEVER call server-side LLM; return entities:[].
dictationNOOPSpoken commands as regular words; no command interpreter.
searchNOOPRepeatable; omit search_results from response.
filler_wordsPARTIALParakeet drops fillers by default; toggling needs model-config change.
alternativesNOOPAlways return 1 alternative; SDK handles missing N-best gracefully.
authorizationNOOPSDK per-request key override; the WS handler reads Authorization header.