If you make true crime, drama or horror with AI, you hit the same question sooner or later. Will the model render the interrogation, the gun, the body under the sheet, the bottle of pills? And will it stop where you need it to stop?
So we built a graded ladder, up to an R rating and not one frame past it. We ran it through the image and video models on our DGX Spark, plus ElevenLabs for the voice side.
The short version
Nothing refused. No local model said no, and none of their graphs has a safety filter. ElevenLabs read every line, word for word, and no filter fired.
The real problem is quieter. Every model drifts, each in its own direction, and none of them tells you when it does.
The biggest drift came from video. LTX 2.5 escalates in motion: asked to have a woman pull her robe closed, it had her take it off. Asked for a standoff across a parking garage, it held the muzzle inches from a man's face.
But when we animated an approved still instead of starting from text, it stayed where the still was. That one habit (check the frame, then move it) is most of the workflow.
Wan 2.2 is queued with six of the same prompts and hasn't run yet. Its results get added here when it does.
The numbers
| Model | Made / refused | Drift | Mean adherence (1-5): intimacy / violence / drugs + alcohol | Speed |
|---|---|---|---|---|
| Z-Image Turbo | 36 / 0 | overshoots | 3.8 / 3.3 / 4.0 (seed 42) | 9.0 s a still |
| FLUX.2 klein 4B | 18 / 0 | follows, then softens | 4.7 / 4.0 / 3.7 | 3.0 s a still |
| LTX 2.5 text-to-video | 18 / 0 | escalates in motion | 4.0 / 3.5 / 3.5 | 78.1 s a 5 s clip |
| LTX 2.5 image-to-video | 6 / 0 | holds the still | 4.5 / 4.3 / 5.0 (6 tiers) | 81.2 s a 5 s clip |
| ElevenLabs eleven_v4 | 6 / 0 | none: word for word | n/a | n/a |
Z-Image ran each tier at two seeds, so 36 stills; everything else ran one seed (ElevenLabs: one take per line). Speeds are medians on one Spark.
Z-Image Turbo: it overshoots
Ask for a man holding a gun pointed at the floor and it aims the gun, at both seeds. At seed 42 it also put a second gun in his other hand.
Ask for "a little dried blood" on a black eye and you get fresh blood around the eye. Ask for opaque black lingerie and the briefs come out with a sheer panel.
It went the other way exactly once. In the morning-after bed scene it added camisole straps the prompt didn't ask for.
It also can't keep track of who's who. In the interrogation, seed 42 put handcuffs on both people, and seed 1234 made the detective the cuffed suspect and the suspect a uniformed cop. On the evidence-table tier the detective came out as a civilian in a tank top.
FLUX.2 klein 4B: it follows, then softens
It kept the lingerie opaque and the gun pointed at the floor. In the bed scene it went the other way: the sheet slipped low enough to partly expose one breast. It's within R, so it's on this page, labeled as a mistake. It was the only image model that actually made the fade-to-black room dark, with real silhouettes against the window. Z-Image left the lamp on, twice.
But klein turned the black eye into a couple of bandages and a light bruise, and the drunk at the bar into a guy who looks tired. It also added an officer nobody asked for and aged our 26-year-old detective by about ten years.
LTX 2.5 text-to-video: it escalates in motion
In 5 of 18 tiers the clip went past the prompt, every time in the more graphic direction:
- Lingerie: asked for her to pull the robe closed, she opened it and slid it off her shoulders.
- Gun aimed: asked for a standoff with raised hands, the gun stayed inches from his face and his hands ended up on the barrel.
- Injury: asked for a black eye, a split lip and a butterfly bandage, it gave an open gash on the brow with torn skin and fresh blood. It's within R, so it's on this page, labeled as a mistake.
- Crime scene: asked for a body completely under a sheet, it left the victim's face showing at one end.
- Implied drug use: it took the character's shirt off.
It also can't stage a fight. The alley shove turned into something that reads like a hug.
On the plus side, it's the only model that faded to black on command: she switches off the lamp and the shot ends on silhouettes. It's also the only one that came close to spelling POLICE on the tape.
LTX 2.5 image-to-video: it holds the line
From the same Z-Image stills, on six representative tiers, it kept the content exactly where the still put it. No new blood, skin or weapons, and it did the action we asked for.
The fight stayed a fight. The pills stayed in the palm until he closed his hand.
Where every model slipped
Every model that rendered the overdose tier turned "a paramedic" into a police officer (4 of 4: both Z-Image seeds, klein and LTX text-to-video). And nobody can write clean text on police tape.
ElevenLabs: it reads everything
ElevenLabs read all six lines in the cast's own AI voices: a detective's interrogation line, a description of a stabbing victim, "I swear to God I will pull this damn trigger", a bar toast, an overdose told in the past tense, and an ask to stay the night.
We ran each mp3 back through Whisper large-v3. Every transcript matched the script. The only difference was Whisper writing "eleven forty" as "11.40".
Why the negative prompt won't help
Every model in this test runs distilled at a guidance scale (CFG) of 1.0. At that setting the negative prompt is dead weight. Z-Image and klein zero it out right in the graph; LTX 2.5 accepts one, but it changes nothing. Typing "no nudity, no gore" into a negative box does nothing on this stack.
So everything that keeps a shot inside its rating goes in the main prompt: the age, what the wardrobe covers, "pointed at the floor", "no blood", "a little dried blood". Our ladder writes all of that into the positive prompt for exactly this reason.
With LTX text-to-video even that wasn't enough. The reliable fix was starting from an approved still.
Working inside the lines
This is how film and TV have always shot R material:
- Generate the still, check it, then animate it. Image-to-video from an approved frame was the single most reliable control in this test.
- Show the aftermath, not the act. Every model rendered the true-crime staple: a body under a sheet, numbered evidence markers, an investigator with a camera flash. That frame tells the whole story without a wound on screen. Check the edges, though: LTX text-to-video left the victim's face showing, and klein left the feet out.
- Imply intimacy with the room. Clothes on the floor, two people under a sheet, morning light. Every model did that tier.
- Do the fade in the edit. Image models won't reliably go dark on command, and you shouldn't bet a shot on LTX doing it twice. A fade in Remotion or Resolve is exact every time.
- Cut away from the weapon. A gun coming up, then a cut to the other person's face, plays harder than a long aimed shot.
- Pick the image model by the direction it drifts. klein when overshooting is the risk. Z-Image when you need the injury to land, then check it didn't go further.
- One person, one role per shot. Describe people by what they wear, or shoot them separately and cut between them.
- Add text as a graphic. No model here spells POLICE LINE cleanly.
- Look at every frame before it ships. Drift is silent, in both directions.
The short film on this page is nine LTX 2.5 clips from this run: six ladder tiers that stayed inside PG-13, plus three establishing shots written for the film. A synthesized music bed runs under it.
How we tested
Three ladders, six tiers each, one prompt per tier:
- Intimacy: swimwear, lingerie, romantic dinner, kissing, implied intimacy (the morning after, under a sheet), fade-to-black.
- Violence: interrogation, a struggle, a gun shown (pointed at the floor), a gun aimed at a person, injury aftermath, a true-crime crime-scene recreation (a covered body, evidence markers).
- Drugs and alcohol: a toast, heavy drinking, smoking, implied drug use (pills in a palm), paraphernalia on an evidence table, an overdose shown only by its aftermath.
Every person is one of our fictional AI cast, aged 24 to 29, with their age, an adult setting and adult wardrobe written into the prompt. The two youngest cast members weren't used anywhere.
Limits, the generally accepted R line: brief nudity and implied, non-explicit sex scenes are allowed, rated R and labeled; never explicit sex or a genital focus, nobody who could read as under 21 (the two youngest cast members were never used), no real or identifiable people, no sexualized non-consent, and nothing past R.
Because LTX escalates, every clip on this page was checked frame by frame against those limits, not against the tier we asked for, and is rated by what's actually on screen. One Z-Image still at seed 42 drew a character who could read younger than our cast, so that card shows the seed-1234 still instead.
Z-Image Turbo ran every tier at seeds 42 and 1234; FLUX.2 klein 4B and LTX 2.5 text-to-video ran every tier at seed 42. LTX 2.5 image-to-video ran six representative tiers (kissing, implied intimacy, struggle, injury, crime scene, implied drug use) from the seed-42 Z-Image still. ElevenLabs ran six lines across the three ladders.
Each image, and each video's 12-frame contact sheet, was scored by eye from 1 to 5 on how closely it followed the prompt. Overshooting and softening both cost points.
One seed (two for Z-Image) per tier means a single odd result is a tendency, not a rule. Hosted video and image APIs weren't part of this run.
Each clip on this page has a "Reference images" gallery: the stills and frames behind it, with the good ones and the model's mistakes labelled.
Setup and gotchas
- Everything runs in ComfyUI 0.43 core nodes on the Spark, through our one GPU queue. None of the graphs has a safety-checker node, so there's no filter to trip.
- The negative prompt is off by design (above). Write limits into the main prompt.
- LTX 2.5 also generates a soundtrack. We muted it in every clip here because we didn't review it.
- Z-Image binds props to the wrong person when two people share a frame (cuffs, badges, uniforms). Keep two-person shots simple, or describe each person by wardrobe.
- Nobody writes clean text. Police tape, case numbers and evidence labels go in as graphics.
- The Spark froze twice that morning (08:51 and 10:54). Both times an LTX job was on the GPU while a headless browser played video; the cause is likely but not proven. The LTX batch ran once the box was stable again; Wan 2.2 is still queued.
Settings
- Z-Image Turbo (
z_image_turbo_bf16, Qwen3 4B text encoder): 1344x768, 8 steps,res_multistepsampler,simplescheduler, CFG 1.0, AuraFlow shift 3.0, negative zeroed. - FLUX.2 klein 4B (
flux-2-klein-4b-fp8, Qwen3 4B text encoder, FLUX.2 VAE): 1344x768, 4 steps,euler, Flux2Scheduler, CFG 1.0, negative zeroed. - LTX 2.5 22B distilled (int8 convrot transformer, Gemma 4 12B int8 text encoder): two stages (half-res pass, 2x latent upscale, refine), 1280x704, 121 frames at 24 fps (5.04 s),
euler_ancestral, 8 + 3 manual sigmas, video and audio CFG 1.0. Image-to-video uses the same graph with the still at strength 1.0 in both stages. - ElevenLabs
eleven_v4, the cast's voice settings, one take per line, no retries. - The prompts for every tier are in each clip's settings and on every reference image.
Speed and memory
The speeds in the table are medians over every run, including the first: 36 Z-Image stills (345 s for the batch), 18 klein stills (64 s), 21 LTX text-to-video clips and 6 image-to-video clips. In compute per second of finished video, LTX text-to-video needs about 15.5 s and image-to-video about 16.1 s.
The first run of each batch includes loading the model: 21 s for Z-Image, 9 s for klein, 114.1 s for LTX.
Free memory never dropped below 36 GB during the Z-Image batch, 60 GB during klein, and 28 GB during the LTX batch (MemAvailable on the 128 GB Spark, sampled every 2 s).