ποΈ Latent Temporal Upsampler
24fps to 30fps in latent space, without the staircase motion
- latent
- latent
LTX generates at a 24fps cadence, but most delivery pipelines want 30fps. If you just linearly interpolate the latent between frames, motion gets that classic jerky staircase look - and if you naively stretch it, everything moves 25% too fast. LatentTemporalUpsampler is the pack's answer: Hermite temporal interpolation with velocity fields, which produces smooth motion instead of linear-blend smearing, plus a built-in pacing correction so the result plays at the right speed.
The key mechanism is Hermite interpolation. Instead of blending between two frames, it uses the estimated velocity (from neighboring frames) as tangents, so interpolated frames follow the actual motion arc rather than cutting straight across. f(t) = h00*f0 + h10*v0 + h01*f1 + h11*v1 - the cubic Hermite basis. That's what keeps a turning head rotating smoothly instead of chopping between two positions.
The inputs
Required: latent, plus source_fps (24) and target_fps (30) - those drive both the frame-count math and the pacing correction.
interp_mode-hermite(default),linear, ornearest. Linear is there for speed comparisons; you'll basically always want Hermite.auto_retime(True) - the important one. It sets the velocity scale tosource_fps / target_fps(0.8 for 24β30), reducing per-frame displacement so playback at 30fps matches the original 24fps speed. Turn it off and you get the 25% speedup problem.motion_scale- manual velocity multiplier ifauto_retimeisn't doing what you want.spatial_sharpen(0.15) - a light latent-space unsharp mask applied to the result, since interpolation tends to soften detail.ltx_safe(False) - rounds the target frame count to(N-1) % 8 == 0. The VAE decoder handles any count; this is a sampler-side constraint. Leave off unless your sampler complains.override_frames- force an exact output frame count instead of the fps-derived one.
Where it sits
It's the middle of the pack's recommended fast-motion pipeline:
KSampler @ 24fps β LatentMotionSharpener β LatentTemporalUpsampler β LatentTemporalInpainter β KSampler (denoise 0.30-0.45)
The sharpener pre-crisps the motion, the upsampler adds frames with correct pacing, and the inpainter fixes the interpolated frames' ghosting with a targeted denoise pass. There's also an audio companion (AudioLatentStretch) in the same pack for keeping the audio latent in sync.
A small honest note: this node changes frame count, not perceived smoothness by itself - the interpolated frames are still synthetic until you run a corrective pass. That's why the inpainter follows it. Used together, the pair is the difference between "30fps that looks sped-up and steppy" and "30fps that looks like it was shot that way."
Install is the pack-wide clone (10S_Nodes into custom_nodes, restart, or ComfyUI Manager β "10S-Comfy-nodes"), no extra dependencies. LTX 5D latent layout assumed - don't feed it a still-image latent and expect magic.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | β | |
| source_fps | FLOAT | 24.01β120 | β |
| target_fps | FLOAT | 30.01β120 | β |
| interp_modeopt | COMBO | hermite | 3 options: hermite, linear, nearest |
| auto_retimeopt | BOOLEAN | true | β |
| motion_scaleopt | FLOAT | 1.000β3 | β |
| spatial_sharpenopt | FLOAT | 0.150β1 | β |
| ltx_safeopt | BOOLEAN | false | β |
| override_framesopt | INT | 00β4096 | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | β |