What would it cost to write the texts instead of borrowing them?

Measured throughput for Gemma-4-E4B on this cluster, extrapolated to the full corpus

The problem this would solve. Right now every sentence comes from a translation corpus, so a group asking for "intense, freely expressed bitterness" is handed a neutral sentence about a gym membership or a court ruling. The actor is given nothing to be bitter about.

That is not a hypothetical complaint — it is measurable. Across 3,000 clips, Bitterness never exceeded 0.02 on the emotion head and the generations collapsed to a neutral "Interest" reading voice; Infatuation and Fear behaved the same way. Contempt, which happened to be paired with a sentence containing an actual judgement, reached 0.661.

So: write each line to fit its condition. This page prices that.

Measured throughput

Gemma-4-E4B-it on one GH200, plain transformers, batched, generating lines of the real prompt shape and length (30–50 words, ~110 new tokens):

batchtokens/slines/speak VRAM
323796.816.7 GB
6466311.617.5 GB
128129922.818.6 GB

Scaling is close to linear across this range and VRAM barely moves (16.7 → 18.6 GB), so batch 128 is not near any limit — larger batches would very likely go further. Batch 128 is used as the conservative baseline below.

How many lines are needed

A voice needs 125 distinct texts, not 832: the four intensity/containment conditions of one emotion deliberately share a sentence, and English and German are translations of the same line. So it is 125 slots × 2 languages = 250 lines per text set.

The open choice is how many distinct sets to make. One set shared by all 6,000 voices is cheapest but means every voice says the same words; a unique set per voice is the richest corpus.

The cost

scalemodelengineGPU-hcore-h % REFORMO left
one shared text set for all voices
250 lines
Gemma-4-E4B-it (MEASURED)transformers, batch 128 (MEASURED)0.000.000 %
Gemma-4-E4B-it (MEASURED)vLLM (assumed 6×)0.000.000 %
Gemma-4-E4B-it (MEASURED)SGLang (assumed 8×)0.000.000 %
Gemma-3-12B bf16 (assumed ⅓ speed)transformers, batch 128 (MEASURED)0.010.000 %
Gemma-3-12B bf16 (assumed ⅓ speed)vLLM (assumed 6×)0.000.000 %
Gemma-3-12B bf16 (assumed ⅓ speed)SGLang (assumed 8×)0.000.000 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)transformers, batch 128 (MEASURED)0.000.000 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)vLLM (assumed 6×)0.000.000 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)SGLang (assumed 8×)0.000.000 %
100 distinct sets
25,000 lines
Gemma-4-E4B-it (MEASURED)transformers, batch 128 (MEASURED)0.3220.000 %
Gemma-4-E4B-it (MEASURED)vLLM (assumed 6×)0.140.000 %
Gemma-4-E4B-it (MEASURED)SGLang (assumed 8×)0.030.000 %
Gemma-3-12B bf16 (assumed ⅓ speed)transformers, batch 128 (MEASURED)0.9660.000 %
Gemma-3-12B bf16 (assumed ⅓ speed)vLLM (assumed 6×)0.2110.000 %
Gemma-3-12B bf16 (assumed ⅓ speed)SGLang (assumed 8×)0.180.000 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)transformers, batch 128 (MEASURED)0.5370.000 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)vLLM (assumed 6×)0.160.000 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)SGLang (assumed 8×)0.150.000 %
1,000 distinct sets
250,000 lines
Gemma-4-E4B-it (MEASURED)transformers, batch 128 (MEASURED)3.02190.000 %
Gemma-4-E4B-it (MEASURED)vLLM (assumed 6×)0.5370.000 %
Gemma-4-E4B-it (MEASURED)SGLang (assumed 8×)0.4270.000 %
Gemma-3-12B bf16 (assumed ⅓ speed)transformers, batch 128 (MEASURED)9.16580.001 %
Gemma-3-12B bf16 (assumed ⅓ speed)vLLM (assumed 6×)1.51100.000 %
Gemma-3-12B bf16 (assumed ⅓ speed)SGLang (assumed 8×)1.1820.000 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)transformers, batch 128 (MEASURED)5.13650.001 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)vLLM (assumed 6×)0.8610.000 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)SGLang (assumed 8×)0.6460.000 %
6,000 — a unique set per voice
1,500,000 lines
Gemma-4-E4B-it (MEASURED)transformers, batch 128 (MEASURED)18.31,3160.002 %
Gemma-4-E4B-it (MEASURED)vLLM (assumed 6×)3.02190.000 %
Gemma-4-E4B-it (MEASURED)SGLang (assumed 8×)2.31640.000 %
Gemma-3-12B bf16 (assumed ⅓ speed)transformers, batch 128 (MEASURED)54.83,9470.006 %
Gemma-3-12B bf16 (assumed ⅓ speed)vLLM (assumed 6×)9.16580.001 %
Gemma-3-12B bf16 (assumed ⅓ speed)SGLang (assumed 8×)6.94930.001 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)transformers, batch 128 (MEASURED)30.52,1930.003 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)vLLM (assumed 6×)5.13650.001 %
Gemma-3-12B 4-bit quantised (assumed 0.6×)SGLang (assumed 8×)3.82740.000 %
The answer: it is negligible. Even the most extravagant option — a unique text set for every one of the 6,000 voices, 1.5 million written lines — costs about 3 GPU-hours under the vLLM assumption. The speech generation for the same corpus costs 100,253 GPU-hours.

Writing the texts is 0.00 % of what it costs to speak them. Even with a 12B model at bf16 and no serving engine at all, it stays a rounding error. There is no cost argument for reusing borrowed sentences.

Which model

optionspeed vs measurednote
Gemma-4-E4B-it1.0× (measured) Already cached here and already used for the DramaBox prompt generation, so it is the known quantity. ~4 B active parameters.
Gemma-3-12B, bf16~⅓ (assumed) Roughly three times the active parameters. Better writing, and at these volumes the extra cost is still irrelevant.
Gemma-3-12B, 4-bit~0.6× (assumed) Quantisation mainly buys VRAM headroom, which lets the batch grow — that is where the real gain would come from, not from the arithmetic itself. Not worth the quality risk here, since cost is not the binding constraint.
What is measured and what is not.

Recommendation

  1. Write the texts. The cost argument for borrowing them does not survive contact with the numbers, and the borrowed sentences are a plausible cause of the emotion collapse.
  2. Start with 1,000 distinct sets (250,000 lines, well under a GPU-hour with a serving engine) and sample them across the 6,000 voices. That already removes the "every voice says the same thing" problem; a unique set per voice can follow if it proves useful.
  3. Test the hypothesis first, cheaply. Regenerate only the emotions that currently collapse — Bitterness, Infatuation, Fear, Contentment — with written-to-fit lines, and check whether the emotion head moves. That is a few GPU-minutes of text and a couple of GPU-hours of speech, and it settles whether the text is really the limiter before anything is rebuilt at scale.

Throughput measured 1299 tok/s at batch 128 on a single GH200; core-hours at 288 per node-hour and 4 GPUs per node; REFORMO remainder 68,709,721 core-h.