Inside the model — what the layer forensics found

28 August 2026 · a plain-language report on four parallel investigations into the 4.55 B voice-acting model's internal representations. Every number here was measured on held-out data with speakers held out; nothing is an estimate. The technical artefacts, the code and the raw grids are in Voice-Acting-Pipeline-WIP under research-log-2026-08/layer-forensics/.

The short version

  1. The model knows what a voice sounds like far better than it knows what it feels. From a single layer you can recover 57 voice-quality dimensions at R² 0.85, and 40 emotion scores at only 0.47. That gap is the central fact of this whole project, and it now has an internal explanation, not just an output-side one.
  2. Everything useful sits in the middle of the network. Voice quality peaks at layer 12, emotion at layer 20, vocal bursts at layers 18–19. Nothing peaks at the top. The last layers — the ones closest to the audio decoder — are among the worst.
  3. Reading several layers at once helps, and the help is real. Six layers instead of one lifts emotion from 0.466 to 0.507. It survives a control that gives the single-layer probe exactly the same number of inputs, so it is information, not capacity.
  4. And you can steer with it — gently. At α = 0.10 on layer 20 the emotion percentile rises 0.435 → 0.584 while the word error rate falls, and a matched random direction moves emotion by 0.014. Above α = 0.3 it all collapses, which is why the first grid — which started at 0.5 — read as a flat negative. The cost is paid in genuineness.
  5. Speaker memorisation is nearly absent, which was the main thing that could have invalidated all of the above. It is real for exactly one attribute: "does this sound genuine".

1. What was actually measured, in one page

The model is a 36-layer transformer that reads a director's brief and writes audio tokens. While it works, each layer holds a 2,560-number "hidden state" for every position. The question of this whole programme is: if you freeze the model and look at those numbers, what can you tell about the performance?

The procedure, concretely:

The score is R²: 0 means the probe does no better than always guessing the average, 1 means perfect. A probe that scores 0.85 has essentially recovered the attribute; one that scores 0.20 has found a hint of it.

The one caveat that limits every number on this page. These are listening activations. A high score means the attribute is written legibly into the model's state while it follows a real recording. It is not evidence that the model uses that information when it generates on its own. Those are different questions, and section 5 is what happened when we tried to answer the second one.

Scale: 217,583 recordings in the main extraction, 38 taps each, 2,560 numbers per tap — 75.5 GB of activations on disk, and roughly 26 GPU-hours of probing on top.

2. W1 — where each thing lives

One probe per layer, predicting all 99 attributes at once: 40 emotion scores, 57 voice-quality dimensions, "genuineness" and "vocal-burst blend". 38 fits cover the entire grid.

whathow manybest layerscore (R²) what speaker + length alone givelayers within 0.01 of best
Voice quality (VoiceNet, 57 dims)57h12 0.8460.2807
  of which performance style (S_*)15 h120.859—9
Genuineness (does it sound real)1h12 0.7190.1976
Emotion (40 EmoNet heads)40h20 0.4730.1084
Vocal-burst blend1h25 0.4350.1054

Read the two headline numbers together. 0.846 against 0.473. The model represents how a voice sounds almost completely, and what it feels about half as well. That is the same asymmetry every generation-side experiment in this project has run into — timing control is solved to a median error of 0.08 s, emotional intensity is not — and it is now visible in the representation itself, before any generation happens.

The easiest and the hardest things to read

most legibleR²least legibleR²
gender (GEND)0.939 jealousy and envy0.209
speech register (REGS)0.924 awe0.239
monotone delivery (S_MONO)0.920 thankfulness / gratitude0.281

The pattern is not random. What is legible is what a listener could name in the first second — gender, register, whether the voice is monotone. What is illegible is what needs the situation to be understood: envy, awe, gratitude. Those are the emotions you cannot identify from a second of sound without knowing what is being talked about, and the model does not encode them either.

Two findings that were not expected

Speaker memorisation is essentially absent. The obvious way for these numbers to be fake is that the probe recognises the speaker and looks up their typical emotion. To test it, the split was made so that no test speaker appears in training at all — 0 of 13,757 test voices leak. Comparing that to a lax split that does leak speakers, the difference at each attribute's own best layer is −0.004 for emotion and −0.003 for voice quality: holding speakers out costs nothing measurable. The exceptions are specific and believable: genuineness (+0.042), concentration (+0.034), sourness (+0.017). Read "genuineness" under a lax split as inflated by speaker identity. Almost nothing else in the set is.
The non-linear probe wins on all 99 attributes. A linear probe assumes the attribute lives along one straight direction in the 2,560-dimensional space. A small neural probe does not. The neural probe is better on every single one of the 99, by a median of +0.043, and the biggest gap by far is genuineness at +0.180. This matters more than it looks: the entire steering idea (section 5) is built on straight directions, and this is the measurement saying those attributes are not straight.

Resolution: re-running a probe with a different random seed moves a score by 0.003 on average and 0.011 at the 95th percentile. Treat two layers whose scores differ by less than about 0.01 as tied — for most attributes the "best layer" is a formality, with a plateau many layers wide.

3. W2 — does reading several layers at once help?

If layer 12 knows the voice and layer 20 knows the emotion, does feeding a probe both beat feeding it either? The search: greedy, beam and random selection over all 38 taps, for ensembles of 2 to 6, on six attribute groups and two corpora — 4,888 fitted combinations, 13 GPU-hours.

The trap, and the control that avoids it. Six layers means six times as many input numbers. A bigger probe scores better on almost anything, so a naive comparison would prove nothing. Every ensemble was therefore compared against two controls at exactly the same input width: the best single layer repeated six times, and the best single layer padded with random noise. All 60 winning combinations beat both. The gain is information from other layers, not capacity.
groupbest singleR² one layerR² six layers gain (mean of 4 seeds)its own noise bandverdict
Emotion, 40 dimsh200.4663 0.5067+0.0385±0.0037 solid — 10× the noise
Voice quality, 57 dimsh120.8529 0.8695+0.0166±0.0003 solid
Performance style, 16 dimsh120.8518 0.8701+0.0182±0.0005 solid
Time-independent, 19 dimsh120.8403 0.8581+0.0188±0.0018 solid
Vocal-burst blendh330.3841 0.4551+0.0616±0.0554 borderline
Genuinenessh230.7086 0.7388+0.0181±0.0244 not separable from noise

The seed replicates are what make this table honest. The two attributes with the largest raw gains — blend at +0.071 and genuineness at +0.030 for a single seed — are also the two noisiest targets, and once you refit at four seeds their gains sit at or inside their own error bars. The two attributes with modest gains are the ones you can rely on. Emotion gains ten times its noise band; voice quality gains fifty times its own.

The layers chosen are informative in themselves

For emotion the winning six are h06 · h12 · h18 · h20 · h21 · h23. Note h06: on its own it ranks thirteenth and no sensible shortlist would have included it, yet it enters at size four and stays. And note that the best pair, h18+h21, are almost the same subspace — their representational similarity is 0.979 — and still gain +0.020 together. Redundancy between two layers does not predict whether combining them helps.

An open question that got closed: performance style vs. time-independent traits

The 57 voice dimensions split naturally into two families: things about the performance (ranting, whispering, dramatic delivery, ASMR) and things about the instrument (age, gender, timbre, resonance). The hypothesis was that these live in different parts of the network.

They do not. Both families have the same best layer (h12) on both corpora. And when the tap set selected for one family is used to predict the other, the cost is −0.0003 / +0.0004 — inside the noise. W1's independent grid says the same thing at single-attribute resolution: h12 is the best layer for 16 of 16 performance axes and 18 of 19 instrument axes; only gender prefers a different layer. One mid-stack band serves both. The apparent difference in which taps got selected is arbitrary tie-breaking between near-equivalent layers.

The one attribute that genuinely lives somewhere else is vocal-burst blend — the only group whose ensembles reach past the semantic middle into h32, h33 and the local transformer, and which loses 0.02–0.08 R² if forced onto another group's layers. It is also the noisiest target, so this is suggestive rather than settled.

4. W4 — the vocal bursts

A separate question with a separate method: a sigh, a gasp, a chuckle, a mumble. Can a layer tell that a burst is present, and can it tell which burst it is? Scored as AUC — 0.5 is coin-flipping, 1.0 is perfect.

questionbest layerAUCbalanced accuracy
Is there a burst at all? (burst clip vs. clean speech)h19 0.97770.923
Which burst is it? (averaged over 8 classes)h18 ——
metadata only (language, source, length)—0.587—

Both plateaus sit in layers 13–23 — the same band as emotion (layer 20), not the band of voice quality (layer 12). Presence and identity are read out of the same place, and that place is the emotional one. The blend scalar, by contrast, peaks six layers deeper at 25.

Per class

burst classusable clipsvs. plain speechAUC vs. a different burstAUC
Chuckle699h200.992 h190.956
Childlike giggle454h190.987 h180.954
Low mumble9,279h200.986 h130.887
Breathy giggle303h190.980 h180.905
Exhausted groan385h130.971 h190.852
Contented sigh1,591h130.959 h130.922
Surprised gasp942h180.954 h180.813
Ahem6,382h180.943 h130.753

Telling a burst from plain speech is close to solved (0.94–0.99). Telling one burst from another is genuinely harder and varies by class — laughter is nearly as separable as it is detectable (0.95), while "ahem" against another burst drops to 0.75. Twenty-three further classes had too few usable clips to report a number at all and are listed with their counts rather than given one.

The finding that constrains all of the above: only 18.4 % of bursts are in the window. The activations are captured over the last 20 % of the audio. Bursts are short (0.28 s median) and the window is long (2.41 s median), so a burst is either inside it or nowhere near it. Only 18.4 % of 118,660 detected bursts fall at least half inside — and that fraction is strongly class-dependent: Yawn 49 %, Scream 37 %, Chuckle 24 %, Contented Sigh 8.7 %, Sharp Inhale 8.0 %.

That is not only a limitation, it is a finding about performance: sighs and inhales cluster near the start of a line, where the capture window never reaches; laughter and screams cluster at the end, where it does. Every probe above uses only in-window bursts; a clip whose burst is outside the window is a mislabelled negative.

Three controls back the headline up. Clips whose bursts are all outside the window still separate at 0.778 — that is the clip-level confound floor, 0.20 below the headline, and it is why the window restriction is not optional. Burst-bearing clips on both sides, matched on burst count, still separate at 0.968. Strictly same-speaker negatives give 0.969, so speaker identity is not the signal.

5. W3 — the steering vectors, and the negative result

If an attribute is legible at layer 20, the obvious next move is to write it there: take the average hidden state of the angriest clips, subtract the average of the middling ones, and add the difference during generation. That library now exists — 156 archetype vectors × 38 layers × 2,560 numbers, 61 MB, one per (attribute, tail): 40 emotions at their high end, 57 voice dimensions at both ends, plus genuineness and blend.

Verification first: all 97 pre-existing vectors were recomputed from the raw activations and match the earlier export bit for bit (maximum difference exactly 0 over 97 × 38 × 3 vectors).

It works — below α = 0.3, which the first grid never tested. The original injection grid started at α = 0.5, where the output is already destroyed, and concluded from that that steering fails. Re-run at α = 0.05, 0.10, 0.15, 0.20 and 0.30 on h20, with a matched random direction at every one of those strengths, the picture is the opposite: emotion moves, the words survive, and the movement is direction-specific.
injected at h20αemotion percentile Δ vs baselineWER (mean / median) share WER ≤ 0.2genuineness (of 6)
nothing (same code path, zero delta)0 0.4354—0.166 / 0.089 0.843.77
the real emotion direction0.050.5267 +0.0910.153 / 0.0910.82 3.64
the real emotion direction0.100.5840 +0.1490.115 / 0.0910.91 3.15
the real emotion direction0.150.6224 +0.1870.229 / 0.1360.75 2.92
the real emotion direction0.200.6155 +0.1800.285 / 0.2000.51 2.41
the real emotion direction0.300.6595 +0.2240.545 / 0.4930.27 1.90
a random direction, same size0.100.4490 +0.0140.132 / 0.0880.84 3.69
a random direction, same size0.200.4395 +0.0040.118 / 0.0910.85 3.90

The random control is what makes this a result. At α = 0.5 and above a random direction did as much damage as a real one, which is why the first read was that the perturbation, not its content, was doing the work. Below 0.3 the two separate cleanly. Paired over the same 24 prompts, the real direction beats the random one on emotion by +0.135 at α = 0.10 (t = 3.11, higher on 16 of 24 prompts) and by +0.193 at α = 0.15 (t = 3.76, 17 of 24). The random direction moves emotion by +0.014 at α = 0.10 (t = 0.48) — nothing.

α = 0.10 is free. Emotion rises 0.435 → 0.584 while the word error rate falls from 0.166 to 0.115 and the share of clean clips rises from 0.84 to 0.91. Nothing was paid for that except genuineness.

And genuineness is what it costs. On the real direction it falls monotonically — 3.77, 3.64, 3.15, 2.92, 2.41, 1.90 — while the random direction holds it at 3.6–4.2 all the way. That is exactly the geometry W3 measured and no longer just a correlation: the cosine between an emotion direction and the quality axis runs −0.62 to −0.95, so pushing a voice towards an emotion pushes it away from what the quality scorers reward. The low-α sweep turns that measurement into a causal statement, and it is the honest price list for this control: emotion is bought with perceived authenticity, at roughly 0.6 of 6 for the first 0.15 of emotion percentile.

Above 0.3 everything in the original grid still stands: at α = 0.5 the WER is 1.139, at 2.0 the duration error is 7.66 s, and a random direction at α = 1.0 reaches WER 2.065. The error was not in those numbers, it was in reading a curve from its far tail. 264 generations, 11 configurations, 24 prompts × 4 samples each, same scorers and same prompt template as every other evaluation in this project.

Why the far tail behaves as it does — three measurements, not a story

Also worth knowing before using the library: 32 of the 40 emotion heads have a "low" tail that is a tie at zero, and for 25 of them the low bucket and the middle bucket are the same clips. "Negative anger" is not defined by this library. 34 of the 156 rows carry a small-bucket warning flag.

6. The one thing that does not fit

Decodability and leverage point in opposite directions. The layer nearest the audio decoder — h36, the final normalisation, and loc, the local transformer — is where the information has to be if the model is going to act on it. Those are also the weakest taps for emotion: 0.342 and 0.339, against 0.473 at layer 20.

So the emotional information is clearest 16 layers before the point where it would have to be used, and by the time it reaches the decoder it has thinned out. Two readings fit the data equally well right now, and telling them apart is the most valuable open experiment in this programme: either the model computes emotion in the middle and then discards most of it, or the middle layers hold a rich description that the last layers compress into the few dimensions the audio codec actually needs. The first would be a defect worth fixing; the second would be normal and would mean steering has to happen early or not at all.

7. What this changes in practice

  1. Stop trying to fix emotional intensity with the training objective. Five GRPO runs and seven preference runs did not move it; the representation now says the information is thin where it would have to be used. The only lever that has ever moved it is more extreme training data — the emotion adapters trained on the top 1 % moved the score from 0.408 to 0.492 monotonically in merge weight.
  2. If you probe, probe the middle, and probe several layers. Layer 12 for anything about the voice, layer 20 for anything about feeling, layers 18–19 for bursts. Six layers instead of one is worth +0.039 on emotion and it is not a capacity artefact.
  3. The steering vectors are usable at α ≤ 0.15, and only there. Below that the effect is direction-specific and the words survive; above 0.3 the output collapses. Anything built on them has to carry the genuineness cost and the random-direction control with it.
  4. The capture window needs to move before vocal bursts can be studied properly. 82 % of bursts are invisible to the current extraction, and which ones are invisible depends on the class.
  5. Genuineness is the one attribute where speaker identity matters. Any measurement of it under a lax split is inflated by about 0.04–0.07.

8. Where everything is

workstreamwhat it producedwhere
W1 per-layer, per-attribute decodability the 38 × 99 matrix, best layer per attribute, seed noise, the reproduction check layer-forensics/w1/ — start at layer_suitability.html
W2 layer ensembles 4,888 fitted combinations with controls and seed replicates layer-forensics/w2/ — ensembles.html
W3 archetype vectors 156 × 38 × 2,560 float32, manifest, diagnostics, the reconstructed steering grid layer-forensics/w3/ — archetypes.html
W4 vocal-burst classes presence and identity by layer, five designs, window coverage layer-forensics/w4/ — bursts.html

9. Corrections made while writing this

Four things in the earlier write-ups were wrong and are now fixed in the repository. They are listed because a research log that only records successes is not one.

Method note carried over from W1: nothing — not a mean, not a standard deviation, not a regularisation strength, not an early-stopping decision — was ever fitted on test data, and the split was held fixed across all 38 taps.