One voice profile, 84 shared condition groups, 32 candidates each. Everything held fixed except the sentence.
For roughly a dozen emotions the profile produced almost no measurable emotion at all. Bitterness averaged −0.005 on the emotion head across every candidate. Contempt 0.041. Disappointment 0.028. Astonishment 0.039. This was not a scoring artefact — listening confirmed it. The takes were flat, and the emotion classifier's top label for most of them was Interest, the reading you get from someone neutrally reciting a fact.
The emotion LoRA was loaded and active for every one of those groups; that was verified directly. So the interesting question was where the failure actually lived.
Explanation (a) was tested first, and rejected. The cue text had a real defect — a single generic “warm and open” free-expression cue was being used for all 40 emotions, including contempt and bitterness, where it is actively wrong. That was fixed to five family-specific cues. It moved nothing: cold emotions scored 0.323 with the free cue and 0.332 with the contained one, a difference indistinguishable from noise. The cue was a genuine bug, but it was not this bug.
That left (b). The sentences came from a translation corpus, so a group asking for intense, freely expressed bitterness was handed a neutral line about a gym membership in Melbourne. No actor can be bitter about that sentence, because the sentence contains nothing to be bitter about.
Each text slot keeps its original translation-corpus line as a seed, and Gemma 12B (bf16) rewrites it so the content gives the speaker a real reason to feel the target emotion — same topic, same register, roughly the same length. Then the whole profile is regenerated with everything else identical: same reference voice, same emotion LoRAs, same corrected cues, same sampling, N=32 candidates per group, batch 64, Mediathek LoRA at λ=0.
Averaged over every one of the 32 candidates in all 84 shared groups — not cherry-picked takes:
| metric | original text | rewritten text | Δ | relative |
|---|---|---|---|---|
| emotion strength | 1.2926 | 1.5828 | +0.2903 | +22.5% |
| genuineness | 0.3761 | 0.4784 | +0.1023 | +27.2% |
| vocal-burst blend | 2.0438 | 2.8384 | +0.7945 | +38.9% |
| audio quality (DNSMOS) | 3.4020 | 3.3944 | -0.0076 | -0.2% |
| word error rate | 0.1180 | 0.1040 | -0.0140 | -11.8% |
| words / second | 2.7524 | 2.8629 | +0.1105 | +4.0% |
| clip length (s) | 8.4374 | 7.6959 | -0.7415 | -8.8% |
Production keeps the best-scoring of the 32 candidates, so the mean over all candidates understates what a listener receives. Best-of-32 per group:
| metric | original text | rewritten text | Δ |
|---|---|---|---|
| emotion strength | 1.7679 | 2.2061 | +0.4383 |
| genuineness | 1.1088 | 1.3861 | +0.2773 |
| vocal-burst blend | 4.7207 | 5.9063 | +1.1856 |
| audio quality (DNSMOS) | 3.4988 | 3.4968 | -0.0020 |
The gain is not spread evenly. It lands almost entirely on the emotions that were dead before — which is exactly what explanation (b) predicts:
| emotion | original text | rewritten text | Δ |
|---|---|---|---|
| Astonishment Surprise | 0.039 | 2.347 | +2.308 |
| Infatuation | -0.015 | 1.824 | +1.839 |
| Disappointment | 0.028 | 1.499 | +1.470 |
| Disgust | 0.081 | 1.484 | +1.403 |
| Hope Enthusiasm Optimism | -0.001 | 1.390 | +1.391 |
| Embarrassment | -0.010 | 1.233 | +1.243 |
| Helplessness | 0.019 | 1.123 | +1.105 |
| Relief | 0.060 | 1.162 | +1.101 |
| Amusement | 0.185 | 1.218 | +1.033 |
| explicit | 1.661 | 2.669 | +1.008 |
| Fear | -0.015 | 0.885 | +0.901 |
| Awe | 0.733 | 1.570 | +0.837 |
| Distress | 0.000 | 0.818 | +0.818 |
| Contempt | 0.041 | 0.842 | +0.801 |
| Bitterness | -0.005 | 0.613 | +0.619 |
| Fatigue Exhaustion | 0.673 | 1.241 | +0.568 |
| Confusion | 0.009 | 0.564 | +0.555 |
| edge | 2.802 | 3.206 | +0.404 |
| Sexual Lust | 0.225 | 0.533 | +0.308 |
| Shame | 0.006 | 0.314 | +0.307 |
| Elation | 0.025 | 0.309 | +0.284 |
| Intoxication Altered States of Consciousness | -0.027 | 0.011 | +0.037 |
| Jealousy and Envy | 0.035 | 0.069 | +0.033 |
| voicenet | 1.882 | 1.903 | +0.021 |
| Interest | 2.335 | 2.284 | -0.051 |
| sports | 2.009 | 1.764 | -0.245 |
| Emotional Numbness | 0.944 | 0.681 | -0.263 |
| Contemplation | 0.978 | 0.714 | -0.264 |
24 of 28 conditions improved. The emotions that were pinned near zero — Bitterness, Contempt, Disappointment, Astonishment, Embarrassment, Disgust, Fear — are the ones that moved most. Emotions that already scored well moved least, because their seed sentences already happened to contain something to feel.
A = intense & freely expressed, B = intense but contained, C = moderate & free, D = moderate & contained.
| condition | emotion strength | genuineness | vocal-burst blend | |||
|---|---|---|---|---|---|---|
| orig | rewritten | orig | rewritten | orig | rewritten | |
| A | 0.190 | 1.200 | 0.289 | 0.556 | 2.12 | 3.60 |
| B | 0.208 | 0.661 | 0.119 | 0.401 | 1.50 | 2.62 |
| C | 0.417 | 1.035 | 0.250 | 0.463 | 1.87 | 2.71 |
| D | 0.169 | 0.792 | 0.173 | 0.339 | 1.97 | 2.69 |
Condition A gains most (+1.01). That is the expected shape: when the actor is allowed to express the emotion freely, having something real to express is worth the most. Condition B — intense but held back — gains least (+0.45), because containment caps how much of it can reach the surface anyway.
| language | emotion strength | genuineness | ||
|---|---|---|---|---|
| orig | rewritten | orig | rewritten | |
| English | 1.271 | 1.640 | 0.388 | 0.470 |
| German | 1.314 | 1.525 | 0.364 | 0.487 |
Both languages gain. English gains more emotion strength, German more genuineness — consistent with the German side starting from a weaker conditioning baseline, where a clearer text helps the model commit to a reading.
Seed on the left, rewrite on the right, with the shipped take from each run. These are the four biggest movers followed by the two worst regressions.
This has to be written down, because it was caused by the rewrite mechanism itself and it would recur in any similar pipeline.
One seed sentence discussed “the sexualization of society… spread to children”. It happened to be assigned to the Infatuation slot. Asked to rewrite that sentence so the speaker feels infatuation about its topic, the model produced a line savouring “the corruption of society bleeding into the innocence of children”. That is sexualised content about minors, and it was generated from an innocuous seed purely because of the emotion instruction attached to it.
Three defences now run, and all three are needed:
The first version of the output gate did not work. It matched
\b(sexual|sexualiz)\b — and that trailing \b cannot match
“sexualization”, the exact word that mattered. The filter reported zero hits and looked
like it was working. It now uses prefix matching. The rerun with all three defences active
produced zero unsafe outputs.
The dead emotions were never a conditioning failure. They were a text failure. Giving the model words that contain something to feel raised emotion strength +22%, genuineness +27% and vocal-burst blend +39%, at no cost in audio quality and with a 12% lower word error rate.
For scale: this single change is larger than every conditioning-side intervention measured on this pipeline so far, including the Mediathek LoRA dose sweep, the cue-family fix, and the recalibrated selection thresholds — combined. It also costs almost nothing. A unique, condition-matched text set for an entire voice profile runs about 3 GPU-hours, against roughly 100,000 GPU-hours for the speech generation it feeds. It is the cheapest large win available.
Two things are still open. The low-arousal conditions need an inverted rewrite instruction, as described above. And the rewrite currently runs once per text slot — whether a second pass conditioned on the measured emotion of the first attempt would help has not been tested.
Voice profile k325_age3_bg1 ·
86 shared condition groups · 32 candidates per group per arm ·
5,504 generations analysed · Mediathek LoRA λ=0 in both arms ·
rewriter: Gemma 12B bf16 · generator: MOSS-TTS on GH200.