The trajectory corpus

Ten and a half million ordered lists of clips, each one a single speaker walking a single emotional or vocal dimension from one end towards the other. It contains no audio at all — every row is a specification that names the clips by identifier and records where on the dimension each step sits. It exists because a model that can hit “angry” on demand still has to be able to get angry gradually, and nothing in this project measured that.

LAION · MOSS voice-acting line · published 28 August 2026. Public subset: huggingface.co/datasets/laion/moss-va-trajectory-corpus (7,638,961 rows, 419 MB, CC-BY-4.0). The unfiltered corpus (10,653,713 rows, 581 MB) is kept private for the reason given in §6.

Contents
  1. Why a corpus of trajectories
  2. What is in a row
  3. The four construction families
  4. Size and shape
  5. Where the clips come from
  6. What is held back, and one open judgement call
  7. How to use it, and what you have to supply yourself
  8. Limitations

1. Why a corpus of trajectories

Every measurement in the main technical report is a measurement of one utterance in isolation. A clip is generated, four scorers are run on it, and it is compared against what the prompt asked for. That is the right unit for “can this model perform contempt at the 95th percentile”, and it is the wrong unit for almost everything a director actually asks for.

Direction is about change. A line reading is built out of a starting state, a movement and an arrival. The interesting instructions are “start polite and let it curdle”, “come down off it slowly”, “he gets angrier with every sentence”. None of those is expressible as a single target percentile, none of them can be scored by running an instrument on one clip, and consequently nothing in this project has ever trained on or evaluated one.

A trajectory is the smallest object that makes that measurable: an ordered list of clips from one speaker in which one measured dimension moves monotonically. Because every clip in the underlying corpus already carries the full 40-emotion and 57-VoiceNet annotation described in the main report, such sequences can be mined rather than recorded. The corpus is what falls out when you do that exhaustively.

What this is not. It is not a dataset of emotional arcs performed by actors, and it is not a set of recordings of anyone deliberately becoming angry. It is a selection over existing annotated speech: clips that happen to sit at increasing values of one dimension, from one speaker, ordered. Whether such a sequence sounds like a genuine emotional progression when played back is exactly the question the corpus is meant to let someone ask, and it has not been asked yet.

2. What is in a row

A row is a specification, not a container. The whole 7.6-million-row public release is 419 MB precisely because there is no audio in it — roughly 55 bytes per trajectory.

FieldMeaning
uidsThe trajectory itself: comma-separated clip identifiers, in order. This is the payload; everything else describes it.
speakerThe speaker all clips in the row share. Every trajectory is within one speaker by construction — otherwise a “rise in anger” would be confounded with a change of voice.
dataset, lang, lang_isoProvenance and language of the source clips.
family, ruleHow the trajectory was constructed — one of the four families of §3, with its rule code (B1, VN1, PXR, AB2).
dim_a, dim_bThe dimension or dimensions being walked, named in the corpus's own vocabulary — e.g. emo_Contemplation. dim_b is not confined to the two-sided family: the example below is a single-dimension emotion row that carries one anyway.
d_a, d_bThe total distance covered on each dimension from the first clip to the last.
step_a, step_bThe per-step distance — the granularity of the walk.
T, C, kThe selection constants: T the monotonicity threshold (how strictly each step must move in the intended direction), C the consistency threshold, and k the number of steps.
qmax, cmaxQuality bounds the trajectory satisfies, so a consumer can filter for cleanly recorded sequences without re-scoring anything.
contiguousWhether the clips are adjacent in the source recording — see §4, because this is the field that most changes what a row means.
total_durTotal duration of the referenced audio, in seconds.
emit_frac, spk_basis, proxy_map, track Selection bookkeeping — which sampling fraction produced the row, what speaker basis was used, which proxy mapping applied, and which generation track it belongs to. Kept so the build is reconstructible.

contiguous deserves the explanation. A trajectory whose clips are adjacent segments of one continuous recording is a genuine progression: the speaker really did move that way, in real time, in one take. A trajectory assembled from non-adjacent clips of the same speaker is a construction — the values move monotonically, but the movement never happened as a performance. Both are useful and they are not the same object, which is why the flag is on the row rather than being applied as a filter before release. 59.3 % of the full corpus is contiguous; 82.7 % of the public subset is, because the sources held back for publication reasons happen to be the ones that contributed most of the non-contiguous material.

One thing the schema does not record

There is no endpoint column. d_a and d_b give the distance covered and step_a / step_b the per-step size, but the absolute value of the dimension at the first and last clip is not stored. A consumer who needs to know that a trajectory runs from the 30th to the 80th percentile of anger — rather than merely that it covers 0.26 of the axis — has to re-derive it from the annotation of the named clips. This is worth stating because the corpus is otherwise easy to mistake for a self-contained description of an arc, and it is not: it is a description of a movement.

2.1 A row, verbatim

The first row of the public file, unedited:

dataset      mls
rule         B1
family       emotion
T            0.2
C            0.25
k            2
speaker      10065
track        10065|esther_00_fillion_64kb.mp3
lang         french          lang_iso   fr
spk_basis    exact
dim_a        emo_Contemplation             d_a  -0.2555   step_a  0.2555
dim_b        emo_Thankfulness_Gratitude    d_b  +0.2271   step_b  0.2271
qmax         0.2271          cmax       0.2271
contiguous   true
total_dur    29.52
emit_frac    0.6858
proxy_map    null
uids         10065_10699_000250,10065_10699_000203

Two steps, from one Multilingual LibriSpeech speaker, contiguous in the source, 29.5 seconds of referenced audio, walking contemplation downward while gratitude rises. The whole row is 24 columns and about 300 characters. That is the entire object.

3. The four construction families

FamilyRuleWhat it walksFullPublic
emotionB1One emotion head, monotonically — the straightforward case. A speaker's clips ordered by increasing (or decreasing) score on one of the 40 emotion heads.5,069,8203,545,392
voicenetVN1One VoiceNet dimension — arousal, tension, pitch range, breathiness, pace and the rest. The same construction on the 57-dimension vocal description rather than on emotion.3,072,0002,160,000
proxy_tailliftPXRA proxy dimension driven into its tail. Where a dimension's own extreme is too thinly populated for a speaker to supply a walk, a correlated dimension stands in and the trajectory lifts that instead — which is how the corpus reaches the extremes at all for the rarer axes.1,260,345977,981
emotion_twosidedAB2Two emotions at once, moving in opposite directions — one rising while the other falls. This is the family that expresses a change of state rather than an intensification: relief displacing fear, contempt displacing affection.1,251,548955,588

The two-sided family is the smallest and by some distance the most interesting one. A single-dimension walk asks the model to do more of something. A two-sided walk asks it to trade — and every acting note about a turn, a realisation or a change of heart is a trade, not an intensification. If any part of this corpus turns out to be the useful part, that is the prediction.

4. Size and shape

Full corpusPublic subset
Trajectories10,653,7137,638,961 (71.7 %)
Distinct clips referenced24,922,34317,722,101
Speakers1,507,0641,214,241
Referenced audio114,920 h74,858 h
Clips per trajectory, mean3.523.51
Contiguous in the source59.3 %82.7 %
File size581 MB
580,816,509 B = 554 MiB
419 MB
419,038,652 B = 400 MiB

Steps per trajectory in the public subset:

StepsTrajectoriesShare
21,611,01721.1 %
32,303,10430.2 %
41,974,48125.8 %
51,750,35922.9 %
total7,638,961100 %

The full corpus has the same shape: 2 → 2,205,844 · 3 → 3,193,827 · 4 → 2,773,292 · 5 → 2,480,750, which likewise sums exactly to 10,653,713.

Those counts sum exactly to their row totals, so the histogram is complete: there are no trajectories of six steps or more in either version, and the mean of 3.51 is a mean over a range of 2 to 5. That is worth stating plainly because “10.6 million trajectories” invites a picture of long arcs, and the real object is short: a two-to-five-clip walk. A two-step trajectory is a before and an after.

The 24.9 million distinct referenced clips against 10.7 million trajectories at 3.52 clips each — 37.5 million clip slots — means the average clip appears in about 1.5 trajectories. Reuse is therefore real but modest, and a consumer sampling trajectories at random is not repeatedly drawing the same audio.

5. Where the clips come from

Source datasetFullPublicWhat it is
emolia5,893,3105,893,310 The German emotional-speech corpus that supplies most of this project's real expressive material. Released in full.
podcast2,657,451held back Podcast speech from publicly available feeds.
kartoffelphon897,830897,830 German speech. Released in full.
eurospeech729,876729,876 European parliamentary and public speech. Released in full.
snippets277,398held back See §6 — this one is a judgement call, not a settled decision.
mls117,945117,945 Multilingual LibriSpeech. Released in full.
evasnippets79,903held back A synthetic-origin snippet set.

Both columns add up: the four released sources sum to 7,638,961 and all seven to 10,653,713. The public release is a clean removal of three sources, not a resampling — so a public row is byte-identical to the full-corpus row it came from, and any statistic computed on the public subset can be compared directly against the full-corpus figure without worrying about a shifted selection.

The corpus is more multilingual than the model that motivated it. The model line handles English and German; the released trajectory rows carry language tags for English, German, French, Spanish, Italian, Portuguese, Dutch and Polish, inherited from the source corpora — the example row of §2.1 is French. Whether that is useful or merely present depends entirely on what a consumer intends to do with it.

6. What is held back, and one open judgement call

Three sources — podcast, snippets and evasnippets — are excluded from the public release. The reason is not the audio and not the annotation: it is that a trajectory row names exactly which segments were used. Those transcripts are not part of this project's open real-speech release, and publishing an ordered list of their segment identifiers is publishing a precise index into material that was deliberately not published. That is a weaker disclosure than releasing the transcripts, and it is not nothing, so the rows go.

An open judgement call, recorded rather than hidden

snippets (277,398 rows) was excluded alongside evasnippets. The instruction that governed the filter said “AI snippets”, which is ambiguous between the two source names, and the decision was made in the direction of holding more back rather than less. That may be more conservative than intended. If snippets is in fact publishable, the public subset can be rebuilt with it included — the filter is a single predicate over the dataset column and the full corpus is intact. Until someone confirms, the release stays as it is, and this paragraph is here so that a reader does not mistake a cautious default for a considered exclusion.

The full corpus is retained privately at TTS-AGI/moss-va-trajectory-corpus-full (581 MB, verified after upload the same way every other artefact in this project is — by re-reading the repository metadata and size-comparing every file rather than trusting the uploader's success message).

7. How to use it, and what you have to supply yourself

The corpus is a specification. It names clips; it does not contain them. To do anything with a trajectory you need the source audio or the source annotation keyed by the same identifiers, and for three of the seven sources that material is not public. This is a deliberate trade — it makes the corpus small enough to release and to iterate on, and it pushes the licensing question onto the audio rather than onto the sequence.

Three uses it was built for:

  1. Training on progression. Render a trajectory as one training example: the concatenated clips as the target, and a prompt that states the movement rather than a single band — “start at the 40th percentile of anger and reach the 95th over four sentences”. Nothing in this project's supervised or preference corpora carries that shape, and the standing hypothesis for why intensity control fails (main report §10.4) is precisely that the model has seen too little contrast to learn what an intensity word controls. A trajectory is contrast by construction.
  2. Evaluating progression. Use the trajectory as a reference arc: prompt the model with the same movement and score whether its own generated sequence walks the dimension the way the reference does. That is an evaluation this project currently cannot perform at all.
  3. Selection and curriculum. The T, C, k, qmax and cmax fields let a consumer ask for strictly monotone, high-quality, five-step walks without re-scoring 25 million clips — which is most of the work of building such a set.

8. Limitations


Part of the MOSS voice-acting documentation set: the technical report · steering and probes. Dataset: laion/moss-va-trajectory-corpus.