August 19, 2026
Deepgram CLI 0.3.0: Flux TTS and Flux STT
Section titled “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
Section titled “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.mp3Two Flux-only controls are now available. Both are validated before the request and rejected for non-flux-* models.
| Option | Values | Notes |
|---|---|---|
--speed |
0.85 to 1.15 in 0.05 steps |
1.00 is nominal |
--expressivity |
-2 to 2 |
Beta. 0 is nominal; negative is flatter, positive more animated |
dg speak "So exciting!" --expressivity 2 --speed 1.05 -o lively.wavAny 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
Section titled “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-enAlso fixed in this release:
TurnInfoevents 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
--diarizewarns 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
Section titled “Redaction and numerals on dg listen”dg listen call.wav --redact numbers --numerals--redactis repeatable. Flux STT acceptsnumbersandaggressive_numbers; Listen v1 also accepts categories such aspciandssn.--numeralsconverts 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
Section titled “Exit codes are now enforced”This release includes a breaking change. dg previously exited 0 regardless of outcome. It now follows the documented contract:
| Code | Meaning |
|---|---|
0 |
Success |
1 |
Error, including crashes and usage errors such as an unknown command or invalid flag |
2 |
User 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
Section titled “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
Section titled “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 deepctlInstallations managed with uv, Homebrew, or the install script were not affected.
Also in this release
Section titled “Also in this release”-o yamland-o csvno longer drop square-bracketed text from valuesdg keys --delete KEY_IDasks for confirmation instead of reportingCancelled by userwithout deletingdg keys --create --dry-runreports what it would create instead of failingdg mcphandles a closed stdio pipe during startup notifications and on the error path
For release details, see deepgram/cli v0.3.0.