Video Retime
Slow motion with frames that were never there
- video
- ema_vfi_model
- speed_curve
- motion
- video
- frames
A generated clip is 4 to 15 seconds long and usually one speed. If the shot wants to be a slow-motion beat, your options used to be "generate a slower one and hope" or "duplicate frames and get a stutter". Video Retime is the third option: new frames are drawn between the ones the clip has, at the clip's own frame rate, and the audio follows along with its pitch kept.
This is the node that turns a decent 5-second generation into an 8-second music-video shot.
Inputs
video is the clip, at least two frames. speed is the headline number - 0.5 is half speed and twice as long, 1 unchanged, 2 double speed and half as long, with a range of 0.05 to 16. frames comes out as an INT telling you how many frames the retimed clip holds, which is genuinely useful for wiring a downstream length without doing arithmetic.
new_frames is how a frame between two is made: interpolate draws it with EMA-VFI (the good one), blend mixes the two neighbours, hold repeats the nearer one. Only interpolate needs the optional ema_vfi_model from EMA-VFI Video Model Loader. If you have not installed that, blend and hold are still there - and hold is not a joke option: on a stylised or animated clip, holding looks better than blending, and much better than a bad interpolation.
audio is keep pitch or drop - "keep pitch" stretches the audio along the new timing at its own pitch, and it really does mean what it says. Drop it if you are marrying the clip to an external soundtrack later.
speed_curve is the fun one: an array - the values out of Curve to Numbers - applied across the source clip, stretched over it, and it replaces speed. [1, 0.25, 1] slows to a quarter speed in the middle and comes back. That is a speed ramp without keyframing anything.
motion optionally takes a shared measurement from Video Motion, whose cuts are respected. Left empty, cuts are found here - and cuts matter a lot for this node, because interpolating across a hard cut produces an unholy smear of two unrelated shots. The node does not do that, and that is the single best reason to use it rather than a generic RIFE pass.
The EMA-VFI model, and the catch
Interpolation needs ComfyUI/models/EMA-VFI, and the checkpoints come from the pack's own weights repo (WAS/was-node-suite-weights, under EMA-VFI/): ours_t.safetensors and ours.safetensors at 250 MB each, ours_small_t.safetensors at 56 MB for a lighter option. The _t variants are the ones that work at multipliers above 2×; a plain checkpoint asked to double beyond 2× will say, in the log, that it was only trained to land halfway between two frames. If you are going for 4× or 8× slow motion, take a _t.
You can put those files on disk yourself, or set features.network: true under features: in config.yaml and let the node fetch one. Network is off by default, and a node missing its weights will name the key it wanted rather than silently reaching out.
Install
ComfyUI Manager → search WAS Node Suite v3 → install → restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git
ComfyUI 0.14.0+ and Python 3.10+. The pack installs no packages - requirements.txt is one comment line, it never runs pip, and the EMA-VFI network is vendored in the repo with its licence beside it, so there is nothing to pip-install for interpolation. Just the weights.
Two settings worth remembering
Interpolation is not free quality: at 4×, three of every four output frames are the network's guess. Faces and fine texture are where the guess shows. If the shot looks wrong at high multipliers, blend in some hold or use a lower speed and generate longer instead.
And follow a sped-up shot with Video Motion Blur. Doubling the speed halves the frames and doubles the apparent strobe; a 180-degree shutter cleans it up and is the difference between "sped up" and "time-lapse".
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | The clip to retime, at least two frames. | |
| speed | FLOAT | 0.500.05–16 | 0.5 = half speed, twice as long; 1 = unchanged; 2 = double speed, half as long. |
| new_frames | COMBO | interpolate | How a frame between two is made: 'interpolate' draws it with EMA-VFI, which needs ema_vfi_model; 'blend' mixes the two; 'hold' repeats the nearer one; 'auto' draws with EMA-VFI only where the motion accounts for the change, such as a body moving rather than a mouth changing shape. |
| audio | COMBO | keep pitch | 'keep pitch' stretches the audio along the new timing at its own pitch; 'drop' leaves it out. |
| ema_vfi_modelopt | EMA_VFI_MODEL | The interpolation network from EMA-VFI Video Model Loader, for 'interpolate'. Any speed but 0.5 needs an 'ours_t' checkpoint. | |
| speed_curveopt | ARRAY | Speed across the source clip for a ramp, such as the values of Curve to Numbers: [1, 0.25, 1] slows to a quarter mid-clip. Stretched over the clip; replaces speed. | |
| motionopt | WAS_MOTION | Motion from Video Motion, measured from this same clip at any size, whose cuts are kept. Left empty, cuts are found here. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | The retimed clip at the source's frame rate and size. |
| frames | INT | How many frames the retimed clip holds. |