Steering Follows Geometry, Not Labels: Emotion Directions in a Full-Duplex Speech Model
Organizations: Independent Researcher
Abstract
Full-duplex voice agents need to modulate emotion and delivery during real-time conversations, when de-escalating a complaint, carrying urgency in dispatch, softening a clinical result. Emotion and delivery control is well studied for TTS and turn based models through prompt-conditioned synthesis, reference-conditioned synthesis and activation steering; PersonaPlex controls identity in a duplex model but not affect. We study emotion steering in Moshi, a fully open sourced full-duplex speech language model, across four emotions, using mean-difference activation steering, which costs only a few vector additions per frame and no retraining. We show that emotion is linearly decodable from Moshi's residual stream, but activation steering is only partially achievable, and unevenly so; as happy, angry and surprise steer towards a shared direction while sad is distinctly steerable. We also show that the shared component across the three emotions cannot simply be projected away from all the emotions equally.
Figures & tables
| contrast | chance | L0 | L8 | L24 | best (layer) |
|---|---|---|---|---|---|
| angry vs happy | 0.500 | 0.567 | 0.692 | 0.750 | 0.767 (27) |
| angry vs surprise | 0.500 | 0.717 | 0.908 | 0.875 | 0.925 (11) |
| happy vs surprise | 0.500 | 0.717 | 0.758 | 0.742 | 0.792 (17) |
| angry vs sad | 0.500 | 0.767 | 0.867 | 0.850 | 0.892 (31) |
| happy vs sad | 0.500 | 0.800 | 0.892 | 0.892 | 0.933 (13) |
| sad vs surprise | 0.500 | 0.783 | 0.942 | 0.933 | 0.967 (13) |
| real speech | forced text | free duplex | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| condition | P | arg% | P(tgt) (% c.) | arg% | rival | WER | P(tgt) (% c.) | arg% | rival | WER |
| unsteered | 0.924 | 92.2 | 0.635 | 65.7 | — | 24.3 | 0.505 | 48.6 | — | 10.7 |
| angry steered | 0.717 | 71.9 | 0.177 (25%) | 18.3 | 0.328 happ | 32.2 | 0.189 (26%) | 19.2 | 0.370 happ | 13.5 |
| happy steered | 0.633 | 64.1 | 0.481 (76%) | 49.3 | 0.276 surp | 61.8 | 0.331 (52%) | 31.4 | 0.150 surp | 20.2 |
| sad steered | 0.448 | 45.3 | 0.650 (145%) | 68.6 | 0.037 happ | 51.4 | 0.313 (70%) | 32.1 | 0.199 happ | 23.5 |
| surprise steered | 0.458 | 45.3 | 0.136 (30%) | 13.6 | 0.463 happ | 71.5 | 0.143 (31%) | 13.3 | 0.464 happ | 35.6 |
| condition | P(neutral) | P(happy) | WER% | voiced s |
|---|---|---|---|---|
| unsteered | 0.599 | 0.181 | 24.7 | 1.98 |
| random 0 | 0.569 | 0.159 | 26.1 | 1.93 |
| random 1 | 0.526 | 0.197 | 21.8 | 1.98 |
| random 2 | 0.601 | 0.189 | 21.3 | 1.98 |
| random 3 | 0.537 | 0.237 | 28.7 | 1.96 |
| angry steered | 0.042 | 0.328 | 32.2 | 2.32 |
| condition | angry | happy | sad | surpr. | neutral |
|---|---|---|---|---|---|
| unsteered | 0.001 | 0.163 | 0.035 | 0.004 | 0.635 |
| angry | 0.177 | 0.328 | 0.032 | 0.084 | 0.042 |
| real | 0.717 | 0.030 | 0.001 | 0.001 | 0.154 |
| happy | 0.007 | 0.481 | 0.057 | 0.276 | 0.018 |
| real | 0.005 | 0.633 | 0.002 | 0.006 | 0.160 |
| sad | 0.008 | 0.037 | 0.650 | 0.015 | 0.134 |
| first 1.2 s | first 2.0 s | whole clip | ||||
|---|---|---|---|---|---|---|
| condition | P(tgt) | rival ( ) | P(tgt) | rival ( ) | P(tgt) | rival |
| angry steered | 0.122 | 0.241 happ (710) | 0.154 | 0.248 happ (555) | 0.177 | 0.328 happ |
| happy steered | 0.409 | 0.080 sad (718) | 0.433 | 0.086 surp (676) | 0.481 | 0.276 surp |
| sad steered | 0.361 | 0.084 happ (717) | 0.450 | 0.051 surp (699) | 0.650 | 0.037 happ |
| surprise steered | 0.125 | 0.376 happ (714) | 0.104 | 0.333 happ (600) | 0.136 | 0.463 happ |
| condition | angry | happy | sad | surpr. | neutral |
|---|---|---|---|---|---|
| unsteered | -0.363 | 0.118 | 0.305 | -0.414 | 0.579 |
| angry steered | -0.023 | 0.284 | -0.043 | -0.048 | -0.118 |
| real angry | 0.677 | -0.199 | -0.075 | -0.353 | 0.011 |
| happy steered | -0.261 | 0.394 | -0.197 | 0.330 | -0.339 |
| real happy | -0.182 | 0.563 | 0.036 | -0.287 | 0.067 |
| sad steered | -0.262 | -0.018 | 0.665 | -0.422 | 0.228 |
| condition | P(tgt) | % ceil. | strongest rival | WER% | |
|---|---|---|---|---|---|
| angry steered | 1.0 | 0.184 | 26 | 0.334 (happ) | 32.2 |
| 0.5 | 0.288 | 40 | 0.162 (happ) | 22.6 | |
| 0.0 | 0.016 | 2 | 0.040 (happ) | 23.0 | |
| happy steered | 1.0 | 0.503 | 79 | 0.279 (surp) | 62.4 |
| 0.5 | 0.510 | 80 | 0.175 (surp) | 65.2 | |
| 0.0 | 0.205 | 32 | 0.115 (sad) | 73.5 |
| emotion | recording ( ) | prime ( ) | continuation ( ) | prime/rec.% | gains most | silent% |
|---|---|---|---|---|---|---|
| angry | 0.791 (67) | 0.315 (59) | 0.073 (15) | 40 | neutral 0.06 0.27 | 85 |
| happy | 0.663 (64) | 0.563 (52) | 0.234 (16) | 85 | neutral 0.03 0.12 | 84 |
| sad | 0.720 (68) | 0.470 (63) | 0.314 (15) | 65 | neutral 0.17 0.33 | 85 |
| surprise | 0.593 (75) | 0.459 (66) | 0.151 (14) | 77 | happy 0.08 0.20 | 86 |
| condition | P(tgt) | real speech | % real | through codec | % codec |
|---|---|---|---|---|---|
| angry | 0.177 | 0.717 | 25 | 0.315 | 56 |
| happy | 0.481 | 0.633 | 76 | 0.563 | 85 |
| sad | 0.650 | 0.448 | 145 | 0.470 | 138 |
| surprise | 0.136 | 0.458 | 30 | 0.459 | 30 |
Appendix figures & tables2 assets
Supplementary material from the paper’s appendix.
Appendix
| run | condition | kept | total | dropped% |
|---|---|---|---|---|
| forced text | unsteered | 662 | 720 | 8.1 |
| forced text | angry | 710 | 720 | 1.4 |
| forced text | happy | 718 | 720 | 0.3 |
| forced text | sad | 717 | 720 | 0.4 |
| forced text | surprise | 714 | 720 | 0.8 |
| duplex | unsteered | 72 | 250 | 71.2 |
| condition | P(tgt) | % ceil. | strongest rival | WER% | |
|---|---|---|---|---|---|
| angry steered | 1.0 | 0.184 | 26 | 0.334 (happ) | 32.2 |
| 0.5 | 0.288 | 40 | 0.162 (happ) | 22.6 | |
| 0.25 | 0.119 | 17 | 0.081 (happ) | 15.3 | |
| 0.0 | 0.016 | 2 | 0.040 (happ) | 23.0 | |
| happy steered | 1.0 | 0.503 | 79 | 0.279 (surp) | 62.4 |
| 0.5 | 0.510 | 80 | 0.175 (surp) | 65.2 |