Muse Collective LTX Timeline V4
Character References That Never Appear On Screen
- model
- clip
- audio_vae
- vae
- spatial_upscaler
- bg_audio
- base_model
- face_reference_image
- last_chunk_frames
- audio
- stage1_frames
- seed_hunt_preview_1
- seed_hunt_preview_2
- seed_hunt_preview_3
- seed_hunt_preview_4
- seed_hunt_audio_1
- seed_hunt_audio_2
- seed_hunt_audio_3
- seed_hunt_audio_4
V4 is where the Muse director family starts stacking identity tools. It takes V3's Face ID and adds Ghost Mask - a character-reference guide that keeps whole characters (not just faces) consistent across the timeline. The trick that makes it interesting: the reference images are hidden in the latent, past the end of the visible clip, where the sampler can attend to them without them ever appearing on screen.
The pack calls V4 a WIP, and it's the version that marks the split into two philosophies. Face ID (V3) locks a face; Ghost Mask (V4) locks an entire character sheet. If your drift problem is "the protagonist changed her whole look in chunk six," Ghost Mask is aimed squarely at you.
How Ghost Mask works
From the node's own tooltip: when reference_mode is set to Ghost Mask, each loaded character's reference image is hidden as an extra latent frame past the end of chunk 1's clean region - never decoded into the visible output, but the sampler can attend to it as a guide. It's a hidden tail, appended in latent space and cropped off before anything you'd ever watch is produced. Every chunk re-applies it, so the character reference is present for every segment of the timeline, not just the first.
The other half of the V4 recipe is prompt substitution via character descriptions:
char1_description/char2_description/char3_description- text that gets swapped in for@char1/@character1(and 2/3) anywhere in your prompts. You type@char1in the timeline prompts and the node replaces it with the full description. That's how the text side of character consistency works - the model gets a stable verbal identity while Ghost Mask supplies the visual anchor.reference_mode-OFForGhost Mask. Off means V3/V2 behavior.reference_strength- guide strength applied to the character reference frames. 1.0 is the baseline; push it up for strong identity-lock, back it down if the character starts looking stiff or copy-pasted.
V4 also keeps V3's Face ID cluster (face_id_enabled, identity_projector, id_strength, phase_scale, arcface_mode, and the optional face_reference_image) and V2's Seed Hunt, so it's a fairly complete "character director" by the time you add it all up.
The rest of the panel
Everything from V2/V3 carries over: the timeline editor (MAIN/AUDIO/BG AUDIO/MOTION tracks), [SPEECH]/[SOUNDS] tags, chunking via chunk_duration_seconds/carry_frames, two-stage sampling (8/4/0.42, cfg 1), and the standard outputs plus seed_hunt_preview_N/seed_hunt_audio_N.
Installing it
Same pack:
cd ComfyUI/custom_nodes
git clone https://github.com/muse-collective-26/muse-ltx-timeline
Restart, pip install av torchaudio soundfile, full LTX 2.3 model stack. No extra dependencies for Ghost Mask itself.
Gotchas
- V4's Ghost Mask is the description-based variant. The image-socket version of the same idea lives in V6 (
char_images_1..3as actual IMAGE inputs). V4 works off descriptions plus whatever's in the timeline - if you want to feed reference photos as graph inputs, V6 is the one. @char1substitution is case-sensitive as written - use the exact@char1/@character1forms.- WIP caveat: this is a try/except-loaded module, so if it's missing from your node list after an update, the pack silently skipped it.
V4 is the fullest expression of "character consistency inside the director" in the Muse line before V6/V10 took over. It's more knobs than V3, and it rewards tuning - but for long-form content with named characters, that tuning is exactly the work you'd otherwise be doing in post.
Inputs (77)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| audio_vae | VAE | — | |
| vae | VAE | — | |
| spatial_upscaler | LATENT_UPSCALE_MODEL | — | |
| start_second | FLOAT | 0.000–3600 | — |
| end_second | FLOAT | 10.000–3600 | — |
| duration_seconds | FLOAT | 10.000–3600 | — |
| start_frame | INT | 00–86400 | — |
| end_frame | INT | 2400–86400 | — |
| duration_frames | INT | 2401–86400 | — |
| timeline_data | STRING | {} | — |
| local_prompts | STRING | — | |
| segment_lengths | STRING | — | |
| global_prompt | STRING | — | |
| guide_strength | STRING | — | |
| epsilon | FLOAT | 0.00100–1 | — |
| frame_rate | FLOAT | 24.001–120 | — |
| display_mode | COMBO | seconds | 2 options: seconds, frames |
| custom_width | INT | 96064–4096 | — |
| custom_height | INT | 54464–4096 | — |
| resize_method | COMBO | maintain aspect ratio | 4 options: maintain aspect ratio, stretch to fit, crop, pad |
| divisible_by | INT | 321–256 | — |
| img_compression | INT | 180–51 | — |
| generate_audio | BOOLEAN | true | LTX generates ambient/sfx audio from [SOUNDS] prompts. |
| custom_audio_on | BOOLEAN | false | Use audio file(s) from the AUDIO timeline track. |
| lipsync | BOOLEAN | true | Sync mouth movements to custom audio. Requires Custom Audio ON and talking head LoRA. |
| motion_guide_on | BOOLEAN | true | Use motion guide segments from the timeline. |
| chunk_duration_seconds | FLOAT | 10.02–120 | — |
| auto_chunk_threshold | FLOAT | 10.00–3600 | — |
| carry_frames | INT | 731–240 | Reference frames from previous chunk locked at chunk start. 73 ≈ 3s at 24fps. |
| carry_strength | FLOAT | 1.000–1 | — |
| crossfade_frames | INT | 00–120 | — |
| ic_lora_name | COMBO | None | 1 options: None |
| ic_lora_strength | FLOAT | 1.00-10–10 | — |
| stage1_steps | INT | 81–50 | — |
| stage2_steps | INT | 41–50 | — |
| stage2_denoise | FLOAT | 0.420–1 | — |
| cfg | FLOAT | 1.00–20 | — |
| seed | INT | 420–18446744073709550000 | — |
| filename_prefix | STRING | muse | — |
| bg_volume | FLOAT | 1.000–2 | — |
| guide_scale_by | FLOAT | 0.500.01–8 | — |
| guide_scale_by_s2 | FLOAT | 1.000.01–8 | — |
| guide_upscale_method | COMBO | bicubic | 5 options: bicubic, bilinear, nearest-exact, area, bislerp |
| guide_image_attn_strength | FLOAT | 1.000–1 | — |
| guide_crop | COMBO | center | 2 options: center, disabled |
| guide_auto_snap_ic_grid | BOOLEAN | true | — |
| guide_use_tiled_encode | BOOLEAN | false | — |
| guide_tile_size | INT | 25664–512 | — |
| guide_tile_overlap | INT | 6416–256 | — |
| timeline_ui | STRING | — | |
| seed_hunt | BOOLEAN | false | ON + no candidate chosen: run a 4-seed Stage-1-resolution preview instead of the full pipeline. ON + one use_seed_hunt_N chosen: commit to that candidate — Stage 2 refines its actual cached latent instead of regenerating Stage 1 from scratch. |
| seed_hunt_steps | INT | 61–50 | — |
| seed_hunt_scale | FLOAT | 0.250.05–1 | Unused as of 1.0.4 — Seed Hunt now scouts at Stage 1's real resolution automatically (so the picked candidate's actual latent can carry forward into Stage 2). Kept as a widget only so older saved workflows still load correctly. |
| seed_hunt_1 | INT | 10–18446744073709550000 | Unused as of 1.0.4 — scouting now draws a fresh random seed for each candidate every run instead of reusing these fixed values (the actual latent carries forward on commit, so the seed number no longer needs to be fixed or reproducible). |
| seed_hunt_2 | INT | 20–18446744073709550000 | — |
| seed_hunt_3 | INT | 30–18446744073709550000 | — |
| seed_hunt_4 | INT | 40–18446744073709550000 | — |
| use_seed_hunt_1 | BOOLEAN | false | — |
| use_seed_hunt_2 | BOOLEAN | false | — |
| use_seed_hunt_3 | BOOLEAN | false | — |
| use_seed_hunt_4 | BOOLEAN | false | — |
| face_id_enabled | BOOLEAN | false | Patches the model at every Stage 1/Stage 2/per-chunk build point so the sampled face is pulled toward face_reference_image. Requires the matching Best-Face-ID LoRA already loaded onto the model input, and ComfyUI-BFSNodes installed. Off = identical to V2. |
| identity_projector | STRING | None | ArcFace projector .safetensors filename from models/loras, or 'None' for overlap-only (recommended default — the projector is a weak channel; the overlap latent carries the bulk of identity). |
| source_id | FLOAT | 20–8 | — |
| phase_scale | FLOAT | 1.00–4 | — |
| id_strength | FLOAT | 1.00–50 | — |
| arcface_mode | COMBO | auto_adjust | 3 options: auto_adjust, as_is, disable |
| reference_mode | COMBO | OFF | Ghost Mask hides each loaded character's reference image as an extra latent frame past the end of chunk 1's clean region — never decoded into the visible output, but the sampler can attend to it as an identity anchor. Applied to chunk 1 only; later chunks inherit identity via the normal carry-frame continuity. |
| reference_strength | FLOAT | 1.000–5 | Guide strength applied to the character reference frames (Ghost Mask only). |
| char1_description | STRING | Text swapped in for @char1/@character1 in your prompts. | |
| char2_description | STRING | Text swapped in for @char2/@character2 in your prompts. | |
| char3_description | STRING | Text swapped in for @char3/@character3 in your prompts. | |
| bg_audioopt | AUDIO | — | |
| base_modelopt | MODEL | Base model without talking-head LoRA. Connect the UNETLoader output directly here so the ambient audio pass generates sounds without speech. | |
| face_reference_imageopt | IMAGE | Reference face for Face ID (see face_id_enabled). Feed it a close-up face crop — Muse Face Lock can produce one from any reference image automatically. |
Outputs (11)
| Name | Type | Description |
|---|---|---|
| last_chunk_frames | IMAGE | — |
| audio | AUDIO | — |
| stage1_frames | IMAGE | — |
| seed_hunt_preview_1 | IMAGE | — |
| seed_hunt_preview_2 | IMAGE | — |
| seed_hunt_preview_3 | IMAGE | — |
| seed_hunt_preview_4 | IMAGE | — |
| seed_hunt_audio_1 | AUDIO | — |
| seed_hunt_audio_2 | AUDIO | — |
| seed_hunt_audio_3 | AUDIO | — |
| seed_hunt_audio_4 | AUDIO | — |