> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developers.deepgram.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.deepgram.com/_mcp/server.

## 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](/docs/flux-tts/overview), 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:

```shell
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.

| 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 |

```shell
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](/docs/flux-tts/voices); `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](/docs/flux-tts/interrupt-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:

```shell
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`

```shell
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:

| 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](/developer-tools/cli/getting-started#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](/developer-tools/cli/getting-started#exit-codes) 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:

```shell
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](https://github.com/deepgram/cli/releases/tag/v0.3.0).