Every Video Lab post tonight is hosted by someone from this cast, so here's who they are and how they were made. Ten hosts, five women and five men, aged 21 to 29. None of them is a real person. Each one is a fictional AI character: the face comes from an image model, the voice from ElevenLabs, the biography was written for them. Every dossier says so in writing: each host is fictional and synthetic, with no real person as a likeness target.
| # | Host (AI) | Age | Role | Voice |
|---|---|---|---|---|
| 1 | Daisy Lane | 22 | Lead host | Jessica (premade) |
| 2 | Priya Vance | 27 | Co-host and anchor | Voice Design |
| 3 | Sloane Mercer | 29 | Skeptic and reviewer | Voice Design |
| 4 | Ama Boateng | 24 | Hands-on builder | Voice Design |
| 5 | Lucía Navarro | 26 | Field reporter | Voice Design |
| 6 | Marcus Bell | 29 | News desk anchor | Voice Design |
| 7 | Theo Lindqvist | 25 | Explainer | Voice Design |
| 8 | Rafael Duarte | 27 | Hardware and local models | Voice Design |
| 9 | Omar Haddad | 26 | Creator strategist | Voice Design |
| 10 | Tobi Okoro | 21 | The rookie, comic relief | Voice Design |
The film above is the roll call: each host says their own opening line, cut from the intro audio the cast build already made, and animated from a single still by LTX 2.5. The player lets you click through all thirty reference images and hear each line.
How we tested
Two halves. The build half is reporting, not testing: everything about how the cast was made comes from the files the cast build left in the cast folder (cast.json v1, last updated Nov 2 at 04:40 ET; CAST.md; a DOSSIER.md and dossier.json per host; three reference PNGs and an intro mp3 per host; three Voice Design previews for each designed voice). Where those files don't say how something was done, this post says not recorded instead of guessing.
The measured half is what I could check on the Spark tonight:
- The intros. Integrated loudness and true peak of all ten intro mp3s (ffmpeg
loudnormanalysis), and speaking pace (script words divided by the speech span from faster-whisper large-v3 word timestamps, run on the CPU). - The animation. One queue job (060) rendered 14 lip-synced clips with LTX 2.5 image+audio-to-video (one still plus an audio track in, a talking video out): the ten roll-call lines (seed 42) plus Daisy's four on-camera segments for the instructional, one seed each (42). Every clip starts from the host's on-set still. Each one went through
bin/identity-strip(eight evenly spaced frames, first to last) and a face check against the reference still: the still, the first frame and the last frame side by side. I also stripped the four host clips other posts rendered earlier tonight (Daisy, Rafael, Sloane, Marcus), which gives a second take on four of the faces.
How a host drifts across many shots, image strength and the rest gets its own post, "Keeping an AI host on-model with reference images", coming soon to the Video Lab. This one stays on how the cast was built and whether it survives the trip into video.
Pictures first: the reference set
Each host has three images, and they came before anything else was written:
- Portrait (
<slug>-portrait.png, 1254x1254): front on, plain grey background, mouth closed.CAST.mdmarks this one as the image to use for lip-sync. - Three-quarter (
<slug>-three-quarter.png, 1254x1254): the same grey, the face turned off-axis, so a model sees the shape of the nose, jaw and hair from an angle. - On set (
<slug>-on-set.png, 1672x941): the host at a desk in the dark Video Lab studio with the orange practical lights. This is the frame every animated clip starts from.
Thirty images in total. CAST.md says they were made with the Codex built-in image tool (OpenAI image generation) on an existing ChatGPT subscription, at no per-image cost. The image model version, the prompts, seeds, the number of attempts and whether the second and third views were generated from the portrait are not recorded. The PNGs carry no embedded metadata either (I checked all thirty).
Two things you can see by looking at the set:
- Daisy's three-quarter view barely turns. Every other host's three-quarter is clearly off-axis; hers is close to a second front portrait. It still works as a reference, it just teaches a model less about her profile than the others' do.
- The on-set stills are not all the same pose. Daisy stands with her hands on the desk; the other nine sit. Sloane's still has a coffee mug on the desk. Small, but the still is the identity for every clip, so whatever is in it shows up in the video.
The dossier
Then the writing. Every dossier was written from the three reference images: each one bases its visual notes on "the supplied" portrait, three-quarter and on-set images, and five of them (Daisy, Ama, Lucía, Rafael, Theo) say outright that the images were inspected or reviewed first. Everything you can't see (height, home, car, family) was assigned on purpose and labelled as invented production canon.
Per host that comes to 4,527 to 5,425 words (DOSSIER.md, word count), in the same structure every time:
- Backstory: hometown, family, education, how they joined LEJ, what they want, flaws and quirks, running jokes, relationships with the rest of the cast.
- Wardrobe: eight categories, signature on-camera look first.
- Home, vehicle and set pieces: a floor plan with a fixed orientation point, so a reverse angle never rearranges the room.
- Continuity: height, build, hair, eye colour, skin, face, tattoos (none, for everyone, assigned), jewelry, signature items, and eight "never changes" rules.
The continuity section is the part that matters for video. It's written as instructions to whoever renders the host next, and it's specific: Priya's beauty mark is on her anatomical left and must not be mirrored; Daisy's pendant is a five-petal gold flower that sits high on the chest above the LEJ print. That's the level of detail you need when a model gives you something almost right and you have to say exactly what's wrong.
Who or what wrote the dossiers, and from which prompt, is not recorded.
The anchor: one garment, one accessory
Here's the consistency trick, and it's boring on purpose. Every host has a visual anchor in cast.json (look.anchor): one piece of clothing and one accessory, worn in all three reference images and named in the dossier as the default on-camera look.
| Host | Anchor |
|---|---|
| Daisy Lane | White crop top with bold hot-pink "LEJ" across the chest, and a delicate gold pendant necklace |
| Priya Vance | Burnt-orange blazer and small gold hoop earrings |
| Sloane Mercer | Black rectangular glasses and the charcoal turtleneck |
| Ama Boateng | Olive overshirt and over-ear headphones resting around her neck |
| Lucía Navarro | Denim jacket with a small round orange enamel pin on the collar |
| Marcus Bell | Navy blazer and a slim silver watch |
| Theo Lindqvist | Round tortoiseshell glasses and the cream cable-knit sweater |
| Rafael Duarte | Charcoal henley and a black digital watch |
| Omar Haddad | Olive bomber jacket and a thin silver chain |
| Tobi Okoro | Mustard-yellow hoodie and white over-ear headphones |
Why it helps: a face is subtle, an anchor isn't. When a frame looks a little off, the anchor is the first thing to check because it's big, it has a colour, and it's in every reference. Daisy's anchor is the hardest one in the cast for a video model, because it's text: three hot-pink letters across her chest. It held: the letters read L-E-J in 40 of 40 sampled frames across her five clips.
The voices
One premade voice and nine designed ones, all on ElevenLabs.
- Daisy is ElevenLabs' premade Jessica ("Playful, Bright, Warm"), voice id
cgSgspJ2msm6clMCkdW9. Jon picked it. - The other nine were made with ElevenLabs Voice Design (
eleven_ttv_v3) from a one-paragraph text description each, stored incast.jsonasvoice.design_prompt. Sloane's, for example: "A 29-year-old American woman with a low, calm, slightly husky voice and a neutral American accent. Measured, deadpan, dry wit, precise articulation, unhurried pace, sounds smart and a little skeptical." Each design produced three previews;CAST.mdsays preview 1 was saved to the account for every host and the other two are kept as alternates (voice-design-preview-*.mp3). Why preview 1 won each time is not recorded.
Then each voice gets fixed settings, used for every line that host ever says (all on eleven_v4, speaker boost on):
| Host | Voice id | Stability | Similarity | Style |
|---|---|---|---|---|
| Daisy Lane | cgSgspJ2msm6clMCkdW9 | 0.45 | 0.75 | 0.3 |
| Priya Vance | ZMmwAMTbqjCypdiVPlId | 0.5 | 0.75 | 0.25 |
| Sloane Mercer | PGiGTEDvl5OFrKrzcSkU | 0.6 | 0.75 | 0.15 |
| Ama Boateng | e36yWxaLBZmSilJEommM | 0.45 | 0.75 | 0.3 |
| Lucía Navarro | 8kFPciV7PpPbZvLg5ocr | 0.5 | 0.75 | 0.2 |
| Marcus Bell | TwlVrS05eywfWCFpThgp | 0.6 | 0.75 | 0.1 |
| Theo Lindqvist | Plzxuzyui1ObKhiQ1KNR | 0.55 | 0.75 | 0.15 |
| Rafael Duarte | u5jpsUIFdBKesSnGamP9 | 0.5 | 0.75 | 0.2 |
| Omar Haddad | 5zQl4rBlT1VRLrLTkpmj | 0.45 | 0.75 | 0.25 |
| Tobi Okoro | X3ID5JTg06Lt2JKpXJSq | 0.4 | 0.75 | 0.35 |
In plain terms: stability is how steady the voice stays from line to line, similarity is how closely it sticks to the source voice, and style is how much acting it adds. Similarity is 0.75 for everyone. The other two track personality: style goes up with how animated the character is (Tobi, the rookie, 0.35; Marcus, the news anchor, 0.10), and stability goes up with how controlled they are (Sloane and Marcus 0.60, Tobi 0.40). That's a sensible rule of thumb, but it's the cast build's choice; nobody A/B tested it tonight.
The intros, measured. CAST.md gives the recipe: POST /v1/text-to-speech/<voice_id> with eleven_v4 and the settings above, then ffmpeg loudnorm to I=-16. Measured on the ten files:
- Integrated loudness (LUFS measures how loud speech sounds to a person; one LU is about the smallest difference you'd notice) -16.80 to -17.65 LUFS, true peak -1.80 to -1.94 dBTP. So they all land 0.8 to 1.65 LU quieter than the -16 target, but within 0.85 LU of each other, which is what matters when you cut from one host to the next. The exact loudnorm options used are not recorded.
- Pace 155 to 191 words per minute. Omar is fastest (191), Priya next (187). Daisy is the slowest in the cast (155), which I didn't expect from the bubbly one.
- Intro length 18.8 s (Priya) to 24.0 s (Daisy).
One fun one from the Whisper pass: on Rafael's intro it heard "Rafael Duarchi" and "Hafa" for "Rafa". His design prompt asks for a light Brazilian Portuguese accent, and that's how Brazilian Portuguese says those sounds (an initial R like an H, a final "-te" like "chee"). So the accent made it through the design. It also means captions built from speech recognition will misspell his name; use the script's spelling with the recognizer's timing, which is what the roll call does.
What holds up once they move
Fourteen clips, all LTX 2.5 image+audio-to-video from the on-set still, checked two ways: bin/identity-strip (eight frames from first to last, full frame) for the anchors, and a face crop of the reference still next to the clip's first, middle and last frames.
The anchors held everywhere. In all 14 clips, every sampled strip frame with picture in it (111 of 112; Tobi's last cell falls just past the end of his 3.4 s of video) still has the anchor: Daisy's letters, Priya's blazer, Sloane's glasses, Ama's headphones, Lucía's denim jacket, Marcus's watch, Theo's glasses and sweater, Rafael's henley, Omar's chain, Tobi's hoodie and headphones. The desk, background and camera position didn't move either.
Faces mostly held. Expressions are where it drifts. Frame 0 is the still, so every clip starts on-model. By the middle and the end:
- Lucía, Theo, Rafael and Omar stay on-model the whole way.
- Sloane stays on-model; by the end of her line her brows are raised, with forehead creases her references don't have.
- Daisy stays on-model, but raises her eyebrows a lot, with forehead creases that aren't in any of her references. Same in three of her four instructional segments (C1 to C3); the short outro (C4) stays smooth-browed.
- Marcus stays himself, with wide-eyed expressions that are bigger than anything in his references.
- Ama stays herself; her skin reads a little warmer and more saturated by the last frame.
- Priya reads as a different face for a moment during a head turn around 1.7 s, then comes back by 3.3 s.
- Tobi drifts the most. By 3.3 s his face reads wider and his smile isn't the one in his references. His clip has only 3.4 s of picture, so this isn't the slow drift you get over a long take.
The four host clips other posts rendered earlier tonight (Daisy, Rafael, Sloane and Marcus, 12 to 18 s each) say the same thing over a longer run, with bigger swings: the face stays recognisable, and the drift shows up as a lean toward the camera (Sloane's is the biggest: her face fills noticeably more of the frame by 14.7 s), exaggerated mouth shapes on vowels, and large expressions (wide eyes, raised brows). Sloane at 7.4 s, tilted with an open "O" mouth, is the frame least like her reference.
Lip-sync is loose at the pauses. Daisy's four on-camera segments were scored on frame sheets: her mouth is open at 32 of 33 speech points, which is good, but closed at only about 5 to 7 of 23 pauses. Most of those pauses land on a smile with teeth showing. That misses the lab's gate (closed at 4 of 6 pauses), even with eleven_v3's longer pauses, so the instructional's caption says so. The roll-call lines weren't gate-scored; they're short, with one or two pauses each.
Setup and gotchas
- The roll-call lines are not new takes. They're cut out of the intro mp3s the cast build made, so the voice, settings and delivery are exactly the cast's. Cutting at Whisper's word end times clipped the last syllable: Whisper's ends run early, and the last quarter second of those first cuts still had speech in it. Cutting inside the first real pause after the last word (ffmpeg
silencedetect, -35 dB, 0.12 s) fixed all ten: their last 0.12 s now peaks at -47.7 to -80.8 dB. - The video stream ends a little before the audio. The LTX graph rounds the length down to a third of a second (a frame-count rule), and
bin/host-segmentsmuxes the full mp3 back on, so the last fraction of a second plays over a held frame. In Daisy's 18.3 s clip from the memory post, the video stream is 18.04 s and the audio 18.32 s. It's invisible in an edit, but a strip tool asked for "the last frame" at the audio's length gets a black cell. identity-strip's default centre crop cuts off standing hosts. It keeps the centre 60% of the frame. For the nine seated hosts that's the face; for Daisy, who stands, it's her chin and the LEJ letters. Use--crop 1.0for her, or crop the face yourself.- Hand the grid player audio carefully. Remotion's
<Player>creates its own shared<audio>tags, so a plaindocument.querySelector("audio")finds one of those, not yours. The CastGrid player tags its own element.
Settings
- Cast:
cast.jsonv1 (2026-11-02T04:40). Images: Codex built-in image tool (model version not recorded). Portrait and three-quarter 1254x1254 PNG, on-set 1672x941 PNG. - Voices: ElevenLabs
eleven_v4text-to-speech at the settings in the table above; Voice Designeleven_ttv_v3for nine of ten. The instructional's voice-over was rendered tonight withbin/tts.py --cast daisy-laneat her cast settings (with-timestamps endpoint, loudnorm I=-16). Her four on-camera lines are the exception:eleven_v3with "..." written at the pauses, stability 0.5, style 0, because v3 leaves longer pauses for the mouth to close on (the lab's interim host-line rule; v4 caps pauses around half a second). A later controlled test on Daisy (nine renders of one window) found the longer pauses don't help: her mouth closed at 6 of 51 pauses across eleven_v3, eleven_v4 and multilingual_v2. So new host lines go back to eleven_v4, and the edit cuts away from her face over long pauses instead. - Animation: LTX 2.5 22B distilled (int8 convrot transformer, int8 Gemma 4 12B text encoder) in ComfyUI 0.43.0, image+audio-to-video (
ltx_ia2vin the lab's graph builder): the narration is encoded with the LTX audio VAE and frozen in both stages so the picture is generated to match it. 1280x704, 24 fps, two stages, image strength 1.0, seed 42, input image the host's on-set still. Prompt, filled per host fromcast.json(age, then thelookfields: ethnicity note, hair, wardrobe, anchor; the wardrobe and anchor overlap, so some words appear twice). Daisy's, verbatim: "An adult AI host, age 22, white woman with a light sun-kissed tan; Long honey-blonde beachy waves, loose and voluminous; White fitted crop top with the letters "LEJ" in bold hot-pink block letters across the front, high-waisted light-wash denim; White crop top with bold hot-pink "LEJ" across the chest, and a delicate gold pendant necklace. The host speaks naturally to the camera in the reference setting, with subtle head movement, natural blinking, small conversational gestures and accurate lip movement. Preserve the reference face, clothing and background. Locked camera, consistent soft studio lighting." - Edit: Remotion
ShortFilm(film) andInstructional(instructional) templates, 1920x1080, 30 fps. Music: one ElevenLabs Music instrumental bed (AI-generated), loudnorm I=-18.
Speed and memory
From tests/HOSTS.tsv and the queue log for job 060 (wall time per clip, measured by the queue tool, LTX 2.5 at 1280x704, 24 fps):
- Roll call: ten clips, 56.3 s of video, 917 s of GPU: 14.8 to 17.9 s of compute per second of video.
- Daisy's instructional segments: four clips, 58.9 s, 1,061 s: 16.9 to 19.0 s per second.
- The whole job: 115.2 s of video in 1,983 s of wall time (33 min), 17.2 s of compute per second overall, run back to back after another LTX host job.
- Memory: the lowest MemAvailable the queue logged during the job was 26 GiB (that's free memory on the whole machine, which has 128 GB of unified memory, not this job's peak).
- Everything else is cheap. The ten roll-call lines cost no TTS at all (cut from existing audio). Word timing for the cuts: faster-whisper large-v3 on the CPU. Building the cast itself (30 images, 9 voice designs, 10 intros) cost the cast build nothing per image on the ChatGPT subscription plus ElevenLabs credits; the exact credit count is not recorded.
Licenses
- Reference images: made with OpenAI's image generation through Codex. OpenAI's terms of use say that, as between you and OpenAI, you own the output; check the current terms before reusing anything. The lab's model inventory doesn't list this tool, because it isn't a local model.
- Voices: ElevenLabs premade and Voice Design voices on the account's paid plan.
- Animation: LTX 2.5 is under the LTX-2 Community License (free for organisations under $10M a year in revenue).
- No FLUX.2 dev, MiniMax or research-only output appears anywhere in this post.