« All posts

Emotion on cloned voices in Qwen3-TTS: a 25 MB graft and steering vectors

A new 25 MB .qvoice graft format brings emotion control to cloned voices in Qwen3-TTS. Combining steering vectors with CSP fine-tuning preserves timbre while enabling six core emotions plus seven emotion blends.

Qwen3-TTS originally shipped with nine neutral preset voices, and cloned voices were flat and emotionless — large clone files also stripped away the internal state emotion tools needed. The team solved this with a roughly 25 MB .qvoice "graft" format that keeps the CustomVoice transformer weights and stores only the delta needed for a given voice, making it small enough to share while preserving full prosody and keeping the emotion machinery functional.

Getting there involved abandoning several approaches — task-arithmetic vectors, x-vector emotion injection, per-language dense fine-tunes, and curated seed palettes — none of which produced reliable, selectable, timbre-preserving emotion on cloned voices. The recipe that finally worked has two parts: preset voices need only a lightweight activation-steering vector added to the residual stream, while cloned voices require that same vector combined with a small CSP fine-tune (.expr) trained on real emotional speech, plus an English instruct prompt. No single piece alone is sufficient.

Because emotions are directions in activation space, they can be summed: combining anger and disgust vectors yields contempt, fear and surprise yield awe, and so on — producing seven new emotion blends with no additional training. Inline [emotion] tags let a single prompt switch emotions sentence by sentence, and the CLI, inline tags, and HTTP server now all route through the same steering recipe, so an emotion mix found on the command line behaves identically through a server request.