Nodes/comfyui-liveportrait/Expression Video 2 Video
ComfyUI Node

Expression Video 2 Video

Morph an expression across a whole frame sequence

By MixLabPro·Created 2 years ago·Updated 2 years ago· 479
Expression Video 2 Video
  • src_frames
  • frames
from_expression
to_expression
interpolation_typecubic

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) and to_expression (STRING) - the start and end poses, as expression_json strings 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, default cubic) - the easing curve for how the expression travels between the two states. cubic eases in and out and is the sensible default; linear is constant-speed; nearest snaps.

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.

Category♾️Mixlab/Video/LivePortrait

Inputs (4)

NameTypeDefaultDescription
src_framesIMAGE
from_expressionSTRING
to_expressionSTRING
interpolation_typeCOMBOcubic3 options: linear, nearest, cubic

Outputs (1)

NameTypeDescription
framesIMAGE