← overview

Voice profiles — listen

One reference voice, rendered through all 832 conditions, three different ways. Every clip below is the take that won its group, with the scores that made it win.

What a "voice profile" is. Take one reference speaker. Ask the model to say something as that speaker in every combination of a large grid: 40 emotions × {intense, moderate} × {freely expressed, held in}, 57 voice-quality dimensions × 4 levels, plus screams, laughter, crying, a sports commentator and more — each in English and German, from the same sentence. That grid is 832 groups. A profile is all of them for one voice.
Profile A — translation-corpus sentences → The baseline. Sentences drawn from the FineTranslations corpus and used as-is. No Mediathek LoRA. This is what the pipeline produced before the text-rewrite experiment. Profile B — the same, plus 25 % Mediathek LoRA → Identical sentences and conditions, with a real-speech adapter merged at λ=0.25. A later dose sweep found this to be a null result — kept published so you can hear that for yourself rather than take it on trust. Profile RW — sentences rewritten to carry the emotion → Same voice, same 832 conditions, but every sentence rewritten so its content gives the speaker a reason to feel the target emotion. Emotion strength +22 %, genuineness +27 %, blend +39 %, audio quality flat, word error rate down 12 %.

How were these takes ranked?

Every group generated many candidates. All of them were scored and stored; the one you hear is whichever scored highest. Nothing is discarded — re-ranking never needs regeneration.

The formula, in one place
reward = (genuineness + wblend·blend + 1.25·target) · (1 − WER) score = reward · durationFloor · lengthCeiling · identityRank · floorPenalty

Four sensors produce the inputs, all automatic:

  • genuineness — does it sound felt rather than performed
  • blend — how naturally non-speech sounds (breaths, laughs, sobs) sit inside the line
  • target — this is the part that changes per dimension; see below
  • WER — word error rate of an ASR pass against the script, so an unintelligible take cannot win by being dramatic

Why multiply by (1 − WER) rather than divide by (1 + WER)? The project manual specifies the dividing form. Measured over 28,698 candidates it is too lenient: a take that rambles past the written line keeps accumulating emotional content, so genuineness, blend and strength all rise while ÷(1+0.79) only scales it by 0.56. One 28-second take of a 20-word line — whose transcript wanders into "meant in staying in the dist…" — outranked an 8-second take of the same line with a quarter of the word errors. Switching to ×(1−WER) moved 28 of 808 winners.

Why raw scores and not z-scores — and what that cost

An earlier version z-scored each term within the group. That sounds fairer but has a flaw: normalising inside a group means a group whose takes are all badly blended still hands its best one a good z-score. Blend then stops competing across groups, and the whole corpus drifts toward flat delivery.

Switching to raw values, measured on the same 28,698 candidates:

metric (median winner)z-scoredrawchange
vocal-burst blend3.654.74+30 %
target strength1.781.87+5 %
genuineness0.7380.626−15 %

The genuineness loss is a real trade, not an oversight: blend and strength are bought with it. It is recorded here rather than buried, because a reader comparing this corpus against another on genuineness alone would otherwise reach the wrong conclusion.

Emotions — intense conditions (A, B)
target = emotion_strength // as measured, higher is better

The straightforward case: the emotion classifier's reading of that emotion, and more is better. Condition A is intense and freely expressed, B is intense but held in.

B additionally gets the containment treatment described under moderate/contained below — being intense and being contained are independent axes here.

Emotions — moderate conditions (C, D)
target = band_fit(emotion_strength, lo, hi) = 1.0 inside the band, decaying linearly outside it

This is the one people find counter-intuitive. A "moderate sadness" group is not scored for being as sad as possible — it is scored for landing in a band. Maximising is what the intense conditions are for. A take that overshoots into full grief is as wrong for this cell as one that is flat.

Contained conditions (C, D) — the two extra terms
wblend = 0.6 (instead of 1.0) reward += 0.5 · z(−vulnerability)

Two adjustments, both because containment is the opposite of letting it out:

  • Blend is weighted down to 0.6. An audible burst is the emotion escaping, which is precisely what a contained take should not do. Rewarding blend at full weight here would select against the condition.
  • A containment term is added: how far below this group's own mean the take's vulnerability sits. This one stays on the z-scale deliberately — "below the group mean" has no meaning as a raw number.
VoiceNet dimensions (tempo, breathiness, vocal fry, …)
target = sign · dim_target, sign = +1 for "high" cells, −1 for "low" cells

Here the target is the dimension being steered, not an emotion. The sign flips for the low end, so an "extremely low tempo" cell is rewarded for being slower, using the same formula as the high end rather than a separate rule.

Without the sign flip, every low cell would be ranked by how much of the dimension it had — i.e. ranked backwards.

Character clusters — the emotion term is switched OFF
target = 0 reward reduces to (genuineness + blend) · (1 − WER) · identity · duration

A character group's target is a voice, not a feeling, and there is no per-character classifier to score against. If the emotion term were left on, the twelve character clusters would be ranked by whichever emotion happened to leak into each take — the dragon would be represented by its angriest reading rather than its most draconic one.

So the term is zeroed and the ranking asks only: clean, in character, long enough, and not accidentally emoting.

Edge cases (screams, sobs, groans) — and why WER is computed differently

These rank like intense emotions, with one important difference in how WER is measured: inline burst tags such as <sobs> are stripped from the reference before WER is computed.

This was a real bug. The code emitted <sobs> while the stripper matched only round brackets, so the tag stayed in the reference text and every burst-carrying take was charged word errors for failing to pronounce the word "sobs". The ranker was selecting against exactly the takes the bursts were meant to improve. After the fix, bursts win: emotion 2.532 → 2.788, vulnerability 4.666 → 5.085.

The four multipliers, and the failures each one prevents
multiplierwhat it does
duration floor (dur / MIN_DUR)², capped at 1. Nothing else in the score preferred a longer take, so a group could be represented by a 1.8-second fragment that scored well because it was short: few words means few chances to misread, so WER goes to zero and the other terms are computed over a near-silent clip. Short takes are crushed rather than banned, so a group where every candidate is short still resolves to its best member.
length ceiling expected duration is words / 2.8 words-per-second; nothing is penalised up to 1.6× that, beyond which the score falls off quadratically. This is the explicit fix for runaway takes that ×(1−WER) alone did not catch — takes over 2.5× expected length dropped from 14 to 7.
identity rank 0.81 + 0.19 · similarity. Speaker similarity is ranked, never gated high, at 19 % weight. The reason is measured: among listener-confirmed same-speaker pairs the median similarity was 0.632 and 55 % fell below the old 0.68 gate — gating there would have thrown away more than half of genuinely correct takes.
floor penalty ×0.25 below a hard 0.40 similarity floor. Not a ban: a take that far off is almost certainly a different speaker, but the group still needs a representative.
Why A and B subsets are ranked separately

Subset A is 32 different sentences; subset B is 16 shared ones rendered across all four sub-conditions. They answer different questions, so a single ranking would let whichever subset happened to draw easier sentences crowd the other out of the top slot the page shows. Ranks are computed within subset; the z-scores stay group-wide so both remain on one scale.

What this ranking does not tell you

Every number above comes from automatic sensors. Their agreement with a human listener on spoken material is only about ρ ≈ +0.21. Treat the ranking as useful, not authoritative.

This project has produced four separate cases of a scorer confidently rewarding broken audio: a genuineness gain that turned out to be a generator running to its length cap; an aesthetics head scoring a model 4.12 while human-facing judges scored it 0/30; the WER stripper described above; and a caption model whose "improvement" tracked a label-noise artefact. Where a number here surprises you, listening is the tie-break, not the score.

The comparison worth making

Open A and RW side by side and listen to Bitterness, Contempt or Disappointment in the "intense · free" column. Same voice, same adapter, same settings — only the words differ.

emotionA (corpus sentences)RW (rewritten)
Bitterness−0.0050.613
Contempt0.0410.842
Disappointment0.0281.499
Hope / Enthusiasm−0.0011.390
Astonishment / Surprise0.0392.347

Emotion-head score on the winning take. Full analysis: Does the text carry the emotion?

Audio quality

Profile RW is now 48 kHz at 160 kbps — regenerated at the model's native rate. Profiles A and B remain 16 kHz mono at ~97 kbps: the pipeline used to resample to 16 kHz before storing, band-limiting everything to 8 kHz, and that ceiling is baked into their data.

Because of that, do not A/B profile RW against profile A on this page to judge the text rewrite — you would be hearing the bandwidth as much as the words. The side-by-side demo grid deliberately keeps both columns at 16 kHz so the only difference there is the text.