Generative media · Inference systems

Synthetic film from open weights: memory, compute and licences, stage by stage

Part one of Synthetic film, two ways. A minute of generated film is a systems problem before it is a creative one: tens of gigabytes of weights per stage, hours of GPU per clip, a licence matrix with holes, and a review loop no metric replaces. Every estimate here is derived from published configurations, and the figures let you change the assumptions.

On this page

A minute of film

Generative models have become an artistic medium: voices that were never recorded, scores composed from a sentence, shots that no camera filmed. The same models now make product films and internal explainers. Watching a good result, it is tempting to think the hard part is a prompt, or a script that a coding agent could write in an afternoon.

It is not. Sixty seconds of 720p video at 24 frames per second is 1,440 frames, or 1.33 billion pixels. Open video models do not generate a minute. They generate clips of about five seconds, each one a long computation on a large GPU, and each one has to agree with the next. Around them sit separate models for speech, music, lip movement, frame interpolation and upscaling, each with its own weights, memory footprint, failure modes and licence.

This part walks through that open-weights stack, the first way, with the arithmetic in the open. Part two takes the second way: the managed services that run comparable stacks behind an API.

How a video model makes a frame

A diffusion model learns to undo noise. Training mixes a clean example x₀ with Gaussian noise ε according to a schedule, and teaches a network to recover what was added:

x_t = √ᾱ_t · x₀ + √(1 − ᾱ_t) · ε ᾱ_t = f(t) / f(0), f(t) = cos²( (t/T + s) / (1 + s) · π/2 )

Generation runs the other way: start from pure noise and take tens of steps, each one a full pass of a network with billions of parameters. Wan, the open video model used for the numbers below, is trained with flow matching, which learns a velocity from noise to data rather than the noise itself, but the cost structure is the same: steps, times passes per step, times the cost of one pass. Video models also never denoise pixels. A variational autoencoder first compresses the clip into a latent tensor, and a transformer works on that latent, cut into patches.

Figure 1 · The forward process on a generated image
t = 0t = 1,000signal √ᾱnoise √(1 − ᾱ), dashed
The cosine schedule of Nichol and Dhariwal (2021), s = 0.008, applied to a drawing generated in this page. The figure plays by itself, image to noise and back; running the schedule backwards is for illustration only. A real model gets back to an image by predicting the noise, or the velocity, at each step: by default 40 to 50 steps for the Wan models, each one a full pass of the network, two with classifier-free guidance.

The token count of one clip

The latent is where the cost is decided. Wan 2.1, whose code and weights are published under Apache 2.0, compresses time by 4 and each side of the frame by 8, then cuts the latent into 1 × 2 × 2 patches. A five-second 720p clip, 81 frames at 16 fps, becomes 21 latent frames of 90 × 160, then 21 × 45 × 80 = 75,600 tokens. Every transformer layer lets each token attend to every other: 5.7 billion pairs, per layer, per step. The same clip at 480p is 32,760 tokens, so going from 480p to 720p multiplies the attention work by 5.3.

Figure 2 · From frames to tokens
Frames
81
Latent
21 × 90 × 160
Tokens
75,600
Attention pairs per layer and step
5.72 G
Attention work vs 480p, 5 s
× 5.3
480p, 5 s× 1.0720p, 5 s× 5.31080p, 5 s× 27.4720p, 10 s× 20.3Your setting× 5.3
Frames at 16 fps; latent frames = (frames − 1) / 4 + 1; tokens = latent frames × H / (2c) × W / (2c), where c is the VAE compression per side and 2 is the patch. Bars compare the attention work per layer and step with a five-second 480p clip, on a linear scale. The 4K and 20-second settings are far outside what the released models generate in one pass; they show why.

The open-weights stack, layer by layer

A film is not one model. The diagram is one reasonable open-weights pipeline for a narrated film with a presenter and generated shots. Each box is a separate model or tool, with its own weights, its own input format and its own way of failing. Select a box for its candidates, memory class and failure modes.

Figure 3 · One open-weights pipeline for a narrated film
picturesoundScript & shot listlanguage modelKeyframestext-to-imageShot generationimage-to-videoInterpolationframe synthesisUpscalingsuper-resolutionPresenterstill or plateLip-syncaudio-driven faceVoicetext-to-speechCaptionsspeech recognitionScoretext-to-musicStems & duckingsource separationCompositingtitles, gradeMix & loudnessone levelEncodedelivery

Shot generation

Animates each keyframe into a clip of about five seconds.
Candidates
Wan 2.1 and 2.2 (Apache 2.0), LTX-2.5 (free below US$10M revenue) and others: see the licence matrix and the arena results.
Memory
28.6 GB of weights for the 14B model in BF16, before activations: see Figure 4.
Fails on
Continuity between clips, physics, faces at a distance.
Solid blue border: picture. Dashed blue: sound. Grey: language. Dark: assembly. The dashes run in the direction of the data. Licences are those of the released weights, which can differ from the licence of the code.

Memory and compute per clip

Two walls come first: whether the weights fit in GPU memory, and how long the arithmetic takes once they do. The Wan 2.1 14B transformer ships as 57 GB of FP32 safetensors; inference casts it to BF16, 28.6 GB, already more than a 24 GB card before a single activation. Its text encoder, the encoder half of umT5-XXL, is an 11.4 GB file of its own. Wan 2.2 pushes both ways: its A14B model splits denoising between two experts of 14.3 billion parameters, one for high noise and one for low, so 28.6 billion must be held for 14.3 billion active per step, and the README asks for at least 80 GB of GPU memory to run it on one card; its 5B model takes the other lever, a VAE that compresses each frame 16 × 16, which leaves a quarter of the tokens per latent frame.

For a diffusion transformer with P active parameters, L layers of width d and N tokens, one forward pass costs about:

FLOPs per pass ≈ 2·P·N + 4·L·d·N² FLOPs per clip ≈ steps × (2 with classifier-free guidance, else 1) × FLOPs per pass time per clip ≈ FLOPs per clip ÷ (dense BF16 FLOP/s × utilisation)

The first term is the matrix multiplications, the second is self-attention, and at video token counts the second dominates: for the 14B model at 720p it is more than twice the first. Classifier-free guidance, on by default in the Wan scripts with a scale of 5, runs the network twice per step, once with the prompt and once without.

Two published timings anchor the formula. The Wan 2.1 authors report about 4 minutes for a five-second 480p clip from the 1.3B model on an RTX 4090; with the default 50 steps and guidance, the formula gives that time at about 73 % of the card’s dense BF16 peak. For Wan 2.2’s 5B model they report under 9 minutes for five seconds of 720p on “a single consumer-grade GPU” with at least 24 GB, which on an RTX 4090 means at least 61 %. The figure below starts at 60 %. A run made for this article gives the other end: on an NVIDIA L4, an off-the-shelf diffusers pipeline took 12 minutes 3 seconds for the 50 steps of the same 480p clip, 14.4 seconds a step, which is 33 % of the L4’s dense BF16 peak. Set the slider to 33 % to see what that does to a finished minute.

Figure 4 · Will it fit, and how long will it take
GPU memory 24 GBweights 29.1 GB
Tokens per clip
75,600
FLOPs per clip
684.24 P
Weights fit?
No, offloaded
Added by offloading
1.9 min
Time per 5 s clip
2.6 h
GPU time per finished minute
127.2 h
Estimates from the formulas above, not measurements. Utilisation is an assumption, set by default to 60 % from the two published timings above; the run made for this article reached 33 % on an L4. Memory counts weights only: activations, attention buffers and the VAE decode come on top. When the weights do not fit, offloading streams them over PCIe at every pass, here at an assumed 25 GB/s. Distilled samplers with 4 to 8 steps and sparse attention cut the time several-fold, each at the price of another component to integrate and validate. A finished minute is 12 kept clips of five seconds; the number of generations per kept clip is your assumption.

The constants behind Figures 4 and 5, with their sources:

ItemValue usedSource
Wan 2.1 T2V 1.3B1.419B active, 1.419B held; 30 layers × 1,536; 50 steps by default; 16 fps; VAE 8 × 8 per frame, 0.51 GB fileWan2.1 configs
Wan 2.2 TI2V 5B, 16 × 16 VAE5.000B active, 5.000B held; 30 layers × 3,072; 50 steps by default; 24 fps; VAE 16 × 16 per frame, 2.82 GB fileWan2.2 configs
Wan 2.1 T2V 14B14.288B active, 14.288B held; 40 layers × 5,120; 50 steps by default; 16 fps; VAE 8 × 8 per frame, 0.51 GB fileWan2.1 configs
Wan 2.2 T2V A14B, two experts14.288B active, 28.577B held; 40 layers × 5,120; 40 steps by default; 16 fps; VAE 8 × 8 per frame, 0.51 GB fileWan2.2 configs
umT5-XXL encoder11.36 GB file in BF16, so about 5.68B parametersWan-AI model files
NVIDIA L4, 24 GB121 dense BF16 TFLOPSAda whitepaper
RTX 4090, 24 GB165.2 dense BF16 TFLOPSAda whitepaper
RTX 5090, 32 GB209.5 dense BF16 TFLOPSRTX Blackwell whitepaper
NVIDIA L40S, 48 GB362.05 dense BF16 TFLOPSL40S page
A100, 80 GB312 dense BF16 TFLOPSA100 page and datasheet
H100 SXM, 80 GB989.4 dense BF16 TFLOPSH100 page, dense = sparse ÷ 2
PCIe offload25 GB/s, assumed; PCIe 4.0 × 16 is 32 GB/s each way in theoryAssumption
Storage, other stagesThe read speeds of Figure 5, and the sizes and minutes listed in the boxes of Figure 3Assumptions

Location constrains the hardware too. In the AWS price list of 23 October 2026, the on-demand GPU instances in Paris (eu-west-3) were the g4dn, g5, g6, gr6 and p6-b200 families: no H100 or L40S instances. The single-L4 g6.xlarge cost $1.0216 an hour, and a team that must keep scripts and footage in that region starts from that card.

One GPU, many models

The stack in Figure 3 holds more weights than any single GPU has memory. Unless every stage gets its own GPU, models take turns: read from storage, moved to the device, used, evicted. The read alone depends on where the checkpoints live. Batching by stage, all keyframes, then all shots, then every lip-sync pass, pays each load once. Going clip by clip pays it twelve times per minute.

Which one matters depends on the rest of the setup. With the defaults of Figure 4, a 14B model on an L4, the video computation takes about 32 hours per finished minute and the reads are noise. Make the computation fast, an H100 with an 8-step distilled sampler, and put the checkpoints on a network disk at 125 MiB/s read clip by clip: the reads then take longer than the computing, about 60 % of the total under the assumptions shown. Every speed-up on the GPU moves the bottleneck somewhere else.

Figure 5 · Reading weights versus computing, for one finished minute
1 s1 min1 h1 dayKeyframes8 s2.0 minShot generation10 s31.8 hInterpolation0 s2.0 minUpscaling0 s4.0 minLip-sync3 s8.0 minVoice1 s3.0 minScore2 s3.0 min
Total on one GPU
32.2 h
Reading weights
24 s
Share spent reading
under 0.1 %
For each stage, hatched: reading its weights; solid: computing. The time axis is logarithmic, from one second to about eleven days. The video stage uses the BF16 size and the time per clip from Figure 4 with its current settings, times 12 clips; the keyframe stage uses the BF16 size of a 12B image model. The other sizes and durations are assumptions of the right order, listed in each box of Figure 3. Retakes are not counted.

The licence matrix

“Open” says the weights can be downloaded, not what may be done with them. Several of the best-known checkpoints forbid commercial use, cap it by revenue, or exclude whole territories, sometimes including the reader’s own. The table summarises the licence files as read on 25 October 2026. It is not legal advice: read the file of the exact version you deploy.

ModelRoleWeights licenceCommercial usePoint to check
Wan 2.1, Wan 2.2Video, 1.3B to 14B activeApache 2.0YesUsage rules in the README; later Wan versions have no published weights.
HunyuanVideo, HunyuanVideo 1.5Video, 13B and 8.3BTencent Hunyuan Community LicenseNot in the EUSection 1(l) excludes the European Union, the United Kingdom and South Korea; section 5(c) makes use outside the territory unlicensed.
LTX-2, LTX-2.3, LTX-2.5Video with audio, 19B to about 22BLTX-2 and LTX-2.x Community LicenseUnder US$10MEntities with US$10M or more in annual revenue need a paid licence.
MiniMax H3Video with audio, 33BMiniMax H3 Community LicenseNot in the EU or USSection I.5 excludes the EU, the UK, South Korea and the United States; written approval above US$20M revenue; the name must be displayed.
Mochi 1, MAGI-1Video, 10B; 4.5B and 24BApache 2.0YesAbout 60 GB of GPU memory for Mochi 1 on one GPU.
Step-Video-T2VVideo, 30BMITYesAbout 78 GB of peak GPU memory.
XTTS-v2Speech, voice cloningCoqui Public Model LicenseNoNon-commercial only; the company behind it closed in January 2024, and no route to a commercial licence was found.
F5-TTSSpeech, voice cloningCC BY-NC 4.0 (the code is MIT)NoNon-commercial because of its training data.
Kokoro-82MSpeechApache 2.0YesIts phonemiser fallback, espeak-ng, is GPL-3.0.
StyleTTS 2SpeechMIT, with terms on the pretrained modelsWith disclosureListeners must be told the speech is synthetic unless the voice’s owner agreed.
PiperSpeechCode now GPL-3.0; one licence per voicePer voiceThe en_US lessac voice comes from a corpus licensed for research only.
OrpheusSpeech, 3BTagged Apache 2.0CheckDerived from Llama 3.2, whose licence has its own conditions on derivatives.
LatentSync, LivePortraitLip-sync, portrait animationLatentSync: OpenRAIL++; LivePortrait: MITCheck dependenciesBoth use InsightFace detection models, licensed for non-commercial research only; LivePortrait’s licence says to replace them for commercial use.
Hallo3Talking headTagged MITCheck base modelDerived from CogVideoX-5B, whose licence requires registration and caps commercial use.
WhisperSpeech recognitionMIT for code and weightsYesThe model hub tags large-v3 Apache 2.0; the official repository says MIT.
Parakeet TDT 0.6B v3Speech recognitionCC BY 4.0Yes, with creditAttribution required.
MMS forced alignerAlignmentCC BY-NC 4.0NoNon-commercial.
FLUX.1 [schnell]Image, 12BApache 2.0YesThe [dev] variant of the same family is not. The files are gated on the model hub: an account and accepted conditions are needed to download them, and the run for this article got a 401 without one.
FLUX.1 [dev]Image, 12BFLUX.1 [dev] Non-Commercial License v1.1.1NoSection 2(d) allows commercial use of outputs; section 4(a) forbids commercial or production use of data the model produces. A commercial licence is sold separately.
FLUX.2 [dev]Image, 32BFLUX Non-Commercial License v2.1NoCommercial licence from the vendor.
FLUX.2 [klein]Image, 4B and 9B4B: Apache 2.0; 9B: FLUX Non-Commercial License4B onlySame name, two licences.
Stable Diffusion XLImageCreativeML Open RAIL++-MYesUse restrictions in its Attachment A.
Stable Diffusion 3.5Image, 2B and 8BStability AI Community LicenseUnder US$1MFree under US$1M annual revenue; commercial users must register; above that, an enterprise licence.
HunyuanImage 3.0Image, 80B (13B active)Tencent Hunyuan Community LicenseNot in the EUThe licensed territory excludes the European Union, the United Kingdom and South Korea.
Qwen-ImageImage, 20BApache 2.0YesNone from the licence.
MusicGenMusicCC BY-NC 4.0 (the code is MIT)NoCode and weights have different licences.
Stable Audio Open 1.0Music, up to 47 sStability AI Community LicenseUnder US$1MAs SD 3.5.
YuESongsv1: Apache 2.0; YuE2: CC BY-NC 4.0 with a creator permissionv1; YuE2 for individualsYuE2 lets individuals monetise outputs; companies need a commercial licence.
DiffRhythmSongsApache 2.0 for code and DiT weightsCheck the VAEIts VAE is fine-tuned from Stable Audio Open and carries the Stability AI Community License.
DemucsSource separationCode MIT; weights stated by the author as for scientific purposesUnclearThe repository is archived; the weights question is open on the model hub.
Real-ESRGANUpscalingCode BSD 3-Clause; no separate terms for the weightsCheckWeights are release assets without their own licence text.
Practical-RIFEInterpolationMIT, weights includedYesNone from the licence.

How far behind is open

On the Artificial Analysis text-to-video arena, where people vote blind between two clips, the ranking read on 25 October 2026 put a closed model first: Wan 3.0, at 1175 Elo. The best open-weights model, MiniMax H3, was fourth at 1158, inside the margin of error. Its licence excludes the European Union, the United Kingdom, South Korea and the United States. The best open models that a company in the EU may run under their licence, Lightricks’ LTX-2.5, free below US$10 million of annual revenue, stood at 949, in 24th place.

The model behind the numbers in this article has followed the same path: Wan published weights up to version 2.2; versions 2.5 to 2.7 are offered through Alibaba Cloud’s API, with no weights on the Wan-AI model hub, and the arena lists 3.0 as closed. So the open way, for a European team, starts from models a clear step behind the services it would compete with.

Samples made for this article

Estimates are one thing, outputs another. The samples below were generated for this article with open-weights models, from scripts kept with it, with every setting and every time recorded.

Figure 6 · Voice: Kokoro-82M, Apache 2.0, voice af_heart

“Generating a minute of film from open models is a systems problem before it is a creative one.”

“Wan 2.1 runs at 16 fps, its VAE compresses each frame eight by eight, and EBU R 128 asks for minus 23 LUFS.”

fps → ˌɛfpˌiˈɛs VAE → vˌiˌAˈi EBU → ˌibˌijˈu R 128 → ˈɑɹ wˈʌn hˈʌndɹəd twˈɛnti ˈAt LUFS → ˌɛljˌuˌɛfˈɛs
Both lines generated on 25 October 2026 on the CPU of an Apple M4 Max: 6.4 and 11.4 seconds of speech in 2.0 and 0.9 seconds, after 2.3 seconds of loading. The phonemes are those the model’s English front end produced before any sound: it spells every acronym letter by letter and reads “R 128” as “R one hundred twenty-eight”, where broadcast engineers say “R one-twenty-eight”, and often “luffs”. Each such term needs handling of its own, in each language. Under each line, its log-mel spectrogram: 80 frequency bands up to 12 kHz against time, computed back from the audio, with a line that follows playback. It is the kind of picture the model’s decoder works in: its configuration file describes an ISTFTNet, two upsampling stages of 10 and 6 followed by an inverse short-time Fourier transform with a 20-point window and a 5-sample hop, so 300 samples of 24 kHz audio, 12.5 milliseconds, for each frame the model predicts.
Figure 7 · Image and video: SDXL and Wan 2.1 T2V 1.3B on one NVIDIA L4

“A moonlit valley at night, layered deep-blue hills, a large pale-gold moon, rivers of luminous ink flowing across the sky in long curved strokes, painterly contemporary digital art.”

A painterly night scene in deep blue and pale gold: flowing ink-like strokes under a small full moon, generated by SDXL

“Rivers of luminous gold ink swirling and flowing fast across a deep-blue night sky, strokes curling and unfurling…”

“Ocean waves of deep blue and gold paint crashing and rolling toward the viewer under a full moon…”

“Clouds racing across a moonlit sky above layered deep-blue hills, time-lapse…”

Keyframe, SDXL, 1344 × 768, 30 steps
19.1 s
Denoising, per five-second shot (81 frames, 50 steps)
12 min 13–23 s
Decoding, per shot
about 30 s
Peak GPU memory
11.5 GB
Loading the models, once
3 min 51 s
The three shots, each from its own description, were generated on 25 October 2026 on one NVIDIA L4 (an AWS g6.4xlarge spot instance in Frankfurt, 46 minutes for the three, at a spot price near $1 an hour), with each component on the GPU only while it is used. A first shot that asked only for a slow camera push barely moved: its first and last frames were 93 % alike by SSIM, against 38 %, 39 % and 70 % for these three. The keyframe is SDXL because FLUX.1 [schnell], the first choice, is gated on the model hub. Same world, different models, different looks: the continuity problem of the next section. A run that kept every component on the GPU measured 12 minutes 3 seconds of denoising for one shot, then ran out of memory at the decode, with the 11 GB text encoder still resident.

The part you cannot download

A pipeline that runs is not a pipeline that produces something you would show. The failure modes are specific, and most of them only a person sees:

Metrics help but do not decide. Video benchmarks score dimensions such as subject consistency and motion smoothness; intelligibility and loudness can be measured. None of them says whether a shot is good. In practice someone reviews every second, and most generations are thrown away: that is the “generations per kept clip” in Figure 4.

What a coding agent changes, and what it does not

This article is a small test of the question. An AI coding agent wrote the code of its figures under my direction, and AI agents found and summarised the licence files, datasheets and price lists in the sources, each one linked so that every number can be checked. That is the part of a generative-media project that agents speed up: code and reading.

None of that work produced a GPU hour, a model weight, a licence or a reviewed shot, and those are the costs of the pipeline in Figure 3: on the defaults of Figure 4, 127 GPU hours on an L4 for one finished minute, a review of every row of the licence matrix for the exact versions used, and a person watching every generation. A prompt or a skill can describe the process. It does not come with the infrastructure, the models or the review.

The second way

Managed services run comparable stacks on their own fleets and sell the result per second, per character or per seat. The GPUs, the licences of their models and much of the quality work become their problem; the brief, the review and the terms of use of what you generate remain yours. Part two, in preparation, compares them on price and on the same short brief, with what each run actually cost.

What this part does not establish

Sources

Keep exploring

Working on a similar problem? Let’s discuss it.

Get new articles via RSS