Emotion tags
Letting the character choose how each line is delivered, and what your voice can actually do with that.
Speech is generated sentence by sentence while the reply is still being written — the first sentence is spoken before the model has finished the third. So anything deciding how a line should sound has to decide it before that line's words exist.
Emotion tags solve that by having the model write the direction into the stream, ahead of the words it describes:
<happy> That's wonderful news. <sad> I just wish she'd been here to see it.The tags never reach the audio, and never reach the stored message. They are directions, not words.
Turning it on
Off by default, under Text Processing → Emotion Tags in the prompting preset. Small models handle it poorly, so it is worth checking your model can before relying on it.
What the model may say
The model is offered the intersection of two answers: whether you enabled the feature, and what the voice can actually do. That list is asked per voice, not per service — an Azure voice supports the styles Azure published for it, a cloning voice supports the clips someone recorded.
A tag no engine honours isn't a harmless no-op. It's tokens spent on nothing, and on engines that read text verbatim it's a word spoken aloud mid-sentence.
Voices reporting nothing are never asked for tags at all.
What each engine does with them
| Engine | How it delivers |
|---|---|
| Azure | The voice's own published style names, plus speaking rate. Many neural voices have no styles. |
| ElevenLabs v3 | An audio tag before the line — its only per-line control. |
| ElevenLabs (pre-v3) | No per-line control. Comes out as style exaggeration and speed, so a sad line and an angry one sound the same. |
| Deepgram Flux | Speed and expressivity, which are dials rather than feelings. |
| Cloning models (Chatterbox, OmniVoice, CSM, Echo) | A different reference clip — see below. |
| F5, Coqui, Orpheus | Nothing usable. They clone a voice but not a delivery. |
Wherever the tag expresses nothing, your configured voice settings stay in charge, so an existing setup sounds exactly as it did.
Affect clips, for cloning voices
A cloning model has no style parameter — the clip is the instruction. Record variants beside the voice file with an .affect- marker:
Anne.wav
Anne.affect-angry.wav
Anne.affect-tender.wavWhatever you write after .affect- is the name. A missing variant is normal, not a misconfiguration — it falls back to the base clip. Clips don't clutter the voice picker; they attach to the voice they belong to.
Clips are all-or-nothing, so Voxta swaps to one only for a clearly-felt line. A mildly annoyed sentence would otherwise get the whole angry performance.
Mood
A character also carries a mood across turns, and the two are reconciled rather than fighting:
- The line wins the tone. A sentence the model marked sad has said something a mood averaged over ten turns cannot. Otherwise a character sounds cheerful through an apology.
- The mood sets how far it goes. A character already in that mood is more of it.
- No tag leaves the mood in charge. Most lines carry no particular intent, and a character cooling over ten turns should still sound cool. Writing
<neutral>explicitly is how the model asks for a plain delivery.
The mood is driven by the tags themselves and nothing else — no extra inference pass. It moves in capped steps, so one sharp line can't flip it, and decays back toward baseline so the first argument of a session doesn't colour every later reply. It is not persisted: a character stuck cold across restarts with no visible reason is a worse failure than starting fresh.
Seeing what happened
Stripping the tags makes the feature invisible when it goes wrong — a flat line looks identical whether the model forgot to mark it or marked something the voice couldn't honour.
The chat inspector puts the tag back in front of its sentence, dimmed when the line inherited it rather than stating it.
ElevenLabs: unrestricted audio tags
ElevenLabs v3 reads ordinary English rather than validating against a list, so Allow Unrestricted Audio Tags (per service, off by default) turns the offered list into examples instead of a ceiling. [through gritted teeth] and [trying not to laugh] are deliveries nobody would think to configure and the engine understands anyway.
Off by default because a tag it doesn't understand is silently ignored rather than reported. Turn it on after listening, not before.