MOSS voice profiles

A conditioned-speech corpus generator: for one reference voice, every emotion at four intensity/containment settings, every VoiceNet dimension at four levels, edge cases and style variants — in English and German, from the same sentence.

1 · The plan

The full corpus plan & costing → What gets built, why, and what it costs. 6,000 voices x 832 conditions = 240 M samples, 523k hours. GPU-hours broken out per condition block and per scale (100 / 500 / 1,000 / 6,000 voices), text sourcing, hard-for-TTS domains, vocal-burst balancing, storage. Written for outsiders.

2 · Listen — speech

Demo grid: old sentence vs written-for-the-condition → The comparison, side by side in one table. Same voice, same adapters, same seeds — only the words differ. All 808 groups, both languages, every emotion at all four settings. Complete voice profiles → Three full profiles of the same reference voice, all 832 conditions each, with every VoiceNet dimension at four levels so the extremes sit side by side. — Profile RW: sentences written per condition The current best configuration. — Voice-converted A/B → Separate Space. All 832 conditions again, each next to its Chatterbox voice-converted version, level-matched at playback. Conversion buys speaker identity (0.507 → 0.726, every group) and costs emotional fidelity — both numbers on every row. Best of three noise draws, selected on the 40-dimension emotion vector. — Profile A: borrowed sentences The baseline it is compared against. — Profile B: +25 % Mediathek LoRA Kept so the null result is audible. — Original demo grid The first grid, 1,617 clips. Superseded by the pages above.

3 · Listen — music

LeVo 2: solo voice, and why the genres missed → Evolutionary prompt search. The genre miss is an out-of-vocabulary problem — LeVo ships 27 genre tags and "opera", "choir" and "a cappella" are not among them, so it falls back to pop. The backing choir is a chorus-section artefact. Solo compliance 66 % → 98 %, genre match 71 % → 96 %, with 115 audio players. Making LeVo 2 fast enough to scale → From 0.67× realtime to 11.7× — a 12.7× speedup, turning the pipeline's bottleneck into its fastest arm. Batching (the code asserted batch 1), static KV cache, CUDA graphs, and a CPU-dispatch bound decode loop. Includes two batch>1 correctness bugs found in stock LeVo. How many singing genres are distinguishable? → 153 solo-voice styles, 765 clips, same lyrics throughout. The answer is ~50–80, not 153 — agreed by three independent representations. Includes a 23040-d music embedding that sees nothing at all, and whether the model can sing as a child. Song models — vocals only, with and without stem separation → Eight arms judged twice: as generated, and as an isolated vocal stem. Three separators (BS-Roformer, MelBand Roformer, Demucs v4) with measured bulk throughput. Includes the library default that made the first benchmark meaningless — with it on, a 30-second clip transcribes as the single word "so". All audio 160 kbps stereo.

4 · Analyses

Does the text carry the emotion? → The controlled experiment. Emotion strength +22 %, genuineness +27 %, blend +39 %, quality flat, WER down 12 %. Includes the four conditions it made worse and a safety failure it produced. Mediathek LoRA dose sweep → 13,760 generations across five merge weights. Nothing happens below full strength; at full strength the generator breaks — and the genuineness metric rewards it for breaking. Earlier cost scenarios → Eight build plans x three inference engines against both budgets. What writing the texts costs → Measured Gemma throughput; a rounding error against speech generation.

5 · Reference

Design manual → Everything needed to reproduce it: condition matrix, which LoRA at which merge strength, prompt templates, ranking formulas, metadata schema, safety gate, storage layout. Execution protocol → Exactly what was run, with the measured result for each dimension.

What it is, in plain language

A speech model can be asked to say the same sentence angrily, quietly angry, softly amused, very fast, with a lot of vocal fry, and so on. This project does that systematically: for a single voice it produces every combination of a large condition grid, keeps 32 candidates of each (200 in this demo), scores them all, and stores everything.

The reason for the German-and-English pairing is the eventual goal: a speech-to-speech translation model that keeps the speaker and the emotional level. To train that you need the same meaning, spoken by the same voice, at the same emotional intensity, in both languages. That is what a "group" here is.

The condition matrix — 832 groups per voice

blockconditionsgroups
Emotions40 emotions × {intense, moderate} × {free-flowing, contained} × {EN, DE}320
VoiceNet dimensions57 dimensions × 4 levels × {EN, DE}456
Edge casesscreams, groans, shivers, laughter, whimpering, crying × {EN, DE}28
Sports commentator× {EN, DE}2
Explicitness× {EN, DE}, subject to an age safety gate2
Character clusters12 character-cluster LoRAs × {EN, DE}, each also rendered through Chatterbox voice conversion for comparison24
total per voice832

Every condition uses the measured best practice for that specific emotion or dimension — the right adapter at the right merge strength with the right prompt phrasing. English and German share the same text slot in 404 of 404 cells, so the pairing the goal depends on actually holds.

What was run

generations323,200 per profile
candidates stored646,917
GPU-hours152
throughput2,126 generations/GPU-hour
failed decodes0.10 %

Every candidate — including the worst-ranked — carries 57 VoiceNet scores, 40 EmoNet scores, genuineness, vocal-burst blend, a 768-d VoiceCLAP embedding, a 192-d speaker embedding with its cosine to the reference, Parakeet-v3 word-level timestamps, a procedural caption, and every score component that produced its rank. Stored as WebDataset tar + parquet, so re-ranking never requires regenerating anything.

Scaling — and the thing that dominates it

Batch size, not the inference engine, is the lever. Measured on this exact workload — LoRA merged, reference conditioning, the real prompts: batch 8 → 3.92× realtime, batch 16 → 5.69×, batch 32 → 7.69×, batch 64 → 8.88×. The demo ran at batch 8; everything now runs at 64. 2.3× for a one-line change, with no new engine, no new dependency, and LoRA adapters still working.

Two things this page previously claimed and that turned out to be wrong: that pipelined decode would give ~3.6× (the port was written and benchmarked — it gives 1.01×, because decode is not a meaningful share of the loop), and that 6,000 voices at the full matrix "is not feasible" (at batch 64 it is ~10 % of one budget).
plan (832 groups/voice)GPU-h @ batch 64% REFORMO left
5,000 × N=1641,8974.4 %
5,000 × N=16 + 900 × N=32 + 100 × N=12863,6046.7 %
5,700 × N=32 + 300 × N=200126,49113.3 %
6,000 × N=32 (flat)100,25310.5 %
6,000 × N=128 (max quality)400,11341.9 %

Full cost scenarios — ten plans × three throughputs, against both budgets, with every assumption stated.

Findings

The text matters more than any conditioning change measured so far. A dozen emotions produced almost no measurable emotion — Bitterness sat at −0.005, Contempt 0.041, Astonishment 0.039 — even with the correct LoRA loaded and active. The cause was not the conditioning. It was that 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. Rewriting each line so its content justifies the target emotion, holding everything else fixed, raised emotion strength +22 %, genuineness +27 % and vocal-burst blend +39 %, left audio quality unchanged and lowered word error rate 12 %. Bitterness −0.005 → 0.613, Contempt 0.041 → 0.842, Hope/Enthusiasm −0.001 → 1.390, Astonishment 0.039 → 2.347; 24 of 28 conditions improved. This single change is larger than every conditioning-side intervention on this pipeline combined, and the text pass costs ~3 GPU-h against ~100,000 for the speech. Full analysis, with audio →
German conditioning holds the speaker much less well than English. Measured over all 323,200 candidates: mean speaker similarity 0.578 in English versus 0.376 in German. German takes are also longer and slower with slightly worse transcription accuracy. Since the entire point is a German↔English corpus that preserves speaker identity, this is the central obstacle, not a footnote, and it should be addressed before scaling.

Honest limitations

Base model moss-tts-local-transformer-4.55b-voice-acting-v2 · emotion adapters · vocal-burst adapters · Mediathek adapters · voice-acting manual · mirror on the HF Space