Deepgram CLI 0.3.0: Flux TTS and Flux STT

Deepgram CLI 0.3.0 is now available. It completes CLI support for Flux TTS, which reached general availability on 12 August, fixes Flux STT streaming, and enforces the CLI’s exit-code contract.

Upgrading from 0.2.26 picks up everything in this release. 0.2.27 was tagged but never published, so its changes arrive here.

Full Flux TTS support on dg speak

dg speak now defaults to flux-alexis-en on Speak v2 (WebSocket streaming) instead of Aura 2. Synthesised audio differs from earlier releases unless you request an Aura model explicitly:

$dg speak "Hello from Deepgram" -m aura-2-asteria-en -o hello.mp3

Two Flux-only controls are now available. Both are validated before the request and rejected for non-flux-* models.

OptionValuesNotes
--speed0.85 to 1.15 in 0.05 steps1.00 is nominal
--expressivity-2 to 2Beta. 0 is nominal; negative is flatter, positive more animated
$dg speak "So exciting!" --expressivity 2 --speed 1.05 -o lively.wav

Any GA voice works with -m. For the full catalog see Voices & Languages; dg models lists Aura voices only.

Flux streaming returns raw audio: linear16 by default, plus mulaw and alaw. The --container option and the wider --encoding set apply to Aura only. Aura is otherwise unchanged, Spanish voices included.

dg speak synthesises one turn and exits, so the GA barge-in surface (Interrupt and SpeechInterrupted) and mid-session Configure are intentionally not exposed. Those target live agent pipelines; --speed and --expressivity are fixed for the connection here. See Interruption Handling if you need them.

Flux STT streaming is fixed

dg listen has routed flux-* models to Listen v2 since 0.2.5, but v2 was receiving v1-only parameters (language, smart_format, punctuate, channels, diarize, interim_results) and returning HTTP 400. Flux STT streaming now works:

$dg listen --mic --model flux-general-en

Also fixed in this release:

  • TurnInfo events are assembled per turn, and finite streams flush the final in-flight turn instead of dropping it
  • Fatal error frames propagate their code and description, and exit non-zero
  • Multichannel raw audio is rejected before streaming rather than sent as stereo bytes read as mono
  • Partial and null word timings are backfilled, so saved captions are valid
  • --diarize warns and is cleared consistently, since Flux does not support it

Flux STT is streaming only. Files and URLs use Listen v1.

Redaction and numerals on dg listen

$dg listen call.wav --redact numbers --numerals
  • --redact is repeatable. Flux STT accepts numbers and aggressive_numbers; Listen v1 also accepts categories such as pci and ssn.
  • --numerals converts spoken numbers to digits.

Both apply to prerecorded and live paths. All of the above runs on Deepgram Python SDK 7.7.0.

Exit codes are now enforced

This release includes a breaking change. dg previously exited 0 regardless of outcome. It now follows the documented contract:

CodeMeaning
0Success
1Error, including crashes and usage errors such as an unknown command or invalid flag
2User interrupt: Ctrl-C, or Ctrl-D at a prompt

Scripts and CI steps that ignored the exit code will now surface failures they were previously swallowing. No command that succeeds changes its exit code. See Exit Codes.

Error output moved to stderr

Usage errors, crashes, and cancellation messages are written to stderr instead of stdout, so dg -o json keeps stdout machine-readable when a command fails this way. Previously these printed to stdout, which corrupted output piped into tools such as jq.

This covers the root command path. Some command-level errors, an authentication failure among them, still print to stdout, so scripts should branch on the exit code rather than assume stdout parses.

dg update now delivers the whole release

The CLI ships as a root package plus per-command packages. Root’s dependency floors were lower than the versions being published, so pip’s default only-if-needed strategy left most command packages at their installed version: dg --version reported the new release while its fixes had not arrived. This is why Flux TTS, published in 0.2.26, never reached anyone who upgraded rather than installing fresh.

Floors now match the published versions, so both of these deliver the full release:

$dg update
$pip install --upgrade deepctl

Installations managed with uv, Homebrew, or the install script were not affected.

Also in this release

  • -o yaml and -o csv no longer drop square-bracketed text from values
  • dg keys --delete KEY_ID asks for confirmation instead of reporting Cancelled by user without deleting
  • dg keys --create --dry-run reports what it would create instead of failing
  • dg mcp handles a closed stdio pipe during startup notifications and on the error path

For release details, see deepgram/cli v0.3.0.