Expression Video 2 Video
Morph an expression across a whole frame sequence
- src_frames
- frames
This is the video sibling of ExpressionVideoNode. Same idea - glide a face from one expression to another - but instead of animating a single still, it works across a batch of source frames. You hand it an existing sequence of images and two expression states, and it applies a morph from the first expression to the second over the course of that sequence. Frame one sits near the "from" pose, the last frame lands near the "to" pose, and everything in between eases across.
Why bother with the batch version? Because your source might already be moving. If you've got a clip of a character and you want to layer an expression arc on top of the motion that's already there - start stern, end smiling, across the shot - the single-still node can't do it; it only knows one frame. This one walks your frames and blends the expression change through all of them.
How it works
Every expression in this pack is a point in LivePortrait's motion space, produced by the Expression Editor. ExpressionVideo2VideoNode interpolates between the two points you give it and distributes that interpolation across your incoming frames, re-warping each source frame at its position along the curve. So the expression shift is tied to the timeline of your footage rather than to a fixed frame count - the number of steps is however many frames you fed in.
The inputs and outputs that matter
src_frames(IMAGE) - the batch of source frames you're editing. Decode your clip to images (a Mixlab or any video-load node) and feed the batch here. This is what makes it the "video 2 video" node rather than the single-image one.from_expression(STRING) andto_expression(STRING) - the start and end poses, asexpression_jsonstrings from ExpressionEditor_. Dial two faces in the editor, capture each one's JSON, wire them in. These are the endpoints of the morph.interpolation_type(enum:linear/nearest/cubic, defaultcubic) - the easing curve for how the expression travels between the two states.cubiceases in and out and is the sensible default;linearis constant-speed;nearestsnaps.
Notice what's not here compared to the single-image ExpressionVideoNode: there's no interpolations_num. That's on purpose - the number of steps is set by how many frames are in src_frames, so the length of the morph is the length of your clip.
The output is frames (IMAGE) - the processed sequence as an image batch, ready for a frames-to-video / save node.
How to install it
Through ComfyUI Manager, search comfyui-liveportrait, install, restart. Or clone it directly:
cd ComfyUI/custom_nodes
git clone https://github.com/shadowcz007/comfyui-liveportrait
and restart. Place the LivePortrait and InsightFace model weights (Google Drive / Baidu links in the README) under ComfyUI/models/liveportrait and ComfyUI/models/insightface. If comfyui-mixlab-nodes is installed already, you don't need extra dependencies.
Common issues
Two failure modes are specific to this node. First, the expression inputs must be genuine expression_json from the Expression Editor - build that chain and verify it before anything else. Second, remember the morph length is bound to your frame count, so if the transition feels too fast or too slow, that's a property of how many src_frames you fed in, not a hidden step setting. Beyond that it's the pack's shared reality: the models don't auto-download (empty models/liveportrait is the usual cause of "it errors"), InsightFace is the dependency most likely to blow up the import (a missing C++ toolchain, much better since InsightFace 1.0), and the InsightFace weights are non-commercially licensed, which follows through to your output. This node has effectively zero search traffic and is one of the pack's more niche pieces - reach for it only when you specifically need an expression arc laid over existing footage.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| src_frames | IMAGE | — | |
| from_expression | STRING | — | |
| to_expression | STRING | — | |
| interpolation_type | COMBO | cubic | 3 options: linear, nearest, cubic |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | — |