Skip to content

feat(speak): default to Flux TTS (flux-alexis-en) instead of Aura 2#89

Open
GregHolmes wants to merge 1 commit into
mainfrom
feat/speak-default-flux-tts
Open

feat(speak): default to Flux TTS (flux-alexis-en) instead of Aura 2#89
GregHolmes wants to merge 1 commit into
mainfrom
feat/speak-default-flux-tts

Conversation

@GregHolmes

Copy link
Copy Markdown
Contributor

What

Changes the default dg speak model from aura-2-asteria-en to flux-alexis-en, so a bare dg speak "..." now uses Flux TTS (Speak v2, WebSocket streaming) out of the box. Aura remains fully available via -m aura-*.

Follow-on to the Speak v2 / Flux TTS implementation (#86). Asana: DX CLI task.

Why

Flux TTS is our latest, most natural TTS. Making it the default puts our best voice front-and-center in the CLI.

How it works

Routing is unchanged and purely prefix-based (model.lower().startswith("flux")): flux-* goes to Speak v2 streaming, everything else goes to Speak v1 (Aura, REST batch). Picking the voice is picking the API path -- there is no separate mode flag.

Behavior change

Because the default now takes the v2 streaming path (raw linear16 auto-wrapped in WAV), containerized formats like mp3 now require an explicit -m aura-*:

  • dg speak "hi" -o out.wav -> Flux, WAV (new default)
  • dg speak "hi" -o out.mp3 --encoding mp3 -> fails with a clear error + non-zero exit (was previously fine under the Aura default)
  • dg speak "hi" -o out.mp3 -m aura-2-asteria-en -> Aura v1 REST, mp3 (opt back in)

This is worth a line in the release notes.

Not changed

Core client speak_text() default stays aura-2-asteria-en -- it is the Aura-only v1 REST path (speak.v1.audio.generate); Flux goes through speak_text_stream().

Testing

  • Unit: 20/20 pass, incl. new test_handle_default_model_routes_to_flux (asserts no -m routes to Flux v2, not Aura v1).
  • Manual (branch dg + released SDK 7.5.0, against prod):
    • bare dg speak -> Flux streaming, plays correctly
    • -m aura-2-asteria-en -> Aura v1 REST, plays correctly
    • default + --encoding mp3 -> fails clean, exit 2, no file written

Open question

Flux TTS is currently EA with a single voice (flux-alexis-en); more land at GA (~next month). Decision needed: merge now and ship Flux-by-default against the single EA voice, or hold this until GA when the full roster is available.

Change the default `dg speak` model from aura-2-asteria-en to
flux-alexis-en, so a bare `dg speak` now uses Flux TTS (Speak v2,
WebSocket streaming) out of the box. Routing is unchanged and still
prefix-based, so Aura remains available via `-m aura-*`.

Because the default now takes the v2 streaming path (raw linear16
wrapped in WAV), containerized formats like mp3 require an explicit
`-m aura-*`. Updated --model/agent help and README examples to
reflect Flux-by-default with Aura as opt-in, and added a test
asserting no -m routes to Flux (v2) rather than Aura (v1).

The core client speak_text() default is intentionally left as
aura-2-asteria-en: it is the Aura-only v1 REST path; Flux uses
speak_text_stream().
@GregHolmes GregHolmes self-assigned this Jul 17, 2026
@GregHolmes
GregHolmes requested a review from a team July 17, 2026 12:44
@dg-coreylweathers

Copy link
Copy Markdown

Reviewed — code and docs are correct, tests pass locally (speak 20/20, including the new default-routes-to-Flux test), routing and the Aura REST path are unchanged, and client.speak_text() correctly stays aura-2-asteria-en. Approving the content; EA-single-voice ship is a go on our side.

One thing to fix before merge, and one follow-up.

⚠️ Before merge — signal the breaking change to release-please

The change is an intentional break (bare dg speak -o x.mp3 now fails; default output is WAV/linear16 instead of MP3), but the commit/PR title is a plain feat(speak):. Release-please generates the changelog and version bump from that prefix, so as-is this ships as a patch under "Features" with the break invisible. Since we squash-merge (PR title + body → commit), please:

  • Title → feat(speak)!: default to Flux TTS (flux-alexis-en) instead of Aura 2
  • Add to the body:
    BREAKING CHANGE: bare `dg speak` now defaults to Flux TTS (Speak v2 streaming),
    emitting WAV/linear16 @ 24 kHz instead of MP3; `--container` is ignored on the
    default path. To restore the previous Aura/MP3 behavior, pass `-m aura-2-asteria-en`.
    

(No code change needed — this is purely the release signal. The spec's "add a CHANGELOG entry" step doesn't apply here since release-please auto-generates it.)

Follow-up (non-blocking)

packages/deepctl-core/src/deepctl_core/skill_generator.py:420-443 wasn't updated — the generated agent skill still opens with "…using Deepgram's Aura voices" and lists Aura first, Flux last, which contradicts the new Flux-by-default CLI. Worth reordering to lead with Flux, either here or as a fast follow.

Notes

  • Default + --encoding mp3 fails cleanly before any write (no empty/header-only file) — verified.
  • The 5 test_base.py::test_output_result_* failures pre-exist on main; unrelated to this PR.

@dg-coreylweathers dg-coreylweathers left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved. Fix the feat!: title + BREAKING CHANGE footer before merge; EA-single-voice ship is a go.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants