---
title: "Veo 3.1 Character Consistency: What Broke Across 3:20 of Finished Film"
description: "Every guide says \"use reference images\". Here is what actually happened across a finished animated short — the four ways Veo loses a character, the line-up image that fixed sibling scale, the prompt blocks that must never vary, and what still failed."
canonical: "https://www.razi.pro/blog/veo-character-consistency-what-broke"
date: "2026-09-07"
tags: ["Veo", "Google Flow", "AI", "Video Gen", "Prompting"]
source: "razi.pro"
---

# Veo 3.1 Character Consistency: What Broke Across 3:20 of Finished Film

Shot 8 asked for a small boy flying under a night sky. It came back with him in a spacesuit and helmet, cape gone.

The reference image was attached. The costume was in the reference image. The model kept his coil-spring boots and his star badge, correctly read the scene as nocturnal and sky-adjacent, and free-associated its way to an astronaut.

That is the sentence this whole page is built on:

> Ingredients bias the look; they do not lock it. A reference image shifts the distribution — it does not constrain it.

This is the reference version of a longer story. The full production log for the film — twenty shots, 3:20, two children turned into superheroes — is [Star Patrol: making an AI animated film, and everything that broke](https://www.razi.pro/blog/making-an-ai-animated-film-with-veo-and-flow). This page pulls out just the consistency problem, because that is the thing people are searching for at midnight when their character has changed faces again.

## The four ways a character drifts

Sorted by how hard they were to diagnose, not how often they happen.

**1. Silence in the prompt gets filled from the scene.** The astronaut. Where the prompt text does not describe the character, the model infers from context, and "dark sky, glowing, flying" pulls hard toward space.

**2. Scale collapses when two characters share a frame.** The one nobody writes about. Covered in full below.

**3. Costume and prop detail regenerates differently** every time it is not pinned by words.

**4. Style drifts from the prompt text itself.** Retyping the style block instead of pasting it produced visible tonal shifts between shots — lighting warmth and colour saturation turn out to be sensitive to remarkably small wording changes. Paste it. Never retype it.

## The fix for silence is redundancy

Describe the character inline on every shot they appear in, *even though* the ingredient image is attached:

> @Comet — a girl in bright orange pajamas with a gold star on the chest and a flowing golden-yellow cape, bare head, dark hair in a small ponytail
>
> @Boing — a much smaller little boy in royal-blue pajamas with a sky-blue cape worn backwards over his chest, bare head with thick dark hair, and blue boots with coil springs

Plus an explicit negative on every shot containing a child:

> Both children have bare heads with visible hair. No helmets, no space suits, no antennae, no goggles, no masks.

Naming the specific failure mode beats a generic "no costume changes". The model needs the token. A vague negative gives it nothing to push against.

## The line-up image that saved the film

The first pass produced two character sheets: one per child, head to toe, each filling its frame.

Framed identically, an older sister and a smaller brother are exactly the same size. **Neither image contained any height information at all.**

Veo drew them the same size. Across the eleven shots where both children appear, the visual joke the entire film rests on — big sister, small round brother — evaporated. In some renders it inverted, and the younger one came out taller.

The fix was a third reference: one frame containing both children, correct relative heights baked in. It solved two problems, and only one of them was intended.

The intended one was scale. The unintended one turned out to matter as much: because both children were rendered **in the same pass**, their styles could not diverge. Generating them separately had already allowed small drift in eye size and skin shading. A single joint generation eliminates that by construction rather than by prompting.

> **The thing to take from this section.**
> Generate your whole cast in one sheet *first*, then crop the solo references out of it. That is the same insight applied from image one instead of image three. One joint generation cannot drift in style, and every solo you cut out inherits the correct scale for free. I arrived at it backwards, after eleven broken shots. You do not have to.
> Splitting that sheet into isolated references is a mechanical job — [the image splitter](https://www.razi.pro/tools/split-image) does it with panel detection rather than a fixed grid, which matters because a character line-up is not evenly spaced.

Two rules follow immediately from having all three references:

**Never attach the two solos and the line-up at once.** Three references of the same two children dilute each other. Use the solos, or use the line-up.

**The line-up buys you a slot.** Flow allows a maximum of three ingredients per prompt. The shots needing both children *and* a vehicle only fit because one image covers both kids, leaving room for the glider and the buggy.

## The blocks that must never vary

Every shot prompt was four stacked blocks, and the discipline is in which ones are copied rather than written.

**The style block**, pasted first, identical every time:

> Modern 3D animated family film, Pixar-quality rendering, soft warm cinematic lighting, shallow depth of field, rich saturated colors, cozy storybook mood, 16:9. No subtitles, no on-screen text, no captions.

**The scene**, which is the only block that should actually change.

**The sibling-scale line**, on every shot with both children:

> Comet is noticeably taller than Boing — he is about a head shorter, rounder and chubbier, with shorter limbs.

**The voice block**, per speaking character, copied verbatim and never reworded:

> COMET speaks with a bright, clear little girl's voice, around five years old — warm, confident and cheerful, mid-high pitch, with an excited upward lilt.

That last one exists because **Veo invents a fresh voice on every generation.** There is no voice-lock at any Flow tier. A verbatim repeated description is the only lever available, and it does work — it turns "two different children" into "the same child on a different day". Distinctive voices hold best; the deep slow rumble written for the Moon was the most reliable voice in the film.

One free continuity trick: **chain the shots.** Feed the final frame of a shot you like as the start image of the next. It costs nothing and substantially improves the match across a cut.

## The refusals, and what they were actually about

The emotional low point of the film was refused twice, with no indication of which token tripped it. The prompt described "a small three-year-old boy… lower lip wobbling, right on the edge of tears".

The classifier was not objecting to the shot. It was objecting to the conjunction of an **explicit child age with distress vocabulary** — a pattern that warrants scrutiny in general, and which also describes an ordinary beat in every children's film ever made.

Four fixes, in descending order of effectiveness:

1. **Remove every age word.** "The smaller character", "the taller character". The height relationship is already carried by the scale line and the line-up image, so nothing is lost. This alone cleared most refusals.
2. **Soften distress vocabulary.** "Glum", "deflated". A deflated small child and a tearful one look the same on screen.
3. **Soften physical contact.** "An encouraging pat on the shoulder" rather than "puts an arm around him".
4. **Open with fiction context** — "Two animated cartoon characters…" — so the classifier knows it is animation before it reaches the action.

> **A caution on those four.**
> They worked because the shot itself was an ordinary beat from a children's film. They are techniques for describing an innocuous scene in language a classifier can recognise as innocuous. They are not a method for getting something past a filter that is right to stop you.

## What it cost, and the setting that quietly costs a month

Consistency work is really re-roll budget, so the economics decide how much of it you can afford.

| Model | Credits per 8 s clip | All 20 shots |
|---|---:|---:|
| Veo 3.1 Lite | 10 | 200 |
| Veo 3.1 Fast | 20 | 400 |
| Veo 3.1 Quality | 100 | 2,000 |

Twenty shots at Lite costs 200 credits. On a 1,000-credit monthly allowance that leaves **800 for re-rolls — eighty of them**, and that trade is the most important production decision in the project. A Quality render of a shot where the model misunderstood the action is worth nothing. A Lite render on the fourth attempt, where it finally got the timing right, is worth everything.

The trap: the model dropdown defaulted to a non-Veo model outside what the video credits cover. Check it before your first generation, not after your twentieth. Set confirmation before generating to always, and variants to one, so the allowance cannot evaporate by accident.

## What was deliberately not tried

Keeping the honest ledger, because the omissions are informative.

**Not tried — training a LoRA on each face.** Technically the strongest route to consistency, and refused on purpose: a LoRA is a portable, redistributable model *of a real child's face*, which is a categorically different artefact from a few stylised PNGs in a folder. If your subjects are adults who have agreed, the calculus is yours.

**Not tried — local image models** with face conditioning. Cheaper and nothing leaves your machine; expect to work harder for likeness, and expect the sibling-scale problem to get worse rather than better with more knobs to get wrong.

**Not tried — first-frame and last-frame conditioning.** Chaining pins the seam going forward. Pinning both ends would likely have removed most continuity re-rolls outright.

One rule was adopted before the first generation and never broken: **the original photographs never went into the video pipeline.** The likeness was routed through a stylised render first. That is the right call on privacy grounds, and it happens to be the smoother technical path too, since real faces attract extra scrutiny.

The sibling deep-dive from the same production, on building the score, is [scoring a film with MusicGen locally](https://www.razi.pro/blog/scoring-a-film-with-musicgen-locally). For how the whole thing fits together end to end, see [the AI video creation pipeline](https://www.razi.pro/blog/ai-video-creation-pipeline-story-to-youtube).
