FLOAT Extract Emotion (Dynamic) (VA)
A face that gets angrier as the audio does
- audio
- emotion_model_pipe
- we_latent_dynamic
- emotion_model_pipe_out
- emotion_sequence
Every other emotion node in this pack gives your talking head one mood for the whole clip. FLOAT Extract Emotion (Dynamic) is the one that lets the face change its mind. Instead of predicting a single emotion from the whole audio, it chops the clip into chunks, runs the emotion model on each one, and produces a time-varying we_latent - a sequence of emotion vectors, one per video frame - so the expression follows the emotional arc of the speech. Quiet opening, rising anger, shout, resolution: the face rides along.
It's the pack's experimental node - added in version 1.1.0, flagged "experimental" in the README and demoed in a dedicated "Dynamic Emotion" workflow - and it's genuinely the thing that makes FLOAT feel alive rather than looped. The price is that it runs the emotion model over and over (once per chunk), and the chunk boundaries are yours to tune.
Inputs and outputs
- audio - the raw ComfyUI
AUDIOinput. Unlike the features-based node, this one does its own preprocessing on the raw audio, so the same rule applies: mono, at the sample rate the emotion model expects. - emotion_model_pipe - from Load Emotion Recognition Model.
- target_fps (default 25) - maps chunk-level emotions to the frame-level sequence.
- chunk_duration_sec (default 2, range 0.5–10) - how much audio each emotion prediction covers. Smaller chunks = faster, more granular emotional shifts but noisier readings; 2 seconds is a sane default. Too small and the emotion model is staring at fragments; too big and you're back to one emotion per clip.
Outputs: we_latent_dynamic (the frame-aligned, time-varying emotion latent, shape (Batch, TotalFrames, EmotionDim) - goes into Float Sample Motion Sequence RD VA), the emotion_model_pipe passthrough, and emotion_sequence (the raw per-chunk emotion predictions, handy for debugging what the model actually heard).
Notes
The dynamic we_latent plugs into the same sampler input as the static one, so swapping the two emotion nodes is a one-wire change - which is the whole point of the VA graph's modularity. If you see the face flipping expressions too hard between chunks, raise chunk_duration_sec; if the emotion model keeps landing on one label anyway, your audio may just be emotionally flat (or non-English, which the shipped model reads poorly - it's English-trained).
Install is the pack standard: ComfyUI Manager search "ComfyUI-FLOAT_Optimized", or cd ComfyUI/custom_nodes && git clone https://github.com/set-soft/ComfyUI-FLOAT_Optimized && pip install -r requirements.txt, restart, and let the emotion weights extract or download on first use. Experimental node, so expect rough edges; FLOAT is CC BY-NC-SA 4.0 regardless - non-commercial.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | The raw ComfyUI audio input. Must be mono and at the correct sample rate for the emotion model. | |
| emotion_model_pipe | EMOTION_MODEL_PIPE | The loaded emotion recognition model pipe. | |
| target_fps | FLOAT | 25.01–120 | Target video FPS. Used to map chunk-level emotions to a frame-level sequence. |
| chunk_duration_sec | FLOAT | 2.00.5–10 | Duration of audio (in seconds) to analyze for each distinct emotion prediction. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| we_latent_dynamic | TORCH_TENSOR | — |
| emotion_model_pipe_out | EMOTION_MODEL_PIPE | — |
| emotion_sequence | TORCH_TENSOR | — |