Swap the TTS engine, keep the voice: Sonic 3.5 to 3.6 on Sume
Cartesia treats the TTS model and the voice as separate things. On Sume the model id and voice id are separate fields, so you can A/B 3.5 and 3.6 on one voice.

Yes: on the Sume TTS Router the model id and the voice are separate request fields, so you can keep one voice id and change sonic-3.5 to sonic-3.6 to compare. One exception is documented: sonic-preview is not compatible with pro voice clones and returns voice_model_mismatch.
Always listen before you switch a production voice. A model upgrade can change delivery even when the voice id is the same.
What Cartesia says
The Cartesia model-versus-voice post explains that the model and the voice are separate, and that model types differ: fixed-speaker, multi-speaker and zero-shot cloning. It does not say how voices behave when a model is upgraded, so do not assume portability from that page. The latest-models doc says Sonic 3.6 is compatible with 3.5, lists sonic-3.6, a dated snapshot form sonic-3.6-YYYY-MM-DD, and sonic-preview.
How the Sume request looks
In the TTS Router contract the model field is required and takes sonic-3.6, sonic-3.5, sonic-3, sonic-latest (an alias for 3.6) or sonic-preview. The voice comes from avatar_id, avatar_handle, or voice.id, which is a TTS voice UUID or a library id of the form voi_ plus 32 hex characters. The two never share a field, so changing one leaves the other alone.
Every completed TTS job records the model id, voice, language, output format and generation config, which gives you a ledger for the comparison.
| Model id | Note |
|---|---|
| sonic-3.6 | Current Sonic generation |
| sonic-3.5 | Previous generation, still callable |
| sonic-3 | Older generation |
| sonic-latest | Alias that points at 3.6 |
| sonic-preview | Beta; not compatible with pro voice clones (voice_model_mismatch) |
An A/B protocol
Pick one voice and one 30-second script with numbers, names and a question. Generate with sonic-3.5 and sonic-3.6, same language, same generation config. Compare pace, emphasis and pronunciation of the hard words. If you pin ids, you stay on the version you tested; if you use sonic-latest, your audio may change when the alias moves.
- Pin sonic-3.6 in production once it passes.
- Use sonic-latest only where drift is acceptable.
- Keep sonic-preview out of cloned-voice workflows.
- Re-run the test set after any alias change.
Related checks
The mismatch post covers the error, and the emotion, speed and volume post covers the generation_config fields that you should hold constant while you compare.
Sources
Related posts
More in Developers
- Swift 6.4 CryptoKit: verify a Sume webhook signature
Verify x-sume-webhook-signature in Swift with CryptoKit HMAC<SHA256>: timestamp window, comma-separated entries, constant-time compare, empty secret refused.
- Swift 6.4 URLSession: poll a Sume job with async/await
Swift 6.4 shipped on 15 September 2026. An async URLSession loop for GET /v1/jobs/:id/status that honors next_poll_after_seconds and a 20-minute deadline.
- SWR refreshInterval as a function: poll a Sume job and stop
SWR accepts a function for refreshInterval that receives the latest data. Return Sume's next_poll_after_seconds while running and 0 once terminal is true.
- SWR refreshWhenHidden is false: a hidden tab stops polling Sume jobs
SWR stops polling in a hidden tab by default, but a Sume job keeps running and billing. Store the job id and resume the poll on focus instead of resubmitting.
Written by Sume