🔊 S42 CutFlow Audio Cond Prep
Trimmed, normalized, faded
- audio
- audio
- duration_seconds
- info
LTX-2 was the first open-weights model family to do synchronized audio + video in one pass, and LTX 2.3 tightened up the audio side further - but it's picky about what it accepts. The audio you feed it needs to be exactly the length of your video latent, at a sane level, with no clicks. S42CF Audio Cond Prep is the pack's one-stop compliance officer for that: trim or pad to your target frame count, normalize, and fade, all in a single node in the LTX Bridge section.
The inputs, with the ones that matter:
audio- the AUDIO you want to condition on.target_frames(default 121, min 9, max 513) - the target video frame count, and here's the rule you have to respect: it must match your LTX empty latent's frame count. LTX only accepts frame counts of the form 8n+1 (9, 17, 25, ... 121, ...), so a 121-frame latent should get audio trimmed to exactly 121 frames' worth at your fps. If your latent is a different valid count, set this to match it. The pack'sS42CF LTX Frame Calculatorexists precisely to pick those numbers.fps(8–60, default 24) - used to converttarget_framesinto a duration.normalize(yes/no, defaultyes) - scales the audio to a −3dBFS peak. The tooltip's "recommended for consistent LTX results" is the actual reason: a quiet input and a loud input otherwise produce very different conditioning, and normalizing makes the pipeline repeatable. Keep it on.fade_in_ms/fade_out_ms(defaults 50/100) - short fades at the ends so the track starts and stops without a click. 50/100 is a fine starting point.
The mechanism is simple and transparent: if the audio is longer than the target it truncates; if shorter it pads with silence; then it normalizes the peak and applies the fades. Outputs are the conditioned audio (AUDIO), duration_seconds (FLOAT - handy to compare against what LTX actually generated), and info.
Where it fits in the workflow: in the LTX 2.3 pipeline, feed it your source music or voiceover before the conditioning step, with target_frames wired to the same number your EmptyLTXVLatentVideo uses. It pairs with S42CF_VideoSegmentPrep for long-form segmented generation - each segment's audio gets prepped to that segment's frame count, so the conditioning always lines up.
The gotcha to internalize is the frame-count handshake, not the node itself. This node will happily trim your audio to any number you type - it doesn't validate the 8n+1 rule. If you feed it 120 frames and LTX later rejects the video, the node did its job; the mismatch is upstream. That's the single most common way this bites people.
Installing it
Standard S42-CutFlow install: ComfyUI Manager → search "S42 CutFlow" → Install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/GeekyGhost/S42-CutFlow.git
pip install -r S42-CutFlow/requirements.txt
Requirements is one line (opencv-python-headless); the audio math runs on numpy, which ships with ComfyUI. "[S42 CutFlow] Loaded ..." on restart = registered.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | Audio input for LTX conditioning. | |
| target_frames | INT | 1219–513 | Target video frame count. Audio will be trimmed/padded to match. |
| fps | INT | 248–60 | Video FPS for audio duration calculation. |
| normalize | COMBO | yes | Normalize audio to -3dBFS peak. Recommended for consistent LTX results. |
| fade_in_ms | INT | 500–2000 | Fade-in duration in milliseconds. Prevents click artifacts. |
| fade_out_ms | INT | 1000–2000 | Fade-out duration in milliseconds. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| duration_seconds | FLOAT | — |
| info | STRING | — |