▶ Start Vidéo

How to Make an Animated Short Film with AI: The Full Workflow (Real Prompts)

How to make an animated short film with AI: my full workflow, the real prompts, the quality checks, and how to redo a scene. Vision first, tools second.

Par Ahmed 36 min de lecture

How to Make a Video with AI: The Full Workflow (Real Prompts) — video tutorial

Lire en français : Court-métrage d'animation avec l'IA : le guide complet, prompts réels inclus

When you think "AI short film", you think of a magic button: you type a sentence, a film comes out. That's not what happened here. I made a 1 min 45 s film, drawn entirely with letters and numbers, by directing AI models the way you direct a team: I describe, I watch, I say what's wrong, they redo it.

This guide shows you everything, in order: the vision, the technology stack, the step-by-step pipeline with the real prompts, the checks that kept me from shipping rubbish, and how to change your mind without losing everything. It also covers what failed, because that's where you learn. If you've been wondering how to make a video with AI, and what the full workflow really looks like, this is it.

The short version, in four lines

  • The vision comes first: what you want to say, in your own voice.
  • The art direction (AD) matters more than the detail of the animation: you write it into a contract the AI re-reads.
  • You are the director, the AI is your tool: it executes and measures, you watch, you listen, you decide.
  • No "in a single prompt": dozens of exchanges, versions kept, checks at every step.

You can watch the finished film here: https://youtu.be/XigOMjfS7GE?t=303 (the full film starts at 5:03 in the tutorial).

The video tutorial In the video tutorial (YouTube, Ahmed T'aide) I send people to this article: every prompt and every step is here. The tutorial is in English: https://youtu.be/XigOMjfS7GE.

A note on languages. My prompts to the AI were written in French. For each one that matters, you get my English translation (marked "translated") and, for the key ones, the original French text, because that's what was really typed. The film's voice-over is in English.

Your vision first, the tools second

This is the message I want across before any technique: what counts is your vision. Your voice, what you want to give to the world. The AI helps you make the video; it doesn't decide for you what it should say.

A few principles I held from start to finish:

  • Art direction is important. A consistent style beats an ultra-detailed animation.
  • You don't need ultra-detailed animation to carry a message, a speech, a vision. Simple gestures (a gust of wind, a fall, something appearing) are enough if they're right.
  • You're the director; the AI is your tool. It executes fast and redoes things without complaining; what the film should make people feel is your job.
  • Simple words. An effective note fits in one concrete sentence. More on that below.
  • Letters can illustrate too: a cloud made of "C"s, a flower in 0 o @, a stem in |.

The film: a simple message

The film asks three questions, soberly: When did we stop feeling compassion? When did we stop being human beings? And when, and why, do we speak in God's place to justify horrors?

It's about war, about the suffering of children, of women, of everyone who never asked for anything. It shows no violence: it suggests through silence, contrast and absence. Here is the voice-over text, as it is in the film:

When did we stop being human? When did other people's suffering stop moving us? When did we start hiding behind God to commit atrocities? So many people in this world are suffering, people who never asked for any of it, and we, the ones who watch and who hear, pretend that everything is fine. A woman weeping, a child screaming in pain: we no longer hear them, we no longer feel anything. And those who inflict that pain justify it by saying it's God's will. In God's name? Really? The one thing that is beautiful about death is that even the executioners will die in the end, and join the innocent they harmed... So tell me, when did we stop being human?

Content rules I kept for the film: no bodies, no faces, no visible weapons, no tanks; the children are simple letter silhouettes with no faces; a single puddle, at the end; the explosion, very brief and made of letters, appears only in the final film, and never in close-up on anything other than letters.

The art direction: everything is written in letters

I chose an art direction that forces restraint: everything is drawn with letters and numbers. If you zoom in, you read letters. The background is a flat dark color, the world is gray, and in each scene a single element that carries meaning is in color (in the first one: the flower).

A flower, clouds and grass, all drawn with letters and numbers: petals made of o, 0 and O, a heart of @ and 8, a stem of vertical bars. Zoom on scene 1: the petals are o, 0 and O, the heart is an @, the stem is a column of |.

What this guide promises (and what it doesn't)

No "in a single prompt": this film took dozens of exchanges and an edit that was redone from scratch. No cost or production time announced: I didn't measure them. This guide describes what really happened on October 22, 2026, with the tools of that day, and gives you the prompts, the contracts, the checks and the pitfalls so you can redo the process with your message.

Whether you want to make a short film, create a video with AI or start your first AI animation, the method is the same.

The technology stack

Here is what was really used, with each tool's role here and one verified pitfall.

Tool Role in this film
Claude Code (terminal) The conductor: designs, codes, measures, re-reads
Claude Sonnet 5.5 (effort "high") Art direction, treatment, "model" scenes, final continuous shot
Claude Haiku 5.5 Builds the other scenes, in parallel
HyperFrames (0.6.112) Renders an HTML/canvas + GSAP page to MP4, frame by frame
ElevenLabs Voice-over (eleven_v4), sound effects (sound-effect-v2), music
whisper.cpp Re-reads the voice to compare it with the written text
ffmpeg Mixing, measurements (LUFS, peak, silence), check sheets

Claude Code: Sonnet 5.5 to design, Haiku 5.5 to build

  • Sonnet 5.5, effort "high" only. I start by describing what I want to Sonnet 5.5 at "high", no more: there's no need for more reasoning for that. With it, I validate the animation, the style, the art direction, and above all I make the first model animations.
  • Haiku 5.5 for the rest. It's fast, and it builds the scenes in parallel, in waves of four, following the model.
  • A "director" Sonnet for the final continuous shot.
  • Real pitfall: launching too many agents at once. A previous session had hit its limit with 13 Opus agents in parallel; here, waves of 4.

HyperFrames: deterministic rendering

  • What it's for: a scene is an HTML page with a <canvas> and GSAP; HyperFrames renders it to MP4, frame by frame, deterministically. The glyphs are drawn on the canvas, in a monospace font.
  • Commands used: lint, snapshot --at …, render (version hyperframes@0.6.112, which has no check command).
  • Good to know: rendering is slow; run it in the background, with the output redirected to a file.
  • Real pitfall: a green lint proves nothing. An exception in the drawing function had produced a frame with no flower and no grass, lint green, no message. You have to look at a snapshot after every structural change.

If you want to understand this chain in detail (installation, Whisper, FFmpeg), read editing a video with AI locally with Claude Code and HyperFrames (in French).

ElevenLabs: the voice, the effects, the music

  • Voice-over: model eleven_v4, voice "Hale" (EN, sad), with emotion tags [sad, quiet, slow], [voice trembling], [whispers], [pause]. The service also returns word timestamps.
  • Sound effects: sound-effect-v2 (13 generated effects, cataloged in sfx-catalog-all.json).
  • Music: a cappella choir segments were generated with ElevenLabs' music_v1 model; the project also contains a fallback script for fal.ai (Stable Audio 2.5), meant for when the ElevenLabs music quota runs out.
  • What failed: eleven_v4 has no sound-effects mode. I did 12 "wind" attempts: a text made only of tags is refused (error 400); with "…" as the text, it plays human breaths (sighs, murmurs). The dedicated SFX model, sound-effect-v2, produced real, continuous wind.
  • Another failure: the third-party service the SFX first went through (kie.ai) went down on October 22; I worked around it by calling the API of the same model directly.
  • Pitfall: the word timestamps drift by 0.1 to 0.7 s. To cut, rely on the real silences in the audio file, not on those timestamps.

whisper.cpp: re-reading what the voice said

  • What it's for: whisper-cli (model ggml-small) transcribes the voice so you can compare the text that was spoken with the text that was written.
  • What it found here: the passage "we no longer feel anything" was swallowed by the voice's whispered mode. Fixed with [softly] and a pause.
  • Pitfall: on a long file, whisper can skip a word. Run it on 10-second chunks.

ffmpeg: measuring everything you can measure

  • What it's for: mixing, level (LUFS, peak), silence (volumedetect), check sheets, lossless assembly of the render slices.
  • Pitfall: AAC raises the peak: measure the final file, not the WAV. And -shortest can cut off a frame.

The project structure

One project, one folder. Each file has a precise role: several agents can work without stepping on each other.

lettres-guerre/
├── BRIEF.md            what I asked Sonnet for (subject, art direction, scene 1, deliverables)
├── DA.md               the art direction CONTRACT (palette, fonts, density, recipes, QA, pitfalls)
├── SCENARIO.md         the 9 scenes: duration, voice, image, colored element, sounds
├── TRAITEMENT.md       first treatment in 8 scenes (obsolete, kept for history)
├── script.json         the voice text + v4 emotion tags
├── sfx-catalog-all.json  the 13 sound effects requested
├── audio/
│   ├── vo/             voice (hale.mp3, ash.mp3) + word timestamps
│   └── musique-essais/ choir tests
├── scenes/
│   ├── s01/ … s09/     one scene = one mini-project (index.html, gust.js, gsap.min.js,
│   │                   fonts/, audio/, hyperframes.json, package.json, snapshots/)
├── plan-sequence/      the final film: index.html, world.js, plan.json, PLAN.md, PIEGES.md, tools/
├── renders/            all the renders, versions included (s01-v1-dense.mp4, s03-v3-char.mp4…)
└── tools/              tts_vo.py (voice), assemble.py (first edit)

(The file names are the real ones, in French: DA stands for direction artistique, art direction; TRAITEMENT is the treatment; PIEGES is pitfalls.)

An example of a DA.md contract

DA.md is the most important file: it's what lets a smaller model make one more object without guessing. Here is the beginning, as it is (with […] where I cut), in my English translation, then in the original French:

# "Letters and numbers" art direction — the contract

Everything on screen is a letter, a number or a punctuation mark typed in a monospace font.
No solid shape, no line, no image.
Principle (Ahmed's feedback, v2): few letters, airy. Every letter must be visible, with air
around it […]
Color rule (Ahmed's feedback, v3): the world is black and white, one single element that
carries meaning is in color per scene. […]
Flat colors (Ahmed's feedback, v4): no gradient, anywhere. The background is a single flat
color (#0E0E0E) […]
Few elements (Ahmed's feedback, v4): 1 subject + 2-3 decor elements at most per scene. […]

Absolute rule: no violence shown […]
# DA « lettres et chiffres » — le contrat

Tout ce qui est à l'écran est une lettre, un chiffre ou un signe de ponctuation tapé en police
monospace. Aucune forme pleine, aucun trait, aucune image.
Principe (retour d'Ahmed, v2) : peu de lettres, aérées. Chaque lettre doit se voir, avec de l'air
autour […]
Règle de couleur (retour d'Ahmed, v3) : le monde est en noir et blanc, un seul élément porteur
de sens est en couleur par scène. […]
Aplats (retour d'Ahmed, v4) : aucun dégradé, nulle part. Le fond est un seul aplat (#0E0E0E) […]
Peu d'éléments (retour d'Ahmed, v4) : 1 sujet + 2-3 éléments de décor maximum par scène. […]

Règle absolue : aucune violence montrée […]

Every correction from the director becomes a written rule ("Ahmed's feedback, v2, v3, v4") that the following scenes obey.

The pipeline, step by step

For each step: what I said, what the AI did, and why the prompt is built that way. The French sentences are mine, cleaned up (typos removed), not rewritten.

Step 1: describe your vision to Sonnet 5.5, validate the art direction, make the "model" scene

"I start by describing what I want to a Sonnet 5.5 model at high only, no need for more reasoning. With this model I validate the animation, the style, the art direction, and above all I make the first model animations." (translated)

My prompt, the essentials (translated):

The film is about war, about the suffering of children, of women, of people who never asked
for anything.
The art direction: drawings made with letters and numbers. For example, a cloud made of "C"s
arranged to form a cloud. No visible violence.
First scene: blue background (the sky), clouds, a flower moving with the wind, a slight
camera movement, birds flying far away. You hear the wind, the flower moves to the rhythm of
the wind. A poetic scene. ElevenLabs SFX.

The same prompt, in the original French:

Le film parle de la guerre, de la souffrance des enfants, des femmes, des personnes qui n'ont
rien demandé.
La DA : des dessins faits avec des lettres et des chiffres. Par exemple, un nuage fait de « C »
arrangés pour former un nuage. Pas de violence visible.
Première scène : fond bleu (le ciel), des nuages, une fleur qui bouge avec le vent, un léger
mouvement de caméra, des oiseaux qui volent au loin. On entend le vent, la fleur bouge au
rythme du vent. Scène poétique. SFX ElevenLabs.

I also wrote a full brief, BRIEF.md, with a "what Sonnet must deliver" section (translated, then the French original):

## What Sonnet must deliver
1. TRAITEMENT.md: an explanation of the short film in French […] 6-8 scenes […] always without violence.
2. DA.md: the contract of the "letters and numbers" art direction: palette, fonts (monospace),
   glyph density, techniques (how to make a cloud, a flower, a bird, grass, a shadow),
   movement (wind, breathing), camera rules […], sound. Precise enough for a Haiku to make
   one more object without guessing.
3. scenes/s01/: scene 1 built and rendered + renders/s01.mp4, checked on images AND on sound.
4. A short "pitfalls met" list (so the Haikus don't repeat them).
## Ce que Sonnet doit livrer
1. TRAITEMENT.md : explication du court-métrage en français […] 6-8 scènes […] toujours sans violence.
2. DA.md : le contrat de la DA « lettres et chiffres » : palette, polices (monospace), densité de
   glyphes, techniques (comment on fait un nuage, une fleur, un oiseau, de l'herbe, une ombre),
   mouvement (vent, respiration), règles de caméra […], son. Assez précis pour qu'un Haiku refasse
   un objet de plus sans deviner.
3. scenes/s01/ : la scène 1 construite et rendue + renders/s01.mp4, vérifiée sur images (planche) ET sur le son.
4. Une courte liste « pièges rencontrés » (pour que les Haiku ne les refassent pas).

Why the prompt is built this way.

  • It states the subject and the absolute rule (no violence) before the style: the AI can't guess a limit.
  • It asks for a contract, not just a scene: the goal is a replicable model.
  • It requires checking on images AND on sound: it prevents the "it's done" effect with no proof.
  • Scene 1 is small and poetic: you validate the art direction on twelve seconds, not on the whole film.

Step 2: iterate on scene 1, the director watches and corrects

I watch the scene, I say what's wrong in one sentence, the AI corrects and puts the rule into the contract. Four versions were kept.

Four versions of scene 1 in a grid: v1 dense on a blue sky, v2 colored, v3 in gray with a gradient, v4 on a flat background with only the flower in color. Scene 1 in four versions (s01-v1-dense.mp4, s01-v2-couleur.mp4, s01-v3-gris-degrade.mp4, s01.mp4), same moment of the scene.

My three notes, word for word (translated; the French original follows each):

v1 → "The sound is good, but the clouds and the flower are too busy, you need to draw with
      fewer letters to make it more poetic."
     « Le son est bien, mais les nuages et la fleur sont trop chargés, il faut dessiner avec
       moins de lettres pour que ce soit plus poétique. »
v2 → "The flower needs to stand out more, so everything in black and white, a few blades of
      grass, and only the flower in color."
     « Il faut que la fleur ressorte plus, donc tout en noir et blanc, quelques herbes,
       et seule la fleur colorée. »
v3 → "A few less elements so we really focus on the flower, fewer clouds, and no color
      gradient: a flat color."
     « Un peu moins d'éléments pour qu'on se concentre vraiment sur la fleur, moins de nuages,
       et pas de dégradé de couleur : couleur unie. »

Measured result: the cloud goes from 562 to 123 glyphs, the flower from about 154 to 64 petal letters, the background becomes a flat #0E0E0E. Then: "we've got our art direction." These three sentences became rules in DA.md (flat colors, few elements, a single colored element, readable on a sheet shrunk to 640 px).

Takeaway: you don't describe everything up front; a correction counts twice (the image and the contract).

Step 3: the script, the sad voice, the sound effects

My prompt (translated):

Now the script: you translate everything into English, with a sad, emotional voice,
ElevenLabs V4. [the text]
I want SFX in your opinion, emotional scenes; we put the emphasis on nature;
you show tanks, children playing; the flower is recurring because at the end you show
a puddle of blood and the flower in the wind; simple camera movements and simple
animations; you launch the scene generation with Haiku 5.5.

Original French:

On passe au scénario : tu traduis tout en anglais, avec une voix triste et émotionnelle,
ElevenLabs V4. [le texte]
Je veux des SFX à ton avis, des scènes émotionnelles ; on met l'accent sur la nature ;
tu montres des chars, des enfants qui jouent ; la fleur est récurrente car au final tu montres
une flaque de sang et la fleur au vent ; des mouvements de caméra simples et des animations
simples ; tu lances la génération des scènes avec Haiku 5.5.

(The tanks will be removed later: see the section on changing your mind.)

What came out: script.json (the text and its emotion tags), tools/tts_vo.py (generation with timestamps), a casting of two voices on the same text (Hale and Ash), a whisper re-read, and SCENARIO.md (9 scenes, durations, what the voice says, each scene's single color, the sounds).

{
 "model": "eleven_v4",
 "voice": { "stability": 0.3, "similarity": 0.8 },
 "text": "[sad, quiet, slow] When did we stop being human? [pause] When did other people's
   suffering stop moving us? [pause] When did we start hiding behind God... to commit
   atrocities? [pause] [voice trembling] So many people in this world are suffering, […]
   [softly] We... no longer feel anything. [pause] […]"
}

For the sound effects, here is the kind of text that worked with sound-effect-v2 (always write no voices, no music):

gentle steady breeze blowing over an open meadow, soft airy wind, no voices, no music, no birds,
no thunder, seamless texture
a few distant small birds chirping very faintly far away over a quiet countryside, sparse,
peaceful, no voices, no music

Real pitfall to know about: eleven_v4 is not a sound-effects model. Twelve wind attempts produced nothing but human breaths. And a more general finding: the AI can't listen. It measured the levels; I'm the one who listened.

Step 4: Haiku 5.5 builds the scenes, in parallel, in waves

Each Haiku receives: its line from SCENARIO.md, the DA.md contract, the code of scenes/s01 (the model), the sounds folder and the list of checks. Here is the model prompt, as really used (the brackets change from one scene to the next). First my English translation, then the original French.

You are building ONE scene ([s02]) of a "letters and numbers" animated short film for Ahmed.
Film folder: [path]/lettres-guerre/.
Read in this order, in full: SCENARIO.md (your scene = the line [s02] of the table + the
content rules), DA.md (the contract: follow the checklist of §9, the QA of §10, the pitfalls
of §11 and the amendment §12), then scenes/s01/index.html (the code model to copy: glyph
engine, camera, gust curve).
Your scene: [s02], [9 s] ([270] frames at 30 fps, 1920×1080), in scenes/[s02]/ (copy of
scenes/s01/ then adapt), final render in renders/[s02].mp4 with the scene's sound mixed in
(SFX listed in SCENARIO.md, already generated; no voice, no music; adapt tools/mix_wind.py to mix).
Non-negotiable rules: flat background, flat colors with no gradient at all, 1 subject + 2-3
decor elements, a single colored element (the one in the table), simple camera that is never
still for more than 1 s, simple animations, no violence and no faces.
Procedure: write the code, run lint then snapshots (hyperframes@0.6.112) and LOOK at the
images before rendering; render in the background with the output redirected to a file; wait
for the render to finish; re-encode at crf 19; do the QA of §10 on the final MP4 (ffprobe:
[270] frames, sheet looked at, zoomed crop readable, flat background, sound peak ≤ −4 dBFS,
camera ≥ 8 px/s).
Do NOT touch the files of the other scenes nor SCENARIO.md/DA.md (if you learn a pitfall,
write it in scenes/[s02]/PIEGES.md). Publish nothing.
Hand back only once renders/[s02].mp4 is rendered AND checked; short final report in
French: path, what is verified, what is not, differences from the scenario.
Tu réalises UNE scène ([s02]) d'un court-métrage en animation « lettres et chiffres » pour Ahmed.
Dossier du film : [chemin]/lettres-guerre/.
Lis dans cet ordre, en entier : SCENARIO.md (ta scène = la ligne [s02] du tableau + les règles de
contenu), DA.md (le contrat : suis la checklist du §9, la QA du §10, les pièges du §11 et
l'avenant §12), puis scenes/s01/index.html (le modèle de code à copier : moteur de glyphes,
caméra, courbe de rafale).
Ta scène : [s02], [9 s] ([270] images à 30 i/s, 1920×1080), dans scenes/[s02]/ (copie de
scenes/s01/ puis adaptation), rendu final dans renders/[s02].mp4 avec le son de la scène mixé
(SFX listés dans SCENARIO.md, déjà générés ; pas de voix, pas de musique ; adapte
tools/mix_wind.py pour mixer).
Règles non négociables : fond uni, aplats sans aucun dégradé, 1 sujet + 2-3 décors, un seul
élément coloré (celui du tableau), caméra simple et jamais immobile plus d'1 s, animations
simples, aucune violence ni visage.
Procédure : écris le code, lance lint puis snapshots (hyperframes@0.6.112) et REGARDE les images
avant de rendre ; rends en arrière-plan avec la sortie redirigée vers un fichier ; attends la fin
du rendu ; ré-encode crf 19 ; fais la QA du §10 sur le MP4 final (ffprobe : [270] images, planche
regardée, crop zoomé lisible, fond uni, son crête ≤ −4 dBFS, caméra ≥ 8 px/s).
Ne touche PAS aux fichiers des autres scènes ni à SCENARIO.md/DA.md (si tu apprends un piège,
note-le dans scenes/[s02]/PIEGES.md). Ne publie rien.
Ne rends la main qu'une fois renders/[s02].mp4 rendu ET vérifié ; rapport final court en
français : chemin, ce qui est vérifié, ce qui ne l'est pas, écarts avec le scénario.

After the first wave I added (the director's feedback): "the subject must be recognizable on the sheet shrunk to 640 px, at least 450 px wide, nothing cut off by the edge, frame 0 already filled, composition centered on the subject." (translated; original: « le sujet doit se reconnaître sur la planche réduite à 640 px, ≥ 450 px de large, rien coupé par le bord, frame 0 déjà remplie, composition centrée sur le sujet. »)

Why the prompt is built this way:

  • One scene per agent. Each one has a clear scope, doesn't touch the other files, and they can be launched in parallel.
  • The contract before the code. The reading order is imposed: scenario, contract, model. The agent doesn't start from zero, it adapts.
  • Non-negotiable rules, written in one sentence. They act as guardrails when the agent hesitates.
  • A built-in checking procedure: lint, snapshots that are looked at, background rendering, QA on the final MP4.
  • "Hand back only when it's verified" and an honest report (what is verified and what isn't). That point has a history: several agents had handed back while the render was still running.

The waves: wave 1: s02 (children), s03 (sky), s04 (empty playground), s05 (windows); wave 2: s06 (rain), s09 (flower and puddle); then s07 and s08. And I asked: "open each scene when it's finished": the AI opens each video as soon as it's ready and gives its own check (sheet read, measurements).

Step 5: the director says what's wrong, the AI redoes it

This is the heart of the director's work. My notes, as they were (translated):

s04 → "Fix the shoes and the swing, and above all the tanks, we can't see them."
s03 → "The tanks don't work, we'll replace them with bombs falling from the sky, and when one
       falls it makes a rainbow but also a crater; above all when it falls, you cut all the
       sounds, nothing, just silence."
s09 → "Fix the puddle, it's too discreet, and why not rain red too."
     → "The rain has to be everywhere in the scene, not only near the flower."
s03 → "Remove the cloud that hides the missiles, we have to see the missiles fall and the
       silence come in."
s07 → "The bomb has to leave a crater, come down faster, have several bombs, you can
       completely change the whole scene."
     → "Everything is good, except that the missiles don't fall fast enough."

The French originals of the key ones:

s04 → « Corrige les chaussures et la balançoire, et surtout les chars on ne les voit pas. »
s03 → « Pour les chars ça passe pas, on va remplacer par des bombes qui tombent du ciel […] »
s09 → « Corrige la flaque, elle est trop discrète, et pourquoi pas pleuvoir du rouge aussi. »
s07 → « Tout est bon, mis à part les missiles qui ne tombent pas assez vite. »

On the left, scene 3 with a tank made of letters; on the right, the same scene with three bombs made of letters hanging in the sky. On the left, version 3 of scene 3 (the tank, rejected). On the right, the final version: bombs, no tank.

Two frames of scene 4 at 640 pixels wide: on the left version 1, swing and shoes unreadable; on the right version 2, whole swing and redrawn shoes. The 640 px test: if you can't recognize the object on a shrunk sheet, it's too small or too blurry. On the right, scene 4 corrected (whole swing, redrawn shoes).

A precise note gives a precise result: the swing is whole, the shoes are redrawn (laces in x, sole in =), the puddle is filled (over 700 px wide, bright red), the red rain covers the whole frame.

Two frames of scene 9: on the left a discreet red puddle, on the right a puddle filled with red letters under a red rain falling across the full width, with the pink flower in the center. The puddle: on the left too discreet, on the right filled and accompanied by red rain everywhere. A single puddle in the whole film, at the end.

Step 6: the first edit is rejected

The nine scenes were put together with the voice: 90.5 s (film-en.mp4). I rejected it. My note (translated):

"You can feel that each scene was made separately, and even the sound, you can feel it was generated separately. It needs flow. Lower the SFX level a bit. No cross-fade. The scene-by-scene idea doesn't work: I need a kind of continuous camera tracking shot, all the scenes linked as if it were one and the same shot. One big scene with no cut, the camera moves, sometimes a slight zoom, sometimes not. Redo the sound if needed. We start again from zero."

Original: « On sent que chaque scène a été faite séparément, et même le son on sent qu'il a été généré séparément. Il faut de la fluidité. […] On repart de zéro. »

A single "director" Sonnet took over the film. The nine scenes became a library of drawings, not shots. Here is the prompt (a faithful summary of the one that was given). It's the first version's: its "absolute silence" rule will be replaced in step 8, after I listened to the result. English translation first, then the French original.

Context given: Ahmed REJECTED the film of 9 assembled scenes ("each scene was made
separately, even the sound; it needs flow; lower the SFX a bit; no cross-fade; a single
continuous shot, a camera that travels, sometimes a slight zoom, sometimes not; redo the
sound if needed; we start again from zero").
Mission: ONE composition, ONE continuous world made of letters on a flat background, ONE
camera that travels (smooth spline: position, speed, zoom; never still for more than 1 s),
ONE continuous soundtrack.
Order of the journey (following the voice): flower → children + kite → sky, amber rays, bombs
→ empty playground + shoes → windows going dark → blue rain + exclamation mark → bombs
falling, craters, rainbows, ABSOLUTE SILENCE at the first impact (≥ 3 s) → nature comes
back → return to the SAME flower with a red puddle and red rain everywhere → final
question, fade-out ≤ 2 s.
Sound: synthesized wind driven by the same gust curve as the letters; sound sources placed in
the world (level and panning depending on the camera position); SFX ≥ 12 dB below the voice;
no music (v1); processed voice (≈ −19 LUFS voice alone); final film ≈ −16 LUFS, true peak
≤ −1.5 dBFS measured on the final file.
Procedure: PLAN.md first; build; snapshots looked at; render in slices (temporary frames on
the external disk); concatenate without losing a frame; QA on the final MP4 (frame-by-frame
continuity, 24-frame sheet, loudness, silence < −90 dBFS, whisper on the voice). Honest
report: what could not be listened to.
Next feedback (v2): bomb physics (ballistic trajectory, no more levitation), fast explosions
in letters, boom then a hard cut of the sound, sad and epic a cappella voice music.
Contexte donné : Ahmed a REJETÉ le film de 9 scènes assemblées (« chaque scène a été faite
séparément, même le son ; il faut de la fluidité ; baisse un peu les SFX ; pas de fondu
enchaîné ; un seul plan continu, une caméra qui voyage, parfois un léger zoom, parfois pas ;
refais le son si besoin ; on repart de zéro »).
Mission : UNE composition, UN monde continu en lettres sur fond uni, UNE caméra qui voyage
(spline lisse : position, vitesse, zoom ; jamais immobile > 1 s), UNE bande son continue.
Ordre du voyage (en suivant la voix) : fleur → enfants + cerf-volant → ciel, rayons ambre,
bombes → aire de jeu vide + chaussures → fenêtres qui s'éteignent → pluie bleue + point
d'exclamation → bombes qui tombent, cratères, arcs-en-ciel, SILENCE ABSOLU au premier impact
(≥ 3 s) → la nature reprend → retour à la MÊME fleur avec flaque rouge et pluie rouge partout
→ question finale, fondu de sortie ≤ 2 s.
Son : vent synthétisé piloté par la même courbe de rafale que les lettres ; sources sonores
posées dans le monde (niveau et panoramique selon la position de la caméra) ; SFX ≥ 12 dB sous
la voix ; aucune musique (v1) ; voix traitée (≈ −19 LUFS voix seule) ; film final ≈ −16 LUFS,
true peak ≤ −1,5 dBFS mesuré sur le fichier final.
Procédure : PLAN.md d'abord ; construire ; snapshots regardés ; rendre en tranches (frames
temporaires sur le disque externe) ; concaténer sans perdre une image ; QA sur le MP4 final
(continuité image par image, planche de 24 images, loudness, silence < −90 dBFS, whisper sur
la voix). Rapport honnête : ce qui n'a pas pu être écouté.
Retours suivants (v2) : physique des bombes (trajectoire balistique, plus de lévitation),
explosions rapides en lettres, boum puis coupure sèche du son, musique de voix a cappella
triste et épique.

Why this prompt works. It keeps the same discipline as the Haiku one (plan written first, snapshots looked at, QA on the final file, honest report) but changes scale: a single agent, a single world. It turns the director's problem into verifiable constraints: no spike of difference between consecutive frames (so no cut), continuous camera, sound driven by the same curve as the image.

Sheet of twelve frames of the continuous shot: the flower, children and a kite, the sky with rays and bombs, the empty playground, windows, the blue rain, hanging bombs, craters under rainbows, pink flowers, then the flower under the red rain. Twelve frames of the final film (a 105 s continuous shot, 3,150 frames), taken before and after the explosion sequence. The camera's journey: flower, children, sky, empty playground, windows, rain, craters and rainbows, nature coming back, return to the same flower.

Checks done on the final file: continuity (no spike of difference between consecutive frames), continuous camera derivative, silence below −90 dBFS (for this first version), loudness −16 LUFS, whisper re-read of the voice.

Step 7: more feedback, the physics, the explosion, the music

My note on this first continuous shot (translated):

"The physics of the missiles is really badly done, and the explosion scene is super slow; right before there's no more sound, you do an explosion; everything else is good; it needs music with only voices, vocal, sad and epic."

Original: « La physique des missiles est vraiment mal faite, et la scène des explosions est super lente […] il faut une musique avec uniquement des voix, vocal, triste et épique. »

The second version (kept under the name plan-sequence-v2-silence.mp4) fixes three things:

  • The bombs follow a real ballistic trajectory: the nose is aligned with the velocity, the parabolic trajectory is measured, the speed at impact goes from 2,298 to 2,678 px/s. No more "levitation".
  • The explosions are made of letters and very fast: 52 frames between the first impact and the end of the five explosions. A brief, abstract sequence, with no bodies and no faces.
  • The music is made only of voices, sad and epic: segments generated with ElevenLabs music and fal.ai (Stable Audio 2.5), assembled and set to stay under the voice.

At this stage the sound cut off sharply after the boom, then stayed in 4.3 seconds of digital silence. The measurement confirms it (see the section on checking). Technically, it was perfect.

Step 8: the director's ear

I listened. My note (translated):

"The animation is almost perfect, just the sound that cuts off all at once, not great. You can add a deafening noise and the music continues."

Original: « L'animation est presque parfaite, juste le son qui coupe d'un coup, pas top. Tu peux ajouter un bruit assourdissant et la musique continue. »

The hard cut, measured to perfection, didn't work to the ear: the AI had done what the contract said ("absolute silence"), but it was my judgment, not a measurement, that said it didn't work. So the final version replaces the silence:

  • the boom keeps its shock (peak at 66.0 s, at the moment of the visual impact);
  • then tinnitus, a continuous high-pitched whistle around 3.4 kHz, rises in 0.1 s and slowly decays until about 70.5 s;
  • the world is muffled: wind, sound effects and music go through a low-pass filter that gradually reopens;
  • the voice music continues with no gap.

The image didn't change: only the soundtrack was redone (the 3,150 frames are identical to the previous version). Measurements on the final MP4: 105 s, 3,150 frames, −15.8 LUFS, peak at −1.7 dBFS. The AI measured, it didn't judge: that's the difference between checking and directing.

The finished film: https://youtu.be/XigOMjfS7GE?t=303 (the full film starts at 5:03 in the tutorial).

How to check the quality of the AI

This is the most important section of this guide. An agent that hands you a file with no error hasn't proven that the file is good. Here is how I checked, in six principles.

1. Make it visible

  • The sheet shrunk to 640 px wide. If you can't recognize the object on the sheet, it's too small or too blurry. Command used:
ffmpeg -i renders/s02.mp4 -vf "select='not(mod(n\,45))',scale=640:-1,tile=4x2" -frames:v 1 planche.jpg
  • A ×2 zoomed crop: you should be able to read letters in it (that's the art direction).
  • Twelve consecutive frames to judge a fall: that's how you see a "levitation" or an acceleration that doesn't exist.

Twelve consecutive frames of a bomb made of letters falling, faster and faster, with a trail of vertical bars appearing above it. Twelve consecutive frames of a fall (scene 3, before the impact): the displacement between two frames grows, the trail appears as the speed rises.

2. Make it measure

  • The level: integrated in LUFS, peak (true peak). Targets here: final film around −16 LUFS, peak at −1.5 dBFS or lower (measured: −15.8 LUFS, −1.7 dBFS).
  • The silence (when the contract asks for it): volumedetect, and you want less than −90 dBFS after the impact. For the final film, that silence was replaced by tinnitus: the measurement is then used to check that the music doesn't stop.
  • The frame count: duration × 30 (12 s = 360 frames).
  • The speed of the fall and of the camera, in pixels per second.
# frame count
ffprobe -v error -select_streams v -count_frames -show_entries stream=nb_read_frames -of csv=p=0 renders/s02.mp4
# peak and loudness: always filter the output (one line every 0.1 s)
ffmpeg -i renders/s02.mp4 -vn -af volumedetect,ebur128=peak=true -f null - 2>&1 | grep -E "max_volume|I:|Peak"

Two sound-level curves between 55 and 80 seconds: at the top, version 2 where the level drops to zero from 66.27 s to 70.60 s; at the bottom, the final version where the level drops after the boom but never reaches zero. At the top, version 2 (an intermediate step, kept): zero non-zero samples from 66.27 s to 70.60 s. An AAC never returns an exact zero: the cut had to end before the visible impact. At the bottom, the final version: after the boom the level drops (muffled world, tinnitus) but the music continues, with no gap (minimum level −47.8 dBFS between 66 and 71 s).

3. Make it re-read

Transcribe the voice with whisper, in 10-second chunks, and compare it with the written text:

whisper-cli -m ggml-small.bin -l en -nt -f voix-morceau.wav

That's how we found "we no longer feel anything" swallowed by the whispered mode.

4. Never believe "it's done"

The pitfalls that were really served to me:

  • Several agents handed back while the render was still running.
  • A green lint proves nothing (the exception that removed the flower).
  • AAC raises the peak: measure the final file, not the WAV.
  • sed -i on macOS fails silently without an extension (sed -i '').
  • -shortest cuts off a frame when muxing.
  • A command piped into | tail hides the exit code of the real command.
  • The ElevenLabs timestamps drift by 0.1 to 0.7 s: cut at the real silences.

5. Keep what the AI can't do

Listening (the AI never heard the film) and judging (beauty, emotion, flow). That's the director. I'm the one who felt that the sound had been "generated separately": no measurement would have flagged it.

6. Ask for honest reports

In every prompt: "short final report: what is verified, what is not, differences from the scenario". And for the final film: "Honest report: what could not be listened to." A report that says what it didn't check is worth more than a perfect report.

How to change your mind and redo a scene

The good news: changing your mind costs almost nothing. As long as you follow one iron rule: you rename the old version, you never overwrite it, you ask again, you compare.

Versions, renamed, never overwritten

In renders/, everything stayed:

s01-v1-dense.mp4   s01-v2-couleur.mp4   s01-v3-gris-degrade.mp4   s01.mp4
s03-v1.mp4  s03-v2.mp4  s03-v3-char.mp4  s03-v4-nuage.mp4  s03-v5-lente.mp4  s03.mp4
s07-v1-char.mp4  s07-v2-lente.mp4  s07-v3-lente.mp4  s07.mp4
s09-v1.mp4  s09-v2.mp4  s09.mp4
film-en.mp4 (9 scenes glued together, rejected)   plan-sequence-v1.mp4 (single shot, version 1)   plan-sequence-v2-silence.mp4 (v2, hard cut)
plan-sequence-en.mp4 (final film, v3)

Scene 3 has six versions. The name says why we changed: v3-char (the tank), v4-nuage (the cloud that hid the bombs), v5-lente (the bombs that fell too slowly). If the new version is worse, the old one is still there.

The tanks become bombs

Scene 3 contained a tank: the AI had first drawn it as a "flat wagon", then with better proportions (turret, gun, tracks). It still didn't work. I made the call: "the tanks don't work". The tanks disappeared from the whole film, replaced by bombs falling from the sky; each bomb leaves a crater, a rainbow comes out of it, and at the first impact all the sounds are cut (a choice that will itself be replaced in the final film: see step 8).

The rejected edit: start from zero, but not from nothing

When I rejected the scene-by-scene edit, I asked to start from zero, not to patch the joins. The nine scenes kept their value as a library of drawings: the continuous shot reuses them, but not their cameras or their cross-fades.

The physics, the explosion, the music, then the sound

Third round (step 7): believable ballistic trajectory, very fast explosions in letters, music of voices only. Fourth round (step 8): the hard cut replaced by tinnitus, the music that continues. Each correction was made without touching what was right ("everything else is good", "the animation is almost perfect"). And the "silence" version stayed, named as such: if the tinnitus had displeased me, going back was a simple rename.

Feedback sentences that work

The notes that worked all have the same qualities: short, concrete, observable. Here are the templates I draw from them (built from my notes above):

What you want Sentence template Real example
Lighten "It's too busy: [object] with fewer [elements]." "the clouds and the flower are too busy, you need to draw with fewer letters"
Make it stand out "[Subject] must stand out: the rest in [gray], only [subject] in color." "everything in black and white, only the flower in color"
Make it readable "[Object] isn't readable: fix it." "the tanks, we can't see them"
Replace "[X] doesn't work: replace it with [Y], which [desired effect]." "the tanks don't work, we'll replace them with bombs"
Speed up "[Object] doesn't [movement] [fast/hard] enough." "the missiles don't fall fast enough"
Enlarge "[Element] is too discreet: [what you want to see]." "the puddle is too discreet"
Extend "[Effect] must be everywhere, not only near [subject]." "the rain has to be everywhere in the scene"
Fix a detail that rings false "[What's good] is almost perfect, just [detail] doesn't work to the ear: [what you want instead], and [what continues]." "the animation is almost perfect, just the sound that cuts off all at once, not great, add a deafening noise and the music continues"
Validate the rest "Everything is good, except [precise point]." "everything is good, except the missiles"
Start over "It doesn't work: [reason]. We start again from zero." "each scene was made separately… we start again from zero"

Two rules of practice: say what's wrong, not only that it's wrong, and say what's right so it doesn't touch it.

What you really need

No studio equipment, but a few building blocks. No price is given here: check the current price of each service.

  • A computer able to render a video locally, and disk space: rendering writes a lot of temporary frames (here, on an external disk).
  • Claude Code, with access to the Sonnet 5.5 and Haiku 5.5 models (check the current price).
  • An ElevenLabs account for the voice, the sound effects and the music; watch the quotas (a fallback script exists for the music). Check the current price.
  • Node.js for npx hyperframes, ffmpeg and whisper.cpp (whisper-cli) installed locally, Python 3 for the mixing and checking scripts.
  • Good headphones or good speakers: the AI doesn't listen, you do.
  • A message: without one, the tool spins in the void.

Mistakes to avoid

  1. Describing everything up front. Describe the first scene, watch, correct.
  2. Overwriting a version. Rename it, you might regret it.
  3. Believing "it's done" or trusting lint. Demand a report of what is verified and what isn't.
  4. Asking a voice model for sound effects. Use an effects model.
  5. Launching too many agents at once. Waves of four.
  6. Assembling separate scenes and believing in a continuous shot. You can feel the seam, in the image as in the sound.
  7. Too much detail. Fewer letters, more poetry.
  8. Showing violence. Suggest it. Here: no bodies, no faces, no visible weapons.
  9. Delegating the ear. The AI measures, it doesn't listen: a hard cut that's perfectly measured can sound wrong.
  10. Promising "in a single prompt". It isn't true, and it damages trust.

Going further

Your film doesn't need ultra-detailed animation. It needs your vision. The rest, you direct.

Questions fréquentes

Can you make an animated short film with AI in a single prompt?
No, and this guide doesn't promise it. For this film it took dozens of exchanges with Claude Code: a description of the vision, an art direction validated on a first scene, a script, scenes built by several agents, then the director's feedback (fewer letters, less color, bombs instead of tanks) and an edit that was redone from scratch. The AI executes fast; the vision, the taste and the corrections stay with you.
Do you need to know how to draw or code to make a short film with AI?
You don't have to draw: here everything is drawn with letters and numbers by code that Claude Code writes. What you do have to accept is working in a terminal, running a command, opening a video file and saying in one sentence what's wrong. The job that matters is the director's: knowing what you want to say, watching, listening, deciding.
Why use Sonnet 5.5 for the art direction and Haiku 5.5 for the scenes?
Sonnet 5.5 (effort "high", no more) is used to describe the film, validate the style and build the first "model" scenes along with the art direction contract (DA.md). Haiku 5.5, which is faster, then builds the other scenes in parallel, in waves of four, following that contract and the code of the model scene. A smaller model has nothing to guess when the model is precise.
Can the AI check that the sound is good?
It can measure it (level in LUFS, peak, silence below -90 dBFS) and re-read the voice with whisper.cpp to compare the spoken text with the written text. It can't listen. Listening and judging (beauty, emotion, flow) stay with the human: I rejected a first edit where the sound felt "generated separately", then a hard audio cut, perfectly measured (4.3 s of digital silence), that "didn't work" to my ear.
How much time and money does it take to make a short film like this one?
I didn't measure it, so I won't give a number. What is measured: the final film is a single shot of 1 min 45 s (105 s, 3,150 frames), several versions of each scene were kept, and the final sound measures −15.8 LUFS with a peak at −1.7 dBFS. For the cost, check the current price of your Claude Code plan and of your ElevenLabs account; they change.

#AI animation #AI short film #art direction #claude-code #elevenlabs #hyperframes

À lire ensuite