diff --git a/README.md b/README.md index eebc262..81c7717 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,19 @@ ComfyUI-LTXVideo is a collection of custom nodes for ComfyUI, designed to provid The model itself is supported in the core ComfyUI [code](https://github.com/comfyanonymous/ComfyUI/tree/master/comfy/ldm/lightricks). The main LTXVideo repository can be found [here](https://github.com/Lightricks/LTX-Video). -# 5.03.2025 :star: LTXVideo 0.9.5 Release :star: +# 17.04.2025 ⭐ LTXVideo 0.9.6 Release ⭐ + +### LTXVideo 0.9.6 introduces: + +1. LTXV 0.9.6 – higher quality, faster, great for final output. Download from [here](https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-2b-0.9.6-dev-04-25.safetensors). +2. LTXV 0.9.6 Distilled – our fastest model yet (only 8 steps for generation), lighter, great for rapid iteration. Download from [here](https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-2b-0.9.6-distilled-04-25.safetensors). + +### Technical Updates + +We introduce the __STGGuiderAdvanced__ node, which applies different CFG and STG parameters at various diffusion steps. All flows have been updated to use this node and are designed to provide optimal parameters for the best quality. +See the [Example Workflows](#example-workflows) section. + +# 5.03.2025 ⭐ LTXVideo 0.9.5 Release ⭐ ### LTXVideo 0.9.5 introduces: @@ -73,6 +85,10 @@ Note that to run the example workflows, you need to have some additional custom [Download workflow](assets/ltxvideo-i2v.json) ![workflow](assets/ltxvideo-i2v.png) +### Image-to-video-distilled +[Download workflow](assets/ltxvideo-i2v-distilled.json) +![workflow](assets/ltxvideo-i2v-distilled.png) + ### Text-to-video [Download workflow](assets/ltxvideo-t2v.json) diff --git a/__init__.py b/__init__.py index 5bb1b44..42aa9e3 100644 --- a/__init__.py +++ b/__init__.py @@ -1,9 +1,14 @@ +from .latents import LTXVSelectLatents, LTXVSetVideoLatentNoiseMasks # noqa: F401 from .nodes_registry import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS from .prompt_enhancer_nodes import ( # noqa: F401 LTXVPromptEnhancer, LTXVPromptEnhancerLoader, ) -from .stg import LTXVApplySTG, STGGuiderNode # noqa: F401 +from .recurrent_sampler import ( # noqa: F401 + LinearOverlapLatentTransition, + LTXVRecurrentKSampler, +) +from .stg import LTXVApplySTG, STGGuiderAdvancedNode, STGGuiderNode # noqa: F401 from .tricks import NODE_CLASS_MAPPINGS as TRICKS_NODE_CLASS_MAPPINGS from .tricks import NODE_DISPLAY_NAME_MAPPINGS as TRICKS_NODE_DISPLAY_NAME_MAPPINGS diff --git a/assets/fox.jpg b/assets/fox.jpg new file mode 100644 index 0000000..f766a9f Binary files /dev/null and b/assets/fox.jpg differ diff --git a/assets/ltxvideo-first-sequence-conditioning.json b/assets/ltxvideo-first-sequence-conditioning.json index 0069920..6886662 100644 --- a/assets/ltxvideo-first-sequence-conditioning.json +++ b/assets/ltxvideo-first-sequence-conditioning.json @@ -1,85 +1,7 @@ { - "last_node_id": 212, - "last_link_id": 579, + "last_node_id": 213, + "last_link_id": 583, "nodes": [ - { - "id": 195, - "type": "VHS_VideoCombine", - "pos": [ - 1909.384765625, - 19.35366439819336 - ], - "size": [ - 315, - 544.6666870117188 - ], - "flags": {}, - "order": 25, - "mode": 0, - "inputs": [ - { - "name": "images", - "type": "IMAGE", - "shape": 7, - "link": 530 - }, - { - "name": "audio", - "type": "AUDIO", - "shape": 7, - "link": null - }, - { - "name": "meta_batch", - "type": "VHS_BatchManager", - "shape": 7, - "link": null - }, - { - "name": "vae", - "type": "VAE", - "shape": 7, - "link": null - } - ], - "outputs": [ - { - "name": "Filenames", - "type": "VHS_FILENAMES", - "links": null - } - ], - "properties": { - "cnr_id": "comfyui-videohelpersuite", - "ver": "8629188458dc6cb832f871ece3bd273507e8a766", - "Node name for S&R": "VHS_VideoCombine" - }, - "widgets_values": { - "frame_rate": 25, - "loop_count": 0, - "filename_prefix": "ltxv", - "format": "video/h264-mp4", - "pix_fmt": "yuv420p", - "crf": 19, - "save_metadata": true, - "trim_to_audio": false, - "pingpong": false, - "save_output": true, - "videopreview": { - "hidden": false, - "paused": false, - "params": { - "filename": "ltxv_00032.mp4", - "subfolder": "", - "type": "output", - "format": "video/h264-mp4", - "frame_rate": 25, - "workflow": "ltxv_00032.png", - "fullpath": "/home/akvochko/ComfyUI-Orig/output/ltxv_00032.mp4" - } - } - } - }, { "id": 71, "type": "LTXVScheduler", @@ -92,11 +14,12 @@ 154 ], "flags": {}, - "order": 20, + "order": 19, "mode": 0, "inputs": [ { "name": "latent", + "localized_name": "latent", "type": "LATENT", "shape": 7, "link": 564 @@ -105,6 +28,7 @@ "outputs": [ { "name": "SIGMAS", + "localized_name": "SIGMAS", "type": "SIGMAS", "links": [ 542 @@ -113,9 +37,9 @@ } ], "properties": { + "Node name for S&R": "LTXVScheduler", "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "LTXVScheduler" + "ver": "0.3.19" }, "widgets_values": [ 20, @@ -125,80 +49,6 @@ 0.1 ] }, - { - "id": 188, - "type": "LTXVApplySTG", - "pos": [ - 77.9090805053711, - -126.5878677368164 - ], - "size": [ - 315, - 58 - ], - "flags": {}, - "order": 8, - "mode": 0, - "inputs": [ - { - "name": "model", - "type": "MODEL", - "link": 508 - } - ], - "outputs": [ - { - "name": "model", - "type": "MODEL", - "links": [ - 516 - ], - "slot_index": 0 - } - ], - "properties": { - "aux_id": "Lightricks/ComfyUI-LTXVideo", - "ver": "55f2d9ebb885a1bda63f1757080b4d7f8f7bb2f9", - "Node name for S&R": "LTXVApplySTG" - }, - "widgets_values": [ - "14" - ] - }, - { - "id": 73, - "type": "KSamplerSelect", - "pos": [ - 471.1808166503906, - -136.36605834960938 - ], - "size": [ - 315, - 58 - ], - "flags": {}, - "order": 0, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "SAMPLER", - "type": "SAMPLER", - "links": [ - 541 - ], - "slot_index": 0 - } - ], - "properties": { - "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "KSamplerSelect" - }, - "widgets_values": [ - "gradient_estimation" - ] - }, { "id": 69, "type": "LTXVConditioning", @@ -211,16 +61,18 @@ 78 ], "flags": {}, - "order": 17, + "order": 16, "mode": 0, "inputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "link": 266 }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "link": 267 } @@ -228,6 +80,7 @@ "outputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "links": [ 556 @@ -236,6 +89,7 @@ }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "links": [ 557 @@ -244,9 +98,9 @@ } ], "properties": { + "Node name for S&R": "LTXVConditioning", "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "LTXVConditioning" + "ver": "0.3.19" }, "widgets_values": [ 25 @@ -264,12 +118,13 @@ 82 ], "flags": {}, - "order": 1, + "order": 0, "mode": 0, "inputs": [], "outputs": [ { "name": "NOISE", + "localized_name": "NOISE", "type": "NOISE", "links": [ 540 @@ -278,106 +133,15 @@ } ], "properties": { + "Node name for S&R": "RandomNoise", "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "RandomNoise" + "ver": "0.3.19" }, "widgets_values": [ 43, "fixed" ] }, - { - "id": 44, - "type": "CheckpointLoaderSimple", - "pos": [ - -301.724853515625, - -148.44154357910156 - ], - "size": [ - 315, - 98 - ], - "flags": {}, - "order": 2, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "MODEL", - "type": "MODEL", - "links": [ - 508 - ], - "slot_index": 0 - }, - { - "name": "CLIP", - "type": "CLIP", - "links": null - }, - { - "name": "VAE", - "type": "VAE", - "links": [ - 565, - 566 - ], - "slot_index": 2 - } - ], - "properties": { - "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "CheckpointLoaderSimple" - }, - "widgets_values": [ - "ltx-video-2b-v0.9.5.safetensors" - ] - }, - { - "id": 193, - "type": "ImageBatch", - "pos": [ - 1659.6142578125, - 240.26751708984375 - ], - "size": [ - 210, - 46 - ], - "flags": {}, - "order": 24, - "mode": 0, - "inputs": [ - { - "name": "image1", - "type": "IMAGE", - "link": 537 - }, - { - "name": "image2", - "type": "IMAGE", - "link": 536 - } - ], - "outputs": [ - { - "name": "IMAGE", - "type": "IMAGE", - "links": [ - 530 - ], - "slot_index": 0 - } - ], - "properties": { - "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "ImageBatch" - }, - "widgets_values": [] - }, { "id": 199, "type": "LTXVPromptEnhancerLoader", @@ -390,12 +154,13 @@ 82 ], "flags": {}, - "order": 3, + "order": 1, "mode": 0, "inputs": [], "outputs": [ { "name": "prompt_enhancer", + "localized_name": "prompt_enhancer", "type": "LTXV_PROMPT_ENHANCER", "links": [ 538 @@ -404,9 +169,9 @@ } ], "properties": { + "Node name for S&R": "LTXVPromptEnhancerLoader", "aux_id": "Lightricks/ComfyUI-LTXVideo", - "ver": "55f2d9ebb885a1bda63f1757080b4d7f8f7bb2f9", - "Node name for S&R": "LTXVPromptEnhancerLoader" + "ver": "55f2d9ebb885a1bda63f1757080b4d7f8f7bb2f9" }, "widgets_values": [ "unsloth/Llama-3.2-3B-Instruct", @@ -425,12 +190,13 @@ 98 ], "flags": {}, - "order": 4, + "order": 2, "mode": 0, "inputs": [], "outputs": [ { "name": "CLIP", + "localized_name": "CLIP", "type": "CLIP", "links": [ 74, @@ -440,9 +206,9 @@ } ], "properties": { + "Node name for S&R": "CLIPLoader", "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "CLIPLoader" + "ver": "0.3.19" }, "widgets_values": [ "t5xxl_fp16.safetensors", @@ -464,11 +230,12 @@ "flags": { "collapsed": true }, - "order": 14, + "order": 13, "mode": 0, "inputs": [ { "name": "clip", + "localized_name": "clip", "type": "CLIP", "link": 74 }, @@ -484,6 +251,7 @@ "outputs": [ { "name": "CONDITIONING", + "localized_name": "CONDITIONING", "type": "CONDITIONING", "links": [ 266 @@ -493,9 +261,9 @@ ], "title": "CLIP Text Encode (Positive Prompt)", "properties": { + "Node name for S&R": "CLIPTextEncode", "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "CLIPTextEncode" + "ver": "0.3.19" }, "widgets_values": [ "A confident man with short dark hair and a beard, wearing a casual green jacket, sits at a chessboard with a smile. He leans forward, hands near the pieces, as if about to make a move. The background shows a dimly lit hall with a blurred audience watching, creating a tense yet exciting atmosphere. The video should capture subtle movements like eye shifts, hand gestures, and slight changes in facial expression to enhance realism." @@ -517,11 +285,12 @@ "flags": { "collapsed": true }, - "order": 9, + "order": 8, "mode": 0, "inputs": [ { "name": "clip", + "localized_name": "clip", "type": "CLIP", "link": 75 } @@ -529,6 +298,7 @@ "outputs": [ { "name": "CONDITIONING", + "localized_name": "CONDITIONING", "type": "CONDITIONING", "links": [ 267 @@ -538,9 +308,9 @@ ], "title": "CLIP Text Encode (Negative Prompt)", "properties": { + "Node name for S&R": "CLIPTextEncode", "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "CLIPTextEncode" + "ver": "0.3.19" }, "widgets_values": [ "low quality, worst quality, deformed, distorted, disfigured, motion smear, motion artifacts, fused fingers, bad anatomy, weird hand, ugly" @@ -560,16 +330,18 @@ 102 ], "flags": {}, - "order": 10, + "order": 9, "mode": 0, "inputs": [ { "name": "prompt_enhancer", + "localized_name": "prompt_enhancer", "type": "LTXV_PROMPT_ENHANCER", "link": 538 }, { "name": "image_prompt", + "localized_name": "image_prompt", "type": "IMAGE", "shape": 7, "link": 523 @@ -578,6 +350,7 @@ "outputs": [ { "name": "str", + "localized_name": "str", "type": "STRING", "links": [ 507 @@ -586,9 +359,9 @@ } ], "properties": { + "Node name for S&R": "LTXVPromptEnhancer", "aux_id": "Lightricks/ComfyUI-LTXVideo", - "ver": "55f2d9ebb885a1bda63f1757080b4d7f8f7bb2f9", - "Node name for S&R": "LTXVPromptEnhancer" + "ver": "55f2d9ebb885a1bda63f1757080b4d7f8f7bb2f9" }, "widgets_values": [ "red jeep", @@ -607,11 +380,12 @@ 86 ], "flags": {}, - "order": 13, + "order": 12, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 567 } @@ -619,11 +393,13 @@ "outputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "links": null }, { - "name": "width", + "name": "768 width", + "localized_name": "width", "type": "INT", "links": [ 568 @@ -631,7 +407,8 @@ "slot_index": 1 }, { - "name": "height", + "name": "512 height", + "localized_name": "height", "type": "INT", "links": [ 569 @@ -639,7 +416,8 @@ "slot_index": 2 }, { - "name": "count", + "name": "65 count", + "localized_name": "count", "type": "INT", "links": [ 570 @@ -648,9 +426,9 @@ } ], "properties": { + "Node name for S&R": "GetImageSizeAndCount", "cnr_id": "comfyui-kjnodes", - "ver": "fa6d20eeb32cbcbd84ee325e3cfdc6ed6b43056f", - "Node name for S&R": "GetImageSizeAndCount" + "ver": "fa6d20eeb32cbcbd84ee325e3cfdc6ed6b43056f" }, "widgets_values": [] }, @@ -666,11 +444,12 @@ 106 ], "flags": {}, - "order": 11, + "order": 10, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 525 } @@ -678,6 +457,7 @@ "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 571 @@ -686,9 +466,9 @@ } ], "properties": { + "Node name for S&R": "VHS_SelectImages", "cnr_id": "comfyui-videohelpersuite", - "ver": "8629188458dc6cb832f871ece3bd273507e8a766", - "Node name for S&R": "VHS_SelectImages" + "ver": "8629188458dc6cb832f871ece3bd273507e8a766" }, "widgets_values": { "indexes": "-9:", @@ -708,7 +488,7 @@ 93.54439544677734 ], "flags": {}, - "order": 5, + "order": 3, "mode": 0, "inputs": [], "outputs": [], @@ -731,7 +511,7 @@ 170 ], "flags": {}, - "order": 16, + "order": 15, "mode": 0, "inputs": [ { @@ -774,6 +554,7 @@ "outputs": [ { "name": "LATENT", + "localized_name": "LATENT", "type": "LATENT", "links": [ 558 @@ -782,9 +563,9 @@ } ], "properties": { + "Node name for S&R": "EmptyLTXVLatentVideo", "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "EmptyLTXVLatentVideo" + "ver": "0.3.19" }, "widgets_values": [ 768, @@ -805,11 +586,12 @@ 58 ], "flags": {}, - "order": 15, + "order": 14, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 571 } @@ -817,6 +599,7 @@ "outputs": [ { "name": "output_image", + "localized_name": "output_image", "type": "IMAGE", "links": [ 572 @@ -825,9 +608,9 @@ } ], "properties": { + "Node name for S&R": "LTXVPreprocess", "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "LTXVPreprocess" + "ver": "0.3.19" }, "widgets_values": [ 35 @@ -845,11 +628,12 @@ 106 ], "flags": {}, - "order": 12, + "order": 11, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 527 } @@ -857,6 +641,7 @@ "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 537 @@ -865,9 +650,9 @@ } ], "properties": { + "Node name for S&R": "VHS_SelectImages", "cnr_id": "comfyui-videohelpersuite", - "ver": "8629188458dc6cb832f871ece3bd273507e8a766", - "Node name for S&R": "VHS_SelectImages" + "ver": "8629188458dc6cb832f871ece3bd273507e8a766" }, "widgets_values": { "indexes": ":-9", @@ -887,7 +672,7 @@ 93.54439544677734 ], "flags": {}, - "order": 6, + "order": 4, "mode": 0, "inputs": [], "outputs": [], @@ -907,20 +692,22 @@ ], "size": [ 252.056640625, - 478.10009765625 + 430.7044372558594 ], "flags": {}, - "order": 7, + "order": 5, "mode": 0, "inputs": [ { "name": "meta_batch", + "localized_name": "meta_batch", "type": "VHS_BatchManager", "shape": 7, "link": null }, { "name": "vae", + "localized_name": "vae", "type": "VAE", "shape": 7, "link": null @@ -929,6 +716,7 @@ "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 523, @@ -940,34 +728,37 @@ }, { "name": "frame_count", + "localized_name": "frame_count", "type": "INT", "links": null }, { "name": "audio", + "localized_name": "audio", "type": "AUDIO", "links": null }, { "name": "video_info", + "localized_name": "video_info", "type": "VHS_VIDEOINFO", "links": null } ], "properties": { + "Node name for S&R": "VHS_LoadVideo", "cnr_id": "comfyui-videohelpersuite", - "ver": "8629188458dc6cb832f871ece3bd273507e8a766", - "Node name for S&R": "VHS_LoadVideo" + "ver": "8629188458dc6cb832f871ece3bd273507e8a766" }, "widgets_values": { "video": "jeep.mp4", "force_rate": 0, + "force_size": "Disabled", "custom_width": 0, "custom_height": 0, "frame_load_cap": 65, "skip_first_frames": 0, "select_every_nth": 1, - "format": "ltxv", "choose video to upload": "image", "videopreview": { "hidden": false, @@ -985,98 +776,54 @@ } }, { - "id": 8, - "type": "VAEDecode", + "id": 44, + "type": "CheckpointLoaderSimple", "pos": [ - 1658.79638671875, - 121.616455078125 + -301.724853515625, + -148.44154357910156 ], "size": [ - 210, - 46 + 315, + 98 ], "flags": {}, - "order": 23, + "order": 6, "mode": 0, - "inputs": [ - { - "name": "samples", - "type": "LATENT", - "link": 579 - }, - { - "name": "vae", - "type": "VAE", - "link": 565 - } - ], + "inputs": [], "outputs": [ { - "name": "IMAGE", - "type": "IMAGE", - "links": [ - 536 - ], - "slot_index": 0 - } - ], - "properties": { - "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "VAEDecode" - }, - "widgets_values": [] - }, - { - "id": 191, - "type": "STGGuider", - "pos": [ - 1216.2901611328125, - -1.7041345834732056 - ], - "size": [ - 389.04827880859375, - 171.58651733398438 - ], - "flags": {}, - "order": 19, - "mode": 0, - "inputs": [ - { - "name": "model", + "name": "MODEL", + "localized_name": "MODEL", "type": "MODEL", - "link": 516 - }, - { - "name": "positive", - "type": "CONDITIONING", - "link": 576 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 577 - } - ], - "outputs": [ - { - "name": "GUIDER", - "type": "GUIDER", "links": [ - 544 + 580 ], "slot_index": 0 + }, + { + "name": "CLIP", + "localized_name": "CLIP", + "type": "CLIP", + "links": null + }, + { + "name": "VAE", + "localized_name": "VAE", + "type": "VAE", + "links": [ + 565, + 566 + ], + "slot_index": 2 } ], "properties": { - "aux_id": "Lightricks/ComfyUI-LTXVideo", - "ver": "55f2d9ebb885a1bda63f1757080b4d7f8f7bb2f9", - "Node name for S&R": "STGGuider" + "Node name for S&R": "CheckpointLoaderSimple", + "cnr_id": "comfy-core", + "ver": "0.3.19" }, "widgets_values": [ - 3.5, - 1, - 0.75 + "ltxv-2b-0.9.6-dev-04-25.safetensors" ] }, { @@ -1091,31 +838,36 @@ 162 ], "flags": {}, - "order": 18, + "order": 17, "mode": 0, "inputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "link": 556 }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "link": 557 }, { "name": "vae", + "localized_name": "vae", "type": "VAE", "link": 566 }, { "name": "latent", + "localized_name": "latent", "type": "LATENT", "link": 558 }, { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 572 } @@ -1123,24 +875,27 @@ "outputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "links": [ 574, - 576 + 581 ], "slot_index": 0 }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "links": [ 575, - 577 + 582 ], "slot_index": 1 }, { "name": "latent", + "localized_name": "latent", "type": "LATENT", "links": [ 563, @@ -1150,9 +905,9 @@ } ], "properties": { + "Node name for S&R": "LTXVAddGuide", "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "LTXVAddGuide" + "ver": "0.3.19" }, "widgets_values": [ 0, @@ -1160,95 +915,128 @@ ] }, { - "id": 200, - "type": "SamplerCustomAdvanced", + "id": 73, + "type": "KSamplerSelect", "pos": [ - 1210.78759765625, - 282.859130859375 + 841.9295654296875, + 520.01416015625 ], "size": [ - 355.20001220703125, - 106 + 315, + 58 ], "flags": {}, - "order": 21, + "order": 7, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "SAMPLER", + "localized_name": "SAMPLER", + "type": "SAMPLER", + "links": [ + 541 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSamplerSelect", + "cnr_id": "comfy-core", + "ver": "0.3.19" + }, + "widgets_values": [ + "gradient_estimation" + ] + }, + { + "id": 213, + "type": "STGGuiderAdvanced", + "pos": [ + 1220.742919921875, + -132.0933074951172 + ], + "size": [ + 327.5999755859375, + 242 + ], + "flags": {}, + "order": 18, "mode": 0, "inputs": [ { - "name": "noise", - "type": "NOISE", - "link": 540 + "name": "model", + "localized_name": "model", + "type": "MODEL", + "link": 580 }, { - "name": "guider", - "type": "GUIDER", - "link": 544 + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "link": 581 }, { - "name": "sampler", - "type": "SAMPLER", - "link": 541 - }, - { - "name": "sigmas", - "type": "SIGMAS", - "link": 542 - }, - { - "name": "latent_image", - "type": "LATENT", - "link": 563 + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "link": 582 } ], "outputs": [ { - "name": "output", - "type": "LATENT", + "name": "GUIDER", + "localized_name": "GUIDER", + "type": "GUIDER", "links": [ - 578 + 583 ], "slot_index": 0 - }, - { - "name": "denoised_output", - "type": "LATENT", - "links": null } ], "properties": { - "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "SamplerCustomAdvanced" + "Node name for S&R": "STGGuiderAdvanced" }, - "widgets_values": [] + "widgets_values": [ + 0.996, + true, + "1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180", + "4, 4, 4, 4, 1, 1", + "2, 2, 2, 2, 1, 0", + "1, 1, 1, 1, 1, 1", + "[14], [14], [14], [14], [14], [14]" + ] }, { "id": 212, "type": "LTXVCropGuides", "pos": [ - 1653.6558837890625, - 1.2874510288238525 + 1254.9326171875, + 344.5459289550781 ], "size": [ 216.59999084472656, 66 ], "flags": {}, - "order": 22, + "order": 21, "mode": 0, "inputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "link": 574 }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "link": 575 }, { "name": "latent", + "localized_name": "latent", "type": "LATENT", "link": 578 } @@ -1256,16 +1044,19 @@ "outputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "links": null }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "links": null }, { "name": "latent", + "localized_name": "latent", "type": "LATENT", "links": [ 579 @@ -1274,9 +1065,253 @@ } ], "properties": { + "Node name for S&R": "LTXVCropGuides", "cnr_id": "comfy-core", - "ver": "0.3.19", - "Node name for S&R": "LTXVCropGuides" + "ver": "0.3.19" + }, + "widgets_values": [] + }, + { + "id": 8, + "type": "VAEDecode", + "pos": [ + 1255.8253173828125, + 468.36798095703125 + ], + "size": [ + 210, + 46 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "samples", + "localized_name": "samples", + "type": "LATENT", + "link": 579 + }, + { + "name": "vae", + "localized_name": "vae", + "type": "VAE", + "link": 565 + } + ], + "outputs": [ + { + "name": "IMAGE", + "localized_name": "IMAGE", + "type": "IMAGE", + "links": [ + 536 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode", + "cnr_id": "comfy-core", + "ver": "0.3.19" + }, + "widgets_values": [] + }, + { + "id": 193, + "type": "ImageBatch", + "pos": [ + 1613.5460205078125, + -128.23391723632812 + ], + "size": [ + 210, + 46 + ], + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "image1", + "localized_name": "image1", + "type": "IMAGE", + "link": 537 + }, + { + "name": "image2", + "localized_name": "image2", + "type": "IMAGE", + "link": 536 + } + ], + "outputs": [ + { + "name": "IMAGE", + "localized_name": "IMAGE", + "type": "IMAGE", + "links": [ + 530 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageBatch", + "cnr_id": "comfy-core", + "ver": "0.3.19" + }, + "widgets_values": [] + }, + { + "id": 195, + "type": "VHS_VideoCombine", + "pos": [ + 1602.831298828125, + -6.919589996337891 + ], + "size": [ + 315, + 520.6666870117188 + ], + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "images", + "localized_name": "images", + "type": "IMAGE", + "shape": 7, + "link": 530 + }, + { + "name": "audio", + "localized_name": "audio", + "type": "AUDIO", + "shape": 7, + "link": null + }, + { + "name": "meta_batch", + "localized_name": "meta_batch", + "type": "VHS_BatchManager", + "shape": 7, + "link": null + }, + { + "name": "vae", + "localized_name": "vae", + "type": "VAE", + "shape": 7, + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "localized_name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "Node name for S&R": "VHS_VideoCombine", + "cnr_id": "comfyui-videohelpersuite", + "ver": "8629188458dc6cb832f871ece3bd273507e8a766" + }, + "widgets_values": { + "frame_rate": 25, + "loop_count": 0, + "filename_prefix": "ltxv", + "format": "video/h264-mp4", + "pix_fmt": "yuv420p", + "crf": 19, + "save_metadata": true, + "pingpong": false, + "save_output": true, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "ltxv_00120.mp4", + "subfolder": "", + "type": "output", + "format": "video/h264-mp4", + "frame_rate": 25, + "workflow": "ltxv_00032.png", + "fullpath": "/home/akvochko/ComfyUI-Orig/output/ltxv_00032.mp4" + } + } + } + }, + { + "id": 200, + "type": "SamplerCustomAdvanced", + "pos": [ + 1223.8555908203125, + 171.28802490234375 + ], + "size": [ + 326.99456787109375, + 106 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "noise", + "localized_name": "noise", + "type": "NOISE", + "link": 540 + }, + { + "name": "guider", + "localized_name": "guider", + "type": "GUIDER", + "link": 583 + }, + { + "name": "sampler", + "localized_name": "sampler", + "type": "SAMPLER", + "link": 541 + }, + { + "name": "sigmas", + "localized_name": "sigmas", + "type": "SIGMAS", + "link": 542 + }, + { + "name": "latent_image", + "localized_name": "latent_image", + "type": "LATENT", + "link": 563 + } + ], + "outputs": [ + { + "name": "output", + "localized_name": "output", + "type": "LATENT", + "links": [ + 578 + ], + "slot_index": 0 + }, + { + "name": "denoised_output", + "localized_name": "denoised_output", + "type": "LATENT", + "links": null + } + ], + "properties": { + "Node name for S&R": "SamplerCustomAdvanced", + "cnr_id": "comfy-core", + "ver": "0.3.19" }, "widgets_values": [] } @@ -1322,22 +1357,6 @@ 1, "STRING" ], - [ - 508, - 44, - 0, - 188, - 0, - "MODEL" - ], - [ - 516, - 188, - 0, - 191, - 0, - "MODEL" - ], [ 523, 134, @@ -1418,14 +1437,6 @@ 3, "SIGMAS" ], - [ - 544, - 191, - 0, - 200, - 1, - "GUIDER" - ], [ 556, 69, @@ -1546,22 +1557,6 @@ 1, "CONDITIONING" ], - [ - 576, - 206, - 0, - 191, - 1, - "CONDITIONING" - ], - [ - 577, - 206, - 1, - 191, - 2, - "CONDITIONING" - ], [ 578, 200, @@ -1577,16 +1572,48 @@ 8, 0, "LATENT" + ], + [ + 580, + 44, + 0, + 213, + 0, + "MODEL" + ], + [ + 581, + 206, + 0, + 213, + 1, + "CONDITIONING" + ], + [ + 582, + 206, + 1, + 213, + 2, + "CONDITIONING" + ], + [ + 583, + 213, + 0, + 200, + 1, + "GUIDER" ] ], "groups": [], "config": {}, "extra": { "ds": { - "scale": 0.6727499949325706, + "scale": 0.6303940863128502, "offset": [ - 841.6492448928334, - 316.8380884724249 + 614.0833708673383, + 371.5923298111381 ] }, "prompt": { @@ -1622,8 +1649,8 @@ "8": { "inputs": { "samples": [ - "200", - 0 + "212", + 2 ], "vae": [ "44", @@ -1648,7 +1675,7 @@ }, "44": { "inputs": { - "ckpt_name": "ltx-video-2b-v0.9.5.safetensors" + "ckpt_name": "ltxv-2b-0.9.6-dev-04-25.safetensors" }, "class_type": "CheckpointLoaderSimple", "_meta": { @@ -1724,8 +1751,8 @@ "video": "jeep.mp4", "force_rate": 0, "force_size": "Disabled", - "custom_width": 512, - "custom_height": 512, + "custom_width": 0, + "custom_height": 0, "frame_load_cap": 65, "skip_first_frames": 0, "select_every_nth": 1 @@ -1753,19 +1780,6 @@ "title": "🅛🅣🅧 LTXV Prompt Enhancer" } }, - "188": { - "inputs": { - "block_indices": "14", - "model": [ - "44", - 0 - ] - }, - "class_type": "LTXVApplySTG", - "_meta": { - "title": "🅛🅣🅧 LTXV Apply STG" - } - }, "190": { "inputs": { "noise_seed": 43 @@ -1775,29 +1789,6 @@ "title": "RandomNoise" } }, - "191": { - "inputs": { - "cfg": 3.5, - "stg": 1, - "rescale": 0.75, - "model": [ - "188", - 0 - ], - "positive": [ - "206", - 0 - ], - "negative": [ - "206", - 1 - ] - }, - "class_type": "STGGuider", - "_meta": { - "title": "🅛🅣🅧 STG Guider" - } - }, "192": { "inputs": { "indexes": "-9:", @@ -1882,7 +1873,7 @@ 0 ], "guider": [ - "191", + "213", 0 ], "sampler": [ @@ -1957,11 +1948,58 @@ "_meta": { "title": "LTXVPreprocess" } + }, + "212": { + "inputs": { + "positive": [ + "206", + 0 + ], + "negative": [ + "206", + 1 + ], + "latent": [ + "200", + 0 + ] + }, + "class_type": "LTXVCropGuides", + "_meta": { + "title": "LTXVCropGuides" + } + }, + "213": { + "inputs": { + "skip_steps_sigma_threshold": 0.996, + "cfg_star_rescale": true, + "sigmas": "1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180", + "cfg_values": "4, 4, 4, 4, 1, 1", + "stg_scale_values": "2, 2, 2, 2, 1, 0", + "stg_rescale_values": "1, 1, 1, 1, 1, 1", + "stg_layers_indices": "[14], [14], [14], [14], [14], [14]", + "model": [ + "44", + 0 + ], + "positive": [ + "206", + 0 + ], + "negative": [ + "206", + 1 + ] + }, + "class_type": "STGGuiderAdvanced", + "_meta": { + "title": "🅛🅣🅧 STG Guider Advanced" + } } }, - "comfy_fork_version": "HEAD@e7bd1751", + "comfy_fork_version": "feature/memory_prof@f7e64946", "node_versions": { - "comfy-core": "0.3.18" + "comfy-core": "0.3.27" }, "VHS_latentpreview": false, "VHS_latentpreviewrate": 0, diff --git a/assets/ltxvideo-first-sequence-conditioning.png b/assets/ltxvideo-first-sequence-conditioning.png index 0f7a6bf..c43a999 100644 --- a/assets/ltxvideo-first-sequence-conditioning.png +++ b/assets/ltxvideo-first-sequence-conditioning.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:adab606ec23e98c5aadb7adbfa9d16cb1e9d460004bbe648cb03f5e89972229a -size 1267760 +oid sha256:7899cb4e0e23f2439cc489b1ed6191eef91e91dbefdcb2c4c29545d5a8cd6c3a +size 1292625 diff --git a/assets/ltxvideo-frame-interpolation.json b/assets/ltxvideo-frame-interpolation.json index c86d77c..6144696 100644 --- a/assets/ltxvideo-frame-interpolation.json +++ b/assets/ltxvideo-frame-interpolation.json @@ -1,6 +1,6 @@ { - "last_node_id": 37, - "last_link_id": 88, + "last_node_id": 38, + "last_link_id": 93, "nodes": [ { "id": 26, @@ -14,31 +14,36 @@ 162 ], "flags": {}, - "order": 17, + "order": 15, "mode": 0, "inputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "link": 59 }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "link": 60 }, { "name": "vae", + "localized_name": "vae", "type": "VAE", "link": 74 }, { "name": "latent", + "localized_name": "latent", "type": "LATENT", "link": 62 }, { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 63 } @@ -46,6 +51,7 @@ "outputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "links": [ 66 @@ -54,6 +60,7 @@ }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "links": [ 67 @@ -62,6 +69,7 @@ }, { "name": "latent", + "localized_name": "latent", "type": "LATENT", "links": [ 68 @@ -89,11 +97,12 @@ 58 ], "flags": {}, - "order": 15, + "order": 13, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 81 } @@ -101,6 +110,7 @@ "outputs": [ { "name": "output_image", + "localized_name": "output_image", "type": "IMAGE", "links": [ 63 @@ -127,11 +137,12 @@ 58 ], "flags": {}, - "order": 16, + "order": 14, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 83 } @@ -139,6 +150,7 @@ "outputs": [ { "name": "output_image", + "localized_name": "output_image", "type": "IMAGE", "links": [ 69 @@ -153,295 +165,6 @@ 40 ] }, - { - "id": 11, - "type": "LTXVApplySTG", - "pos": [ - 1500.3453369140625, - 1079.3546142578125 - ], - "size": [ - 315, - 58 - ], - "flags": {}, - "order": 12, - "mode": 0, - "inputs": [ - { - "name": "model", - "type": "MODEL", - "link": 9 - } - ], - "outputs": [ - { - "name": "model", - "type": "MODEL", - "links": [ - 10 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "LTXVApplySTG" - }, - "widgets_values": [ - "14" - ] - }, - { - "id": 9, - "type": "KSamplerSelect", - "pos": [ - 2233.98828125, - 1065.9569091796875 - ], - "size": [ - 315, - 58 - ], - "flags": {}, - "order": 0, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "SAMPLER", - "type": "SAMPLER", - "links": [ - 4 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "KSamplerSelect" - }, - "widgets_values": [ - "gradient_estimation" - ] - }, - { - "id": 7, - "type": "SamplerCustomAdvanced", - "pos": [ - 2620.427978515625, - 1164.3114013671875 - ], - "size": [ - 355.20001220703125, - 106 - ], - "flags": {}, - "order": 22, - "mode": 0, - "inputs": [ - { - "name": "noise", - "type": "NOISE", - "link": 3 - }, - { - "name": "guider", - "type": "GUIDER", - "link": 2 - }, - { - "name": "sampler", - "type": "SAMPLER", - "link": 4 - }, - { - "name": "sigmas", - "type": "SIGMAS", - "link": 79 - }, - { - "name": "latent_image", - "type": "LATENT", - "link": 72 - } - ], - "outputs": [ - { - "name": "output", - "type": "LATENT", - "links": [ - 85 - ], - "slot_index": 0 - }, - { - "name": "denoised_output", - "type": "LATENT", - "links": null - } - ], - "properties": { - "Node name for S&R": "SamplerCustomAdvanced" - }, - "widgets_values": [] - }, - { - "id": 5, - "type": "STGGuider", - "pos": [ - 2242.097900390625, - 1185.6693115234375 - ], - "size": [ - 315, - 146 - ], - "flags": {}, - "order": 21, - "mode": 0, - "inputs": [ - { - "name": "model", - "type": "MODEL", - "link": 10 - }, - { - "name": "positive", - "type": "CONDITIONING", - "link": 7 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 8 - } - ], - "outputs": [ - { - "name": "GUIDER", - "type": "GUIDER", - "links": [ - 2 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "STGGuider" - }, - "widgets_values": [ - 3, - 1, - 0.75 - ] - }, - { - "id": 13, - "type": "EmptyLTXVLatentVideo", - "pos": [ - 676.87158203125, - 1749.301513671875 - ], - "size": [ - 315, - 130 - ], - "flags": {}, - "order": 1, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "LATENT", - "type": "LATENT", - "links": [ - 62 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "EmptyLTXVLatentVideo" - }, - "widgets_values": [ - 768, - 512, - 121, - 1 - ] - }, - { - "id": 15, - "type": "CLIPTextEncode", - "pos": [ - 622.5274047851562, - 1480.2808837890625 - ], - "size": [ - 392.1722717285156, - 119.6710433959961 - ], - "flags": {}, - "order": 11, - "mode": 0, - "inputs": [ - { - "name": "clip", - "type": "CLIP", - "link": 19 - } - ], - "outputs": [ - { - "name": "CONDITIONING", - "type": "CONDITIONING", - "links": [ - 60 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "CLIPTextEncode" - }, - "widgets_values": [ - "shaky, glitchy, low quality, worst quality, deformed, distorted, disfigured, motion smear, motion artifacts, fused fingers, bad anatomy, weird hand, ugly, transition" - ] - }, - { - "id": 16, - "type": "CLIPLoader", - "pos": [ - 625.4815063476562, - 1078.2762451171875 - ], - "size": [ - 315, - 82 - ], - "flags": {}, - "order": 2, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "CLIP", - "type": "CLIP", - "links": [ - 18, - 19 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "CLIPLoader" - }, - "widgets_values": [ - "t5xxl_fp16.safetensors", - "ltxv", - "default" - ] - }, { "id": 31, "type": "LTXVScheduler", @@ -454,11 +177,12 @@ 154 ], "flags": {}, - "order": 20, + "order": 18, "mode": 0, "inputs": [ { "name": "latent", + "localized_name": "latent", "type": "LATENT", "shape": 7, "link": 78 @@ -467,6 +191,7 @@ "outputs": [ { "name": "SIGMAS", + "localized_name": "SIGMAS", "type": "SIGMAS", "links": [ 79 @@ -485,190 +210,6 @@ 0.1 ] }, - { - "id": 12, - "type": "CheckpointLoaderSimple", - "pos": [ - 1080.441650390625, - 1033.5550537109375 - ], - "size": [ - 315, - 98 - ], - "flags": {}, - "order": 3, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "MODEL", - "type": "MODEL", - "links": [ - 9 - ], - "slot_index": 0 - }, - { - "name": "CLIP", - "type": "CLIP", - "links": null - }, - { - "name": "VAE", - "type": "VAE", - "links": [ - 73, - 74, - 75 - ], - "slot_index": 2 - } - ], - "properties": { - "Node name for S&R": "CheckpointLoaderSimple" - }, - "widgets_values": [ - "ltx-video-2b-v0.9.5.safetensors" - ] - }, - { - "id": 32, - "type": "Note", - "pos": [ - 2258.57373046875, - 1423.3946533203125 - ], - "size": [ - 291.3345947265625, - 73.75885772705078 - ], - "flags": {}, - "order": 4, - "mode": 0, - "inputs": [], - "outputs": [], - "properties": {}, - "widgets_values": [ - "For faster running times you can try setting cfg to 1." - ], - "color": "#432", - "bgcolor": "#653" - }, - { - "id": 27, - "type": "LTXVAddGuide", - "pos": [ - 1493.655517578125, - 1201.2786865234375 - ], - "size": [ - 315, - 162 - ], - "flags": {}, - "order": 18, - "mode": 0, - "inputs": [ - { - "name": "positive", - "type": "CONDITIONING", - "link": 66 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 67 - }, - { - "name": "vae", - "type": "VAE", - "link": 75 - }, - { - "name": "latent", - "type": "LATENT", - "link": 68 - }, - { - "name": "image", - "type": "IMAGE", - "link": 69 - } - ], - "outputs": [ - { - "name": "positive", - "type": "CONDITIONING", - "links": [ - 70 - ], - "slot_index": 0 - }, - { - "name": "negative", - "type": "CONDITIONING", - "links": [ - 71 - ], - "slot_index": 1 - }, - { - "name": "latent", - "type": "LATENT", - "links": [ - 72, - 78 - ], - "slot_index": 2 - } - ], - "properties": { - "Node name for S&R": "LTXVAddGuide" - }, - "widgets_values": [ - 120, - 1 - ] - }, - { - "id": 14, - "type": "CLIPTextEncode", - "pos": [ - 617.918701171875, - 1220.501708984375 - ], - "size": [ - 400, - 200 - ], - "flags": {}, - "order": 10, - "mode": 0, - "inputs": [ - { - "name": "clip", - "type": "CLIP", - "link": 18 - } - ], - "outputs": [ - { - "name": "CONDITIONING", - "type": "CONDITIONING", - "links": [ - 59 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "CLIPTextEncode" - }, - "widgets_values": [ - "A donkey gracefully rides a surfboard, going from a fiery volcanic wave to a frozen, icy landscape. Initially, the dark brown donkey stands on a surfboard amidst a wave of lava, the intense orange flames illuminating its silhouette. The camera maintains a medium shot, slightly angled, capturing the donkey's determined expression. The scene shifts smoothly to a wide shot of the donkey on the same surfboard, now gliding across a frozen lake with scattered ice floes and snow-covered rocks. The lighting changes to a bright, clear winter day. The donkey's expression remains calm; its movement is smooth and controlled. The video is computer-generated imagery.\n\n\n\n\n\n\n" - ] - }, { "id": 2, "type": "LoadImage", @@ -681,12 +222,13 @@ 314 ], "flags": {}, - "order": 5, + "order": 0, "mode": 0, "inputs": [], "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 80 @@ -695,6 +237,7 @@ }, { "name": "MASK", + "localized_name": "MASK", "type": "MASK", "links": null } @@ -719,12 +262,13 @@ 314 ], "flags": {}, - "order": 6, + "order": 1, "mode": 0, "inputs": [], "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 82 @@ -733,6 +277,7 @@ }, { "name": "MASK", + "localized_name": "MASK", "type": "MASK", "links": null } @@ -745,85 +290,6 @@ "image" ] }, - { - "id": 34, - "type": "ImageResizeKJ", - "pos": [ - 1092.6722412109375, - 1530.77978515625 - ], - "size": [ - 315, - 266 - ], - "flags": {}, - "order": 13, - "mode": 0, - "inputs": [ - { - "name": "image", - "type": "IMAGE", - "link": 80 - }, - { - "name": "get_image_size", - "type": "IMAGE", - "shape": 7, - "link": null - }, - { - "name": "width_input", - "type": "INT", - "shape": 7, - "widget": { - "name": "width_input" - }, - "link": null - }, - { - "name": "height_input", - "type": "INT", - "shape": 7, - "widget": { - "name": "height_input" - }, - "link": null - } - ], - "outputs": [ - { - "name": "IMAGE", - "type": "IMAGE", - "links": [ - 81 - ], - "slot_index": 0 - }, - { - "name": "width", - "type": "INT", - "links": null - }, - { - "name": "height", - "type": "INT", - "links": null - } - ], - "properties": { - "Node name for S&R": "ImageResizeKJ" - }, - "widgets_values": [ - 768, - 512, - "nearest-exact", - false, - 2, - 0, - 0, - "center" - ] - }, { "id": 35, "type": "ImageResizeKJ", @@ -833,19 +299,21 @@ ], "size": [ 315, - 266 + 286 ], "flags": {}, - "order": 14, + "order": 10, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 82 }, { "name": "get_image_size", + "localized_name": "get_image_size", "type": "IMAGE", "shape": 7, "link": null @@ -854,6 +322,10 @@ "name": "width_input", "type": "INT", "shape": 7, + "pos": [ + 10, + 196 + ], "widget": { "name": "width_input" }, @@ -863,6 +335,10 @@ "name": "height_input", "type": "INT", "shape": 7, + "pos": [ + 10, + 220 + ], "widget": { "name": "height_input" }, @@ -872,6 +348,7 @@ "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 83 @@ -880,11 +357,13 @@ }, { "name": "width", + "localized_name": "width", "type": "INT", "links": null }, { "name": "height", + "localized_name": "height", "type": "INT", "links": null } @@ -915,7 +394,7 @@ 91.49161529541016 ], "flags": {}, - "order": 7, + "order": 2, "mode": 0, "inputs": [], "outputs": [], @@ -935,10 +414,10 @@ ], "size": [ 304.03729248046875, - 80.94778442382812 + 88 ], "flags": {}, - "order": 8, + "order": 3, "mode": 0, "inputs": [], "outputs": [], @@ -949,6 +428,90 @@ "color": "#432", "bgcolor": "#653" }, + { + "id": 27, + "type": "LTXVAddGuide", + "pos": [ + 1491.158935546875, + 1197.301025390625 + ], + "size": [ + 315, + 162 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "link": 66 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "link": 67 + }, + { + "name": "vae", + "localized_name": "vae", + "type": "VAE", + "link": 75 + }, + { + "name": "latent", + "localized_name": "latent", + "type": "LATENT", + "link": 68 + }, + { + "name": "image", + "localized_name": "image", + "type": "IMAGE", + "link": 69 + } + ], + "outputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "links": [ + 70 + ], + "slot_index": 0 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "links": [ + 71 + ], + "slot_index": 1 + }, + { + "name": "latent", + "localized_name": "latent", + "type": "LATENT", + "links": [ + 72, + 78 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "LTXVAddGuide" + }, + "widgets_values": [ + 120, + 1 + ] + }, { "id": 10, "type": "LTXVConditioning", @@ -961,16 +524,18 @@ 78 ], "flags": {}, - "order": 19, + "order": 17, "mode": 0, "inputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "link": 70 }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "link": 71 } @@ -978,19 +543,21 @@ "outputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "links": [ - 7, - 87 + 87, + 90 ], "slot_index": 0 }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "links": [ - 8, - 88 + 88, + 91 ], "slot_index": 1 } @@ -1002,41 +569,277 @@ 25 ] }, + { + "id": 38, + "type": "STGGuiderAdvanced", + "pos": [ + 1886.081787109375, + 1587.580322265625 + ], + "size": [ + 327.5999755859375, + 242 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "model", + "localized_name": "model", + "type": "MODEL", + "link": 92 + }, + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "link": 90 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "link": 91 + } + ], + "outputs": [ + { + "name": "GUIDER", + "localized_name": "GUIDER", + "type": "GUIDER", + "links": [ + 93 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "STGGuiderAdvanced" + }, + "widgets_values": [ + 0.996, + true, + "1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180", + "4, 4, 4, 4, 1, 1", + "2, 2, 2, 2, 1, 0", + "1, 1, 1, 1, 1, 1", + "[14], [14], [14], [14], [14], [14]" + ] + }, + { + "id": 7, + "type": "SamplerCustomAdvanced", + "pos": [ + 2242.384521484375, + 1192.1341552734375 + ], + "size": [ + 355.20001220703125, + 106 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "noise", + "localized_name": "noise", + "type": "NOISE", + "link": 3 + }, + { + "name": "guider", + "localized_name": "guider", + "type": "GUIDER", + "link": 93 + }, + { + "name": "sampler", + "localized_name": "sampler", + "type": "SAMPLER", + "link": 4 + }, + { + "name": "sigmas", + "localized_name": "sigmas", + "type": "SIGMAS", + "link": 79 + }, + { + "name": "latent_image", + "localized_name": "latent_image", + "type": "LATENT", + "link": 72 + } + ], + "outputs": [ + { + "name": "output", + "localized_name": "output", + "type": "LATENT", + "links": [ + 85 + ], + "slot_index": 0 + }, + { + "name": "denoised_output", + "localized_name": "denoised_output", + "type": "LATENT", + "links": null + } + ], + "properties": { + "Node name for S&R": "SamplerCustomAdvanced" + }, + "widgets_values": [] + }, + { + "id": 37, + "type": "LTXVCropGuides", + "pos": [ + 2292.63720703125, + 1359.763427734375 + ], + "size": [ + 216.59999084472656, + 66 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "link": 87 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "link": 88 + }, + { + "name": "latent", + "localized_name": "latent", + "type": "LATENT", + "link": 85 + } + ], + "outputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "links": null + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "links": null + }, + { + "name": "latent", + "localized_name": "latent", + "type": "LATENT", + "links": [ + 86 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "LTXVCropGuides" + }, + "widgets_values": [] + }, + { + "id": 17, + "type": "VAEDecode", + "pos": [ + 2298.669677734375, + 1490.08056640625 + ], + "size": [ + 210, + 46 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "samples", + "localized_name": "samples", + "type": "LATENT", + "link": 86 + }, + { + "name": "vae", + "localized_name": "vae", + "type": "VAE", + "link": 73 + } + ], + "outputs": [ + { + "name": "IMAGE", + "localized_name": "IMAGE", + "type": "IMAGE", + "links": [ + 84 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, { "id": 36, "type": "VHS_VideoCombine", "pos": [ - 2649.404052734375, - 1612.633056640625 + 2296.265380859375, + 1605.352783203125 ], "size": [ 315, 520.6666870117188 ], "flags": {}, - "order": 25, + "order": 23, "mode": 0, "inputs": [ { "name": "images", + "localized_name": "images", "type": "IMAGE", "shape": 7, "link": 84 }, { "name": "audio", + "localized_name": "audio", "type": "AUDIO", "shape": 7, "link": null }, { "name": "meta_batch", + "localized_name": "meta_batch", "type": "VHS_BatchManager", "shape": 7, "link": null }, { "name": "vae", + "localized_name": "vae", "type": "VAE", "shape": 7, "link": null @@ -1045,6 +848,7 @@ "outputs": [ { "name": "Filenames", + "localized_name": "Filenames", "type": "VHS_FILENAMES", "links": null } @@ -1066,7 +870,7 @@ "hidden": false, "paused": false, "params": { - "filename": "ltxv_00132.mp4", + "filename": "ltxv_00121.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4", @@ -1076,119 +880,268 @@ } }, { - "id": 17, - "type": "VAEDecode", + "id": 34, + "type": "ImageResizeKJ", "pos": [ - 2669.6435546875, - 1471.837646484375 + 1090.9002685546875, + 1524.03857421875 ], "size": [ - 210, - 46 + 315, + 286 ], "flags": {}, - "order": 24, + "order": 9, "mode": 0, "inputs": [ { - "name": "samples", - "type": "LATENT", - "link": 86 + "name": "image", + "localized_name": "image", + "type": "IMAGE", + "link": 80 }, { - "name": "vae", - "type": "VAE", - "link": 73 + "name": "get_image_size", + "localized_name": "get_image_size", + "type": "IMAGE", + "shape": 7, + "link": null + }, + { + "name": "width_input", + "type": "INT", + "shape": 7, + "pos": [ + 10, + 196 + ], + "widget": { + "name": "width_input" + }, + "link": null + }, + { + "name": "height_input", + "type": "INT", + "shape": 7, + "pos": [ + 10, + 220 + ], + "widget": { + "name": "height_input" + }, + "link": null } ], "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ - 84 + 81 + ], + "slot_index": 0 + }, + { + "name": "width", + "localized_name": "width", + "type": "INT", + "links": null + }, + { + "name": "height", + "localized_name": "height", + "type": "INT", + "links": null + } + ], + "properties": { + "Node name for S&R": "ImageResizeKJ" + }, + "widgets_values": [ + 768, + 512, + "nearest-exact", + false, + 2, + 0, + 0, + "center" + ] + }, + { + "id": 13, + "type": "EmptyLTXVLatentVideo", + "pos": [ + 658.8583374023438, + 1901.9586181640625 + ], + "size": [ + 315, + 130 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "LATENT", + "localized_name": "LATENT", + "type": "LATENT", + "links": [ + 62 ], "slot_index": 0 } ], "properties": { - "Node name for S&R": "VAEDecode" + "Node name for S&R": "EmptyLTXVLatentVideo" }, - "widgets_values": [] + "widgets_values": [ + 768, + 512, + 121, + 1 + ] }, { - "id": 37, - "type": "LTXVCropGuides", + "id": 15, + "type": "CLIPTextEncode", "pos": [ - 2688.18603515625, - 1336.5384521484375 + 629.337158203125, + 1725.8612060546875 ], "size": [ - 216.59999084472656, - 66 + 392.1722717285156, + 119.6710433959961 ], "flags": {}, - "order": 23, + "order": 12, "mode": 0, "inputs": [ { - "name": "positive", - "type": "CONDITIONING", - "link": 87 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 88 - }, - { - "name": "latent", - "type": "LATENT", - "link": 85 + "name": "clip", + "localized_name": "clip", + "type": "CLIP", + "link": 19 } ], "outputs": [ { - "name": "positive", + "name": "CONDITIONING", + "localized_name": "CONDITIONING", "type": "CONDITIONING", - "links": null - }, - { - "name": "negative", - "type": "CONDITIONING", - "links": null - }, - { - "name": "latent", - "type": "LATENT", "links": [ - 86 + 60 ], - "slot_index": 2 + "slot_index": 0 } ], "properties": { - "Node name for S&R": "LTXVCropGuides" - } + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "shaky, glitchy, low quality, worst quality, deformed, distorted, disfigured, motion smear, motion artifacts, fused fingers, bad anatomy, weird hand, ugly, transition" + ] + }, + { + "id": 14, + "type": "CLIPTextEncode", + "pos": [ + 624.9329833984375, + 1471.5355224609375 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "clip", + "localized_name": "clip", + "type": "CLIP", + "link": 18 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "localized_name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 59 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "A donkey gracefully rides a surfboard, going from a fiery volcanic wave to a frozen, icy landscape. Initially, the dark brown donkey stands on a surfboard amidst a wave of lava, the intense orange flames illuminating its silhouette. The camera maintains a medium shot, slightly angled, capturing the donkey's determined expression. The scene shifts smoothly to a wide shot of the donkey on the same surfboard, now gliding across a frozen lake with scattered ice floes and snow-covered rocks. The lighting changes to a bright, clear winter day. The donkey's expression remains calm; its movement is smooth and controlled. The video is computer-generated imagery.\n\n\n\n\n\n\n" + ] + }, + { + "id": 16, + "type": "CLIPLoader", + "pos": [ + 657.5050048828125, + 1323.1318359375 + ], + "size": [ + 315, + 98 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CLIP", + "localized_name": "CLIP", + "type": "CLIP", + "links": [ + 18, + 19 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPLoader" + }, + "widgets_values": [ + "t5xxl_fp16.safetensors", + "ltxv", + "default" + ] }, { "id": 8, "type": "RandomNoise", "pos": [ - 1850.8992919921875, - 1055.1177978515625 + 1891.2080078125, + 1895.3349609375 ], "size": [ 315, 82 ], "flags": {}, - "order": 9, + "order": 6, "mode": 0, "inputs": [], "outputs": [ { "name": "NOISE", + "localized_name": "NOISE", "type": "NOISE", "links": [ 3 @@ -1203,17 +1156,92 @@ 5, "fixed" ] + }, + { + "id": 9, + "type": "KSamplerSelect", + "pos": [ + 1896.1917724609375, + 2035.409423828125 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "SAMPLER", + "localized_name": "SAMPLER", + "type": "SAMPLER", + "links": [ + 4 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSamplerSelect" + }, + "widgets_values": [ + "gradient_estimation" + ] + }, + { + "id": 12, + "type": "CheckpointLoaderSimple", + "pos": [ + 655.3289794921875, + 1178.0711669921875 + ], + "size": [ + 315, + 98 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "localized_name": "MODEL", + "type": "MODEL", + "links": [ + 92 + ], + "slot_index": 0 + }, + { + "name": "CLIP", + "localized_name": "CLIP", + "type": "CLIP", + "links": null + }, + { + "name": "VAE", + "localized_name": "VAE", + "type": "VAE", + "links": [ + 73, + 74, + 75 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "ltxv-2b-0.9.6-dev-04-25.safetensors" + ] } ], "links": [ - [ - 2, - 5, - 0, - 7, - 1, - "GUIDER" - ], [ 3, 8, @@ -1230,38 +1258,6 @@ 2, "SAMPLER" ], - [ - 7, - 10, - 0, - 5, - 1, - "CONDITIONING" - ], - [ - 8, - 10, - 1, - 5, - 2, - "CONDITIONING" - ], - [ - 9, - 12, - 0, - 11, - 0, - "MODEL" - ], - [ - 10, - 11, - 0, - 5, - 0, - "MODEL" - ], [ 18, 16, @@ -1477,20 +1473,52 @@ 37, 1, "CONDITIONING" + ], + [ + 90, + 10, + 0, + 38, + 1, + "CONDITIONING" + ], + [ + 91, + 10, + 1, + 38, + 2, + "CONDITIONING" + ], + [ + 92, + 12, + 0, + 38, + 0, + "MODEL" + ], + [ + 93, + 38, + 0, + 7, + 1, + "GUIDER" ] ], "groups": [], "config": {}, "extra": { "ds": { - "scale": 0.6538676505623344, + "scale": 0.6303940863128502, "offset": [ - -885.0991685047312, - -1012.4869764971703 + -355.757443222888, + -1116.3282097448212 ] }, "node_versions": { - "comfy-core": "0.3.18" + "comfy-core": "0.3.27" }, "prompt": { "1": { @@ -1513,29 +1541,6 @@ "title": "Load Image" } }, - "5": { - "inputs": { - "cfg": 3, - "stg": 1, - "rescale": 0.75, - "model": [ - "11", - 0 - ], - "positive": [ - "10", - 0 - ], - "negative": [ - "10", - 1 - ] - }, - "class_type": "STGGuider", - "_meta": { - "title": "🅛🅣🅧 STG Guider" - } - }, "7": { "inputs": { "noise": [ @@ -1543,7 +1548,7 @@ 0 ], "guider": [ - "5", + "38", 0 ], "sampler": [ @@ -1599,22 +1604,9 @@ "title": "LTXVConditioning" } }, - "11": { - "inputs": { - "block_indices": "14", - "model": [ - "12", - 0 - ] - }, - "class_type": "LTXVApplySTG", - "_meta": { - "title": "🅛🅣🅧 LTXV Apply STG" - } - }, "12": { "inputs": { - "ckpt_name": "ltx-video-2b-v0.9.5.safetensors" + "ckpt_name": "ltxv-2b-0.9.6-dev-04-25.safetensors" }, "class_type": "CheckpointLoaderSimple", "_meta": { @@ -1865,9 +1857,36 @@ "_meta": { "title": "LTXVCropGuides" } + }, + "38": { + "inputs": { + "skip_steps_sigma_threshold": 0.996, + "cfg_star_rescale": true, + "sigmas": "1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180", + "cfg_values": "4, 4, 4, 4, 1, 1", + "stg_scale_values": "2, 2, 2, 2, 1, 0", + "stg_rescale_values": "1, 1, 1, 1, 1, 1", + "stg_layers_indices": "[14], [14], [14], [14], [14], [14]", + "model": [ + "12", + 0 + ], + "positive": [ + "10", + 0 + ], + "negative": [ + "10", + 1 + ] + }, + "class_type": "STGGuiderAdvanced", + "_meta": { + "title": "🅛🅣🅧 STG Guider Advanced" + } } }, - "comfy_fork_version": "update_nodes@db0f122d" + "comfy_fork_version": "feature/memory_prof@f7e64946" }, "version": 0.4 } diff --git a/assets/ltxvideo-frame-interpolation.png b/assets/ltxvideo-frame-interpolation.png index eb3a14e..f56e410 100644 --- a/assets/ltxvideo-frame-interpolation.png +++ b/assets/ltxvideo-frame-interpolation.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97ea4a9a45004726ae84971bef44578270a7be986b1fce533cc8d3ec1a213fdd -size 1390379 +oid sha256:77d9f98afa1a5711fade39a6fa08b9c3eab8c439c3727f522bae639bee11cf0a +size 1380444 diff --git a/assets/ltxvideo-i2v-distilled.json b/assets/ltxvideo-i2v-distilled.json new file mode 100644 index 0000000..2260170 --- /dev/null +++ b/assets/ltxvideo-i2v-distilled.json @@ -0,0 +1,1009 @@ +{ + "id": "d8be2e45-0fd2-4f4a-8065-469fdf4bc018", + "revision": 0, + "last_node_id": 109, + "last_link_id": 268, + "nodes": [ + { + "id": 38, + "type": "CLIPLoader", + "pos": [ + 60, + 190 + ], + "size": [ + 315, + 98 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "slot_index": 0, + "links": [ + 74, + 75 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.28", + "Node name for S&R": "CLIPLoader" + }, + "widgets_values": [ + "t5xxl_fp16.safetensors", + "ltxv", + "default" + ] + }, + { + "id": 8, + "type": "VAEDecode", + "pos": [ + 1800, + 430 + ], + "size": [ + 210, + 46 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 255 + }, + { + "name": "vae", + "type": "VAE", + "link": 87 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "slot_index": 0, + "links": [ + 261 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.28", + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 103, + "type": "VHS_VideoCombine", + "pos": [ + 1789.6087646484375, + 548.7745361328125 + ], + "size": [ + 315, + 545 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "images", + "shape": 7, + "type": "IMAGE", + "link": 261 + }, + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + }, + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-videohelpersuite", + "ver": "972c87da577b47211c4e9aeed30dc38c7bae607f", + "Node name for S&R": "VHS_VideoCombine" + }, + "widgets_values": { + "frame_rate": 24, + "loop_count": 0, + "filename_prefix": "ltxv", + "format": "video/h264-mp4", + "pix_fmt": "yuv420p", + "crf": 20, + "save_metadata": false, + "trim_to_audio": false, + "pingpong": false, + "save_output": true, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "ltxv_00058.mp4", + "subfolder": "", + "type": "output", + "format": "video/h264-mp4", + "frame_rate": 24, + "workflow": "ltxv_00058.png", + "fullpath": "C:\\Users\\Zeev\\Projects\\ComfyUI\\output\\ltxv_00058.mp4" + } + } + } + }, + { + "id": 82, + "type": "LTXVPreprocess", + "pos": [ + 488.92791748046875, + 629.9364624023438 + ], + "size": [ + 275.9266662597656, + 58 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 226 + } + ], + "outputs": [ + { + "name": "output_image", + "type": "IMAGE", + "slot_index": 0, + "links": [ + 248 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.28", + "Node name for S&R": "LTXVPreprocess" + }, + "widgets_values": [ + 38 + ] + }, + { + "id": 7, + "type": "CLIPTextEncode", + "pos": [ + 420, + 390 + ], + "size": [ + 425.27801513671875, + 180.6060791015625 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 75 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "slot_index": 0, + "links": [ + 240 + ] + } + ], + "title": "CLIP Text Encode (Negative Prompt)", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.28", + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "low quality, worst quality, deformed, distorted, disfigured, motion smear, motion artifacts, fused fingers, bad anatomy, weird hand, ugly" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 78, + "type": "LoadImage", + "pos": [ + 40, + 630 + ], + "size": [ + 385.15606689453125, + 333.3305358886719 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "slot_index": 0, + "links": [ + 226 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.28", + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "fox.jpg", + "image", + "" + ] + }, + { + "id": 6, + "type": "CLIPTextEncode", + "pos": [ + 420, + 180 + ], + "size": [ + 422.84503173828125, + 164.31304931640625 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 74 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "slot_index": 0, + "links": [ + 239 + ] + } + ], + "title": "CLIP Text Encode (Positive Prompt)", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.28", + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "A red fox moving gracefully, its russet coat vibrant against the white landscape, leaving perfect star-shaped prints behind as steam rises from its breath in the crisp winter air. The scene is wrapped in snow-muffled silence, broken only by the gentle murmur of water still flowing beneath the ice." + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 76, + "type": "Note", + "pos": [ + 36.85359573364258, + 360.48809814453125 + ], + "size": [ + 360, + 200 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [], + "properties": {}, + "widgets_values": [ + "While LTXV-2b model prefers long descriptive prompts, this version supports experimentation with broader prompting styles." + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 69, + "type": "LTXVConditioning", + "pos": [ + 1183.358642578125, + 292.5882873535156 + ], + "size": [ + 223.8660125732422, + 78 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 245 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 246 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "slot_index": 0, + "links": [ + 256 + ] + }, + { + "name": "negative", + "type": "CONDITIONING", + "slot_index": 1, + "links": [ + 257 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.28", + "Node name for S&R": "LTXVConditioning" + }, + "widgets_values": [ + 24.000000000000004 + ] + }, + { + "id": 101, + "type": "SamplerCustomAdvanced", + "pos": [ + 1780, + 270 + ], + "size": [ + 236.8000030517578, + 106 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "noise", + "type": "NOISE", + "link": 260 + }, + { + "name": "guider", + "type": "GUIDER", + "link": 252 + }, + { + "name": "sampler", + "type": "SAMPLER", + "link": 253 + }, + { + "name": "sigmas", + "type": "SIGMAS", + "link": 268 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 259 + } + ], + "outputs": [ + { + "name": "output", + "type": "LATENT", + "slot_index": 0, + "links": [] + }, + { + "name": "denoised_output", + "type": "LATENT", + "slot_index": 1, + "links": [ + 255 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.15", + "Node name for S&R": "SamplerCustomAdvanced" + }, + "widgets_values": [] + }, + { + "id": 95, + "type": "LTXVImgToVideo", + "pos": [ + 900, + 290 + ], + "size": [ + 210, + 190 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 239 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 240 + }, + { + "name": "vae", + "type": "VAE", + "link": 250 + }, + { + "name": "image", + "type": "IMAGE", + "link": 248 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "slot_index": 0, + "links": [ + 245 + ] + }, + { + "name": "negative", + "type": "CONDITIONING", + "slot_index": 1, + "links": [ + 246 + ] + }, + { + "name": "latent", + "type": "LATENT", + "slot_index": 2, + "links": [ + 259 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.28", + "Node name for S&R": "LTXVImgToVideo" + }, + "widgets_values": [ + 768, + 512, + 97, + 1 + ] + }, + { + "id": 100, + "type": "StringToFloatList", + "pos": [ + 1116.0089111328125, + 604.5989379882812 + ], + "size": [ + 395.74224853515625, + 88 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 251 + ] + } + ], + "properties": { + "cnr_id": "comfyui-kjnodes", + "ver": "0addfc6101f7a834c7fb6e0a1b26529360ab5350", + "Node name for S&R": "StringToFloatList" + }, + "widgets_values": [ + "1.0000, 0.9937, 0.9875, 0.9812, 0.9750, 0.9094, 0.7250, 0.4219, 0.0" + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 105, + "type": "Note", + "pos": [ + 1126.7423095703125, + 424.2294616699219 + ], + "size": [ + 335.8657531738281, + 106.6832046508789 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [], + "properties": {}, + "widgets_values": [ + "Distilled model expects the following sigma schedule:\n1.0000, 0.9937, 0.9875, 0.9812, 0.9750, 0.9094, 0.7250, 0.4219, 0.0\n\n\nEuler_ancestral is the recommended default sampler." + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 97, + "type": "KSamplerSelect", + "pos": [ + 1477.55615234375, + 427.04132080078125 + ], + "size": [ + 275.599365234375, + 58 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "SAMPLER", + "type": "SAMPLER", + "slot_index": 0, + "links": [ + 253 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.15", + "Node name for S&R": "KSamplerSelect" + }, + "widgets_values": [ + "euler_ancestral" + ] + }, + { + "id": 99, + "type": "CFGGuider", + "pos": [ + 1536.1513671875, + 280 + ], + "size": [ + 210, + 98 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 258 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 256 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 257 + } + ], + "outputs": [ + { + "name": "GUIDER", + "type": "GUIDER", + "slot_index": 0, + "links": [ + 252 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.26", + "Node name for S&R": "CFGGuider" + }, + "widgets_values": [ + 1 + ] + }, + { + "id": 102, + "type": "RandomNoise", + "pos": [ + 1524.6190185546875, + 138.8462371826172 + ], + "size": [ + 210, + 82 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "NOISE", + "type": "NOISE", + "links": [ + 260 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.28", + "Node name for S&R": "RandomNoise" + }, + "widgets_values": [ + 45, + "fixed" + ] + }, + { + "id": 98, + "type": "FloatToSigmas", + "pos": [ + 1574.70166015625, + 620.4625244140625 + ], + "size": [ + 210, + 58 + ], + "flags": { + "collapsed": true + }, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "float_list", + "type": "FLOAT", + "widget": { + "name": "float_list" + }, + "link": null + }, + { + "name": "float_list", + "type": "FLOAT", + "widget": { + "name": "float_list" + }, + "link": 251 + } + ], + "outputs": [ + { + "name": "SIGMAS", + "type": "SIGMAS", + "links": [ + 268 + ] + } + ], + "properties": { + "cnr_id": "comfyui-kjnodes", + "ver": "0addfc6101f7a834c7fb6e0a1b26529360ab5350", + "Node name for S&R": "FloatToSigmas" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 44, + "type": "CheckpointLoaderSimple", + "pos": [ + 899.0839233398438, + 113.54173278808594 + ], + "size": [ + 315, + 98 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "slot_index": 0, + "links": [ + 258 + ] + }, + { + "name": "CLIP", + "type": "CLIP", + "links": null + }, + { + "name": "VAE", + "type": "VAE", + "slot_index": 2, + "links": [ + 87, + 250 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.28", + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "ltxv-2b-0.9.6-distilled-04-25.safetensors" + ] + } + ], + "links": [ + [ + 74, + 38, + 0, + 6, + 0, + "CLIP" + ], + [ + 75, + 38, + 0, + 7, + 0, + "CLIP" + ], + [ + 87, + 44, + 2, + 8, + 1, + "VAE" + ], + [ + 226, + 78, + 0, + 82, + 0, + "IMAGE" + ], + [ + 239, + 6, + 0, + 95, + 0, + "CONDITIONING" + ], + [ + 240, + 7, + 0, + 95, + 1, + "CONDITIONING" + ], + [ + 245, + 95, + 0, + 69, + 0, + "CONDITIONING" + ], + [ + 246, + 95, + 1, + 69, + 1, + "CONDITIONING" + ], + [ + 248, + 82, + 0, + 95, + 3, + "IMAGE" + ], + [ + 250, + 44, + 2, + 95, + 2, + "VAE" + ], + [ + 251, + 100, + 0, + 98, + 1, + "FLOAT" + ], + [ + 252, + 99, + 0, + 101, + 1, + "GUIDER" + ], + [ + 253, + 97, + 0, + 101, + 2, + "SAMPLER" + ], + [ + 255, + 101, + 1, + 8, + 0, + "LATENT" + ], + [ + 256, + 69, + 0, + 99, + 1, + "CONDITIONING" + ], + [ + 257, + 69, + 1, + 99, + 2, + "CONDITIONING" + ], + [ + 258, + 44, + 0, + 99, + 0, + "MODEL" + ], + [ + 259, + 95, + 2, + 101, + 4, + "LATENT" + ], + [ + 260, + 102, + 0, + 101, + 0, + "NOISE" + ], + [ + 261, + 8, + 0, + 103, + 0, + "IMAGE" + ], + [ + 268, + 98, + 0, + 101, + 3, + "SIGMAS" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 0.6303940863129158, + "offset": [ + 627.9092558924768, + 478.72279841993054 + ] + }, + "VHS_latentpreview": true, + "VHS_latentpreviewrate": 0, + "VHS_MetadataImage": true, + "VHS_KeepIntermediate": true + }, + "version": 0.4 +} diff --git a/assets/ltxvideo-i2v-distilled.png b/assets/ltxvideo-i2v-distilled.png new file mode 100644 index 0000000..ffaff0b --- /dev/null +++ b/assets/ltxvideo-i2v-distilled.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b981ed68d5f4a25e48daf31cf4cf0e156bee27b75730dd5fd213bfb805d1c8d +size 1342913 diff --git a/assets/ltxvideo-i2v.json b/assets/ltxvideo-i2v.json index 946f3b6..1c5f527 100644 --- a/assets/ltxvideo-i2v.json +++ b/assets/ltxvideo-i2v.json @@ -1,6 +1,6 @@ { - "last_node_id": 90, - "last_link_id": 215, + "last_node_id": 92, + "last_link_id": 224, "nodes": [ { "id": 81, @@ -14,31 +14,36 @@ 106 ], "flags": {}, - "order": 17, + "order": 16, "mode": 0, "inputs": [ { "name": "noise", + "localized_name": "noise", "type": "NOISE", "link": 194 }, { "name": "guider", + "localized_name": "guider", "type": "GUIDER", - "link": 200 + "link": 224 }, { "name": "sampler", + "localized_name": "sampler", "type": "SAMPLER", "link": 196 }, { "name": "sigmas", + "localized_name": "sigmas", "type": "SIGMAS", "link": 197 }, { "name": "latent_image", + "localized_name": "latent_image", "type": "LATENT", "link": 198 } @@ -46,6 +51,7 @@ "outputs": [ { "name": "output", + "localized_name": "output", "type": "LATENT", "links": [ 199 @@ -54,12 +60,15 @@ }, { "name": "denoised_output", + "localized_name": "denoised_output", "type": "LATENT", "links": null } ], "properties": { - "Node name for S&R": "SamplerCustomAdvanced" + "Node name for S&R": "SamplerCustomAdvanced", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [] }, @@ -72,29 +81,33 @@ ], "size": [ 315, - 190 + 214 ], "flags": {}, - "order": 13, + "order": 12, "mode": 0, "inputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "link": 187 }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "link": 188 }, { "name": "vae", + "localized_name": "vae", "type": "VAE", "link": 213 }, { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 204 } @@ -102,6 +115,7 @@ "outputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "links": [ 183 @@ -110,6 +124,7 @@ }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "links": [ 184 @@ -118,6 +133,7 @@ }, { "name": "latent", + "localized_name": "latent", "type": "LATENT", "links": [ 185, @@ -127,12 +143,15 @@ } ], "properties": { - "Node name for S&R": "LTXVImgToVideo" + "Node name for S&R": "LTXVImgToVideo", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ 768, 512, 97, + 1, 1 ] }, @@ -148,11 +167,12 @@ 154 ], "flags": {}, - "order": 15, + "order": 14, "mode": 0, "inputs": [ { "name": "latent", + "localized_name": "latent", "type": "LATENT", "shape": 7, "link": 185 @@ -161,6 +181,7 @@ "outputs": [ { "name": "SIGMAS", + "localized_name": "SIGMAS", "type": "SIGMAS", "links": [ 197 @@ -169,7 +190,9 @@ } ], "properties": { - "Node name for S&R": "LTXVScheduler" + "Node name for S&R": "LTXVScheduler", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ 20, @@ -179,44 +202,6 @@ 0.1 ] }, - { - "id": 79, - "type": "LTXVApplySTG", - "pos": [ - 463.5073547363281, - 87.92158508300781 - ], - "size": [ - 315, - 58 - ], - "flags": {}, - "order": 7, - "mode": 0, - "inputs": [ - { - "name": "model", - "type": "MODEL", - "link": 191 - } - ], - "outputs": [ - { - "name": "model", - "type": "MODEL", - "links": [ - 195 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "LTXVApplySTG" - }, - "widgets_values": [ - "14" - ] - }, { "id": 8, "type": "VAEDecode", @@ -229,16 +214,18 @@ 46 ], "flags": {}, - "order": 18, + "order": 17, "mode": 0, "inputs": [ { "name": "samples", + "localized_name": "samples", "type": "LATENT", "link": 199 }, { "name": "vae", + "localized_name": "vae", "type": "VAE", "link": 212 } @@ -246,6 +233,7 @@ "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 211 @@ -254,144 +242,12 @@ } ], "properties": { - "Node name for S&R": "VAEDecode" + "Node name for S&R": "VAEDecode", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [] }, - { - "id": 83, - "type": "RandomNoise", - "pos": [ - 464.678955078125, - -74.81466674804688 - ], - "size": [ - 315, - 82 - ], - "flags": {}, - "order": 0, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "NOISE", - "type": "NOISE", - "links": [ - 194 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "RandomNoise" - }, - "widgets_values": [ - 42, - "fixed" - ] - }, - { - "id": 69, - "type": "LTXVConditioning", - "pos": [ - 885.63818359375, - 226.95408630371094 - ], - "size": [ - 223.8660125732422, - 78 - ], - "flags": {}, - "order": 14, - "mode": 0, - "inputs": [ - { - "name": "positive", - "type": "CONDITIONING", - "link": 183 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 184 - } - ], - "outputs": [ - { - "name": "positive", - "type": "CONDITIONING", - "links": [ - 201 - ], - "slot_index": 0 - }, - { - "name": "negative", - "type": "CONDITIONING", - "links": [ - 202 - ], - "slot_index": 1 - } - ], - "properties": { - "Node name for S&R": "LTXVConditioning" - }, - "widgets_values": [ - 25 - ] - }, - { - "id": 82, - "type": "STGGuider", - "pos": [ - 830.7182006835938, - 5.0998334884643555 - ], - "size": [ - 315, - 146 - ], - "flags": {}, - "order": 16, - "mode": 0, - "inputs": [ - { - "name": "model", - "type": "MODEL", - "link": 195 - }, - { - "name": "positive", - "type": "CONDITIONING", - "link": 201 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 202 - } - ], - "outputs": [ - { - "name": "GUIDER", - "type": "GUIDER", - "links": [ - 200 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "STGGuider" - }, - "widgets_values": [ - 3, - 1, - 0.75 - ] - }, { "id": 73, "type": "KSamplerSelect", @@ -404,12 +260,13 @@ 58 ], "flags": {}, - "order": 1, + "order": 0, "mode": 0, "inputs": [], "outputs": [ { "name": "SAMPLER", + "localized_name": "SAMPLER", "type": "SAMPLER", "links": [ 196 @@ -418,7 +275,9 @@ } ], "properties": { - "Node name for S&R": "KSamplerSelect" + "Node name for S&R": "KSamplerSelect", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ "gradient_estimation" @@ -436,29 +295,33 @@ 520.6666870117188 ], "flags": {}, - "order": 19, + "order": 18, "mode": 0, "inputs": [ { "name": "images", + "localized_name": "images", "type": "IMAGE", "shape": 7, "link": 211 }, { "name": "audio", + "localized_name": "audio", "type": "AUDIO", "shape": 7, "link": null }, { "name": "meta_batch", + "localized_name": "meta_batch", "type": "VHS_BatchManager", "shape": 7, "link": null }, { "name": "vae", + "localized_name": "vae", "type": "VAE", "shape": 7, "link": null @@ -467,6 +330,7 @@ "outputs": [ { "name": "Filenames", + "localized_name": "Filenames", "type": "VHS_FILENAMES", "links": null } @@ -488,7 +352,7 @@ "hidden": false, "paused": false, "params": { - "filename": "ltxv_00098.mp4", + "filename": "ltxv_00129.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4", @@ -497,52 +361,6 @@ } } }, - { - "id": 44, - "type": "CheckpointLoaderSimple", - "pos": [ - 82.3931884765625, - -72.30274200439453 - ], - "size": [ - 315, - 98 - ], - "flags": {}, - "order": 2, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "MODEL", - "type": "MODEL", - "links": [ - 191 - ], - "slot_index": 0 - }, - { - "name": "CLIP", - "type": "CLIP", - "links": null - }, - { - "name": "VAE", - "type": "VAE", - "links": [ - 212, - 213 - ], - "slot_index": 2 - } - ], - "properties": { - "Node name for S&R": "CheckpointLoaderSimple" - }, - "widgets_values": [ - "ltx-video-2b-v0.9.5.safetensors" - ] - }, { "id": 38, "type": "CLIPLoader", @@ -552,15 +370,16 @@ ], "size": [ 315, - 82 + 106 ], "flags": {}, - "order": 3, + "order": 1, "mode": 0, "inputs": [], "outputs": [ { "name": "CLIP", + "localized_name": "CLIP", "type": "CLIP", "links": [ 74, @@ -570,7 +389,9 @@ } ], "properties": { - "Node name for S&R": "CLIPLoader" + "Node name for S&R": "CLIPLoader", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ "t5xxl_fp16.safetensors", @@ -590,12 +411,13 @@ 82 ], "flags": {}, - "order": 4, + "order": 2, "mode": 0, "inputs": [], "outputs": [ { "name": "prompt_enhancer", + "localized_name": "prompt_enhancer", "type": "LTXV_PROMPT_ENHANCER", "links": [ 207 @@ -623,7 +445,7 @@ 192.86129760742188 ], "flags": {}, - "order": 5, + "order": 3, "mode": 0, "inputs": [], "outputs": [], @@ -648,17 +470,22 @@ "flags": { "collapsed": false }, - "order": 11, + "order": 10, "mode": 0, "inputs": [ { "name": "clip", + "localized_name": "clip", "type": "CLIP", "link": 74 }, { "name": "text", "type": "STRING", + "pos": [ + 10, + 36 + ], "widget": { "name": "text" }, @@ -668,6 +495,7 @@ "outputs": [ { "name": "CONDITIONING", + "localized_name": "CONDITIONING", "type": "CONDITIONING", "links": [ 187 @@ -677,7 +505,9 @@ ], "title": "CLIP Text Encode (Positive Prompt)", "properties": { - "Node name for S&R": "CLIPTextEncode" + "Node name for S&R": "CLIPTextEncode", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ "best quality, 4k, HDR, a tracking shot of a beautiful scene of the sea waves on the beach with a massive explosion in the water" @@ -694,19 +524,21 @@ ], "size": [ 315, - 266 + 286 ], "flags": {}, - "order": 10, + "order": 9, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 214 }, { "name": "get_image_size", + "localized_name": "get_image_size", "type": "IMAGE", "shape": 7, "link": null @@ -715,6 +547,10 @@ "name": "width_input", "type": "INT", "shape": 7, + "pos": [ + 10, + 196 + ], "widget": { "name": "width_input" }, @@ -724,6 +560,10 @@ "name": "height_input", "type": "INT", "shape": 7, + "pos": [ + 10, + 220 + ], "widget": { "name": "height_input" }, @@ -733,6 +573,7 @@ "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 215 @@ -741,11 +582,13 @@ }, { "name": "width", + "localized_name": "width", "type": "INT", "links": null }, { "name": "height", + "localized_name": "height", "type": "INT", "links": null } @@ -776,11 +619,12 @@ 58 ], "flags": {}, - "order": 12, + "order": 11, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 215 } @@ -788,6 +632,7 @@ "outputs": [ { "name": "output_image", + "localized_name": "output_image", "type": "IMAGE", "links": [ 204 @@ -796,7 +641,9 @@ } ], "properties": { - "Node name for S&R": "LTXVPreprocess" + "Node name for S&R": "LTXVPreprocess", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ 40 @@ -814,11 +661,12 @@ 137.85621643066406 ], "flags": {}, - "order": 8, + "order": 7, "mode": 0, "inputs": [ { "name": "clip", + "localized_name": "clip", "type": "CLIP", "link": 75 } @@ -826,6 +674,7 @@ "outputs": [ { "name": "CONDITIONING", + "localized_name": "CONDITIONING", "type": "CONDITIONING", "links": [ 188 @@ -835,7 +684,9 @@ ], "title": "CLIP Text Encode (Negative Prompt)", "properties": { - "Node name for S&R": "CLIPTextEncode" + "Node name for S&R": "CLIPTextEncode", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ "low quality, worst quality, deformed, distorted, disfigured, motion smear, motion artifacts, fused fingers, bad anatomy, weird hand, ugly" @@ -855,12 +706,13 @@ 333.3305358886719 ], "flags": {}, - "order": 6, + "order": 4, "mode": 0, "inputs": [], "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 205, @@ -870,12 +722,15 @@ }, { "name": "MASK", + "localized_name": "MASK", "type": "MASK", "links": null } ], "properties": { - "Node name for S&R": "LoadImage" + "Node name for S&R": "LoadImage", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ "shrek2.jpg", @@ -894,16 +749,18 @@ 102 ], "flags": {}, - "order": 9, + "order": 8, "mode": 0, "inputs": [ { "name": "prompt_enhancer", + "localized_name": "prompt_enhancer", "type": "LTXV_PROMPT_ENHANCER", "link": 207 }, { "name": "image_prompt", + "localized_name": "image_prompt", "type": "IMAGE", "shape": 7, "link": 205 @@ -912,6 +769,7 @@ "outputs": [ { "name": "str", + "localized_name": "str", "type": "STRING", "links": [ 206 @@ -926,6 +784,208 @@ "a person looking like Shrek talking", 256 ] + }, + { + "id": 83, + "type": "RandomNoise", + "pos": [ + 453.44482421875, + 47.46747970581055 + ], + "size": [ + 315, + 82 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "NOISE", + "localized_name": "NOISE", + "type": "NOISE", + "links": [ + 194 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "RandomNoise", + "cnr_id": "comfy-core", + "ver": "0.3.28" + }, + "widgets_values": [ + 42, + "fixed" + ] + }, + { + "id": 69, + "type": "LTXVConditioning", + "pos": [ + 885.63818359375, + 226.95408630371094 + ], + "size": [ + 223.8660125732422, + 78 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "link": 183 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "link": 184 + } + ], + "outputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "links": [ + 221 + ], + "slot_index": 0 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "links": [ + 222 + ], + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "LTXVConditioning", + "cnr_id": "comfy-core", + "ver": "0.3.28" + }, + "widgets_values": [ + 25 + ] + }, + { + "id": 44, + "type": "CheckpointLoaderSimple", + "pos": [ + 82.3931884765625, + -72.30274200439453 + ], + "size": [ + 315, + 98 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "localized_name": "MODEL", + "type": "MODEL", + "links": [ + 223 + ], + "slot_index": 0 + }, + { + "name": "CLIP", + "localized_name": "CLIP", + "type": "CLIP", + "links": null + }, + { + "name": "VAE", + "localized_name": "VAE", + "type": "VAE", + "links": [ + 212, + 213 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple", + "cnr_id": "comfy-core", + "ver": "0.3.28" + }, + "widgets_values": [ + "ltxv-2b-0.9.6-dev-04-25.safetensors" + ] + }, + { + "id": 92, + "type": "STGGuiderAdvanced", + "pos": [ + 825.4796142578125, + -92.4762191772461 + ], + "size": [ + 327.5999755859375, + 242 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "model", + "localized_name": "model", + "type": "MODEL", + "link": 223 + }, + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "link": 221 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "link": 222 + } + ], + "outputs": [ + { + "name": "GUIDER", + "localized_name": "GUIDER", + "type": "GUIDER", + "links": [ + 224 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "STGGuiderAdvanced" + }, + "widgets_values": [ + 0.996, + true, + "1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180", + "4, 4, 4, 4, 1, 1", + "2, 2, 2, 2, 1, 0", + "1, 1, 1, 1, 1, 1", + "[14], [14], [14], [14], [14], [14]" + ] } ], "links": [ @@ -985,14 +1045,6 @@ 1, "CONDITIONING" ], - [ - 191, - 44, - 0, - 79, - 0, - "MODEL" - ], [ 194, 83, @@ -1001,14 +1053,6 @@ 0, "NOISE" ], - [ - 195, - 79, - 0, - 82, - 0, - "MODEL" - ], [ 196, 73, @@ -1041,30 +1085,6 @@ 0, "LATENT" ], - [ - 200, - 82, - 0, - 81, - 1, - "GUIDER" - ], - [ - 201, - 69, - 0, - 82, - 1, - "CONDITIONING" - ], - [ - 202, - 69, - 1, - 82, - 2, - "CONDITIONING" - ], [ 204, 84, @@ -1136,20 +1156,52 @@ 84, 0, "IMAGE" + ], + [ + 221, + 69, + 0, + 92, + 1, + "CONDITIONING" + ], + [ + 222, + 69, + 1, + 92, + 2, + "CONDITIONING" + ], + [ + 223, + 44, + 0, + 92, + 0, + "MODEL" + ], + [ + 224, + 92, + 0, + 81, + 1, + "GUIDER" ] ], "groups": [], "config": {}, "extra": { "ds": { - "scale": 0.6538676505623292, + "scale": 0.6303940863128502, "offset": [ - 400.85067622291626, - 9.013459685364836 + 471.01810112868446, + 215.44620489151183 ] }, "node_versions": { - "comfy-core": "0.3.18" + "comfy-core": "0.3.27" }, "prompt": { "6": { @@ -1210,7 +1262,7 @@ }, "44": { "inputs": { - "ckpt_name": "ltx-video-2b-v0.9.5.safetensors" + "ckpt_name": "ltxv-2b-0.9.6-dev-04-25.safetensors" }, "class_type": "CheckpointLoaderSimple", "_meta": { @@ -1266,6 +1318,7 @@ "height": 512, "length": 97, "batch_size": 1, + "strength": 1, "positive": [ "6", 0 @@ -1298,19 +1351,6 @@ "title": "Load Image" } }, - "79": { - "inputs": { - "block_indices": "14", - "model": [ - "44", - 0 - ] - }, - "class_type": "LTXVApplySTG", - "_meta": { - "title": "🅛🅣🅧 LTXV Apply STG" - } - }, "81": { "inputs": { "noise": [ @@ -1318,7 +1358,7 @@ 0 ], "guider": [ - "82", + "92", 0 ], "sampler": [ @@ -1339,29 +1379,6 @@ "title": "SamplerCustomAdvanced" } }, - "82": { - "inputs": { - "cfg": 3, - "stg": 1, - "rescale": 0.75, - "model": [ - "79", - 0 - ], - "positive": [ - "69", - 0 - ], - "negative": [ - "69", - 1 - ] - }, - "class_type": "STGGuider", - "_meta": { - "title": "🅛🅣🅧 STG Guider" - } - }, "83": { "inputs": { "noise_seed": 42 @@ -1450,9 +1467,36 @@ "_meta": { "title": "Resize Image" } + }, + "92": { + "inputs": { + "skip_steps_sigma_threshold": 0.996, + "cfg_star_rescale": true, + "sigmas": "1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180", + "cfg_values": "4, 4, 4, 4, 1, 1", + "stg_scale_values": "2, 2, 2, 2, 1, 0", + "stg_rescale_values": "1, 1, 1, 1, 1, 1", + "stg_layers_indices": "[14], [14], [14], [14], [14], [14]", + "model": [ + "44", + 0 + ], + "positive": [ + "69", + 0 + ], + "negative": [ + "69", + 1 + ] + }, + "class_type": "STGGuiderAdvanced", + "_meta": { + "title": "🅛🅣🅧 STG Guider Advanced" + } } }, - "comfy_fork_version": "update_nodes@db0f122d" + "comfy_fork_version": "feature/memory_prof@f7e64946" }, "version": 0.4 } diff --git a/assets/ltxvideo-i2v.png b/assets/ltxvideo-i2v.png index 5ce64b0..f2e46d1 100644 --- a/assets/ltxvideo-i2v.png +++ b/assets/ltxvideo-i2v.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3e29e3b630ab07c3404e715dd0f5d62ebdb4ef24af4279239e546f2a401824a3 -size 1167784 +oid sha256:5cb7cbf30c7ad19dda71322c40e7a471697350b6ec6b17c8ab14654dad18b909 +size 1142742 diff --git a/assets/ltxvideo-last-sequence-conditioning.json b/assets/ltxvideo-last-sequence-conditioning.json index ced29ae..4b895b7 100644 --- a/assets/ltxvideo-last-sequence-conditioning.json +++ b/assets/ltxvideo-last-sequence-conditioning.json @@ -1,57 +1,7 @@ { - "last_node_id": 212, - "last_link_id": 579, + "last_node_id": 213, + "last_link_id": 584, "nodes": [ - { - "id": 191, - "type": "STGGuider", - "pos": [ - 1216.2901611328125, - -1.7041345834732056 - ], - "size": [ - 389.04827880859375, - 171.58651733398438 - ], - "flags": {}, - "order": 19, - "mode": 0, - "inputs": [ - { - "name": "model", - "type": "MODEL", - "link": 516 - }, - { - "name": "positive", - "type": "CONDITIONING", - "link": 561 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 562 - } - ], - "outputs": [ - { - "name": "GUIDER", - "type": "GUIDER", - "links": [ - 544 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "STGGuider" - }, - "widgets_values": [ - 3.5, - 1, - 0.75 - ] - }, { "id": 71, "type": "LTXVScheduler", @@ -64,11 +14,12 @@ 154 ], "flags": {}, - "order": 20, + "order": 19, "mode": 0, "inputs": [ { "name": "latent", + "localized_name": "latent", "type": "LATENT", "shape": 7, "link": 564 @@ -77,6 +28,7 @@ "outputs": [ { "name": "SIGMAS", + "localized_name": "SIGMAS", "type": "SIGMAS", "links": [ 542 @@ -95,76 +47,6 @@ 0.1 ] }, - { - "id": 188, - "type": "LTXVApplySTG", - "pos": [ - 77.9090805053711, - -126.5878677368164 - ], - "size": [ - 315, - 58 - ], - "flags": {}, - "order": 8, - "mode": 0, - "inputs": [ - { - "name": "model", - "type": "MODEL", - "link": 508 - } - ], - "outputs": [ - { - "name": "model", - "type": "MODEL", - "links": [ - 516 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "LTXVApplySTG" - }, - "widgets_values": [ - "14" - ] - }, - { - "id": 73, - "type": "KSamplerSelect", - "pos": [ - 471.1808166503906, - -136.36605834960938 - ], - "size": [ - 315, - 58 - ], - "flags": {}, - "order": 0, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "SAMPLER", - "type": "SAMPLER", - "links": [ - 541 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "KSamplerSelect" - }, - "widgets_values": [ - "gradient_estimation" - ] - }, { "id": 69, "type": "LTXVConditioning", @@ -177,16 +59,18 @@ 78 ], "flags": {}, - "order": 17, + "order": 16, "mode": 0, "inputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "link": 266 }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "link": 267 } @@ -194,6 +78,7 @@ "outputs": [ { "name": "positive", + "localized_name": "positive", "type": "CONDITIONING", "links": [ 556 @@ -202,6 +87,7 @@ }, { "name": "negative", + "localized_name": "negative", "type": "CONDITIONING", "links": [ 557 @@ -216,52 +102,6 @@ 25 ] }, - { - "id": 44, - "type": "CheckpointLoaderSimple", - "pos": [ - -301.724853515625, - -148.44154357910156 - ], - "size": [ - 315, - 98 - ], - "flags": {}, - "order": 1, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "MODEL", - "type": "MODEL", - "links": [ - 508 - ], - "slot_index": 0 - }, - { - "name": "CLIP", - "type": "CLIP", - "links": null - }, - { - "name": "VAE", - "type": "VAE", - "links": [ - 565, - 566 - ], - "slot_index": 2 - } - ], - "properties": { - "Node name for S&R": "CheckpointLoaderSimple" - }, - "widgets_values": [ - "ltx-video-2b-v0.9.5.safetensors" - ] - }, { "id": 199, "type": "LTXVPromptEnhancerLoader", @@ -274,12 +114,13 @@ 82 ], "flags": {}, - "order": 2, + "order": 0, "mode": 0, "inputs": [], "outputs": [ { "name": "prompt_enhancer", + "localized_name": "prompt_enhancer", "type": "LTXV_PROMPT_ENHANCER", "links": [ 538 @@ -304,15 +145,16 @@ ], "size": [ 315, - 82 + 98 ], "flags": {}, - "order": 3, + "order": 1, "mode": 0, "inputs": [], "outputs": [ { "name": "CLIP", + "localized_name": "CLIP", "type": "CLIP", "links": [ 74, @@ -344,11 +186,12 @@ "flags": { "collapsed": true }, - "order": 14, + "order": 13, "mode": 0, "inputs": [ { "name": "clip", + "localized_name": "clip", "type": "CLIP", "link": 74 }, @@ -364,6 +207,7 @@ "outputs": [ { "name": "CONDITIONING", + "localized_name": "CONDITIONING", "type": "CONDITIONING", "links": [ 266 @@ -395,11 +239,12 @@ "flags": { "collapsed": true }, - "order": 9, + "order": 8, "mode": 0, "inputs": [ { "name": "clip", + "localized_name": "clip", "type": "CLIP", "link": 75 } @@ -407,6 +252,7 @@ "outputs": [ { "name": "CONDITIONING", + "localized_name": "CONDITIONING", "type": "CONDITIONING", "links": [ 267 @@ -436,16 +282,18 @@ 102 ], "flags": {}, - "order": 10, + "order": 9, "mode": 0, "inputs": [ { "name": "prompt_enhancer", + "localized_name": "prompt_enhancer", "type": "LTXV_PROMPT_ENHANCER", "link": 538 }, { "name": "image_prompt", + "localized_name": "image_prompt", "type": "IMAGE", "shape": 7, "link": 523 @@ -454,6 +302,7 @@ "outputs": [ { "name": "str", + "localized_name": "str", "type": "STRING", "links": [ 507 @@ -481,11 +330,12 @@ 86 ], "flags": {}, - "order": 13, + "order": 12, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 567 } @@ -493,11 +343,13 @@ "outputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "links": null }, { - "name": "768 width", + "name": "width", + "localized_name": "width", "type": "INT", "links": [ 568 @@ -505,7 +357,8 @@ "slot_index": 1 }, { - "name": "512 height", + "name": "height", + "localized_name": "height", "type": "INT", "links": [ 569 @@ -513,7 +366,8 @@ "slot_index": 2 }, { - "name": "65 count", + "name": "count", + "localized_name": "count", "type": "INT", "links": [ 570 @@ -535,15 +389,19 @@ ], "size": [ 315, - 130 + 170 ], "flags": {}, - "order": 16, + "order": 15, "mode": 0, "inputs": [ { "name": "width", "type": "INT", + "pos": [ + 10, + 36 + ], "widget": { "name": "width" }, @@ -552,6 +410,10 @@ { "name": "height", "type": "INT", + "pos": [ + 10, + 60 + ], "widget": { "name": "height" }, @@ -560,6 +422,10 @@ { "name": "length", "type": "INT", + "pos": [ + 10, + 84 + ], "widget": { "name": "length" }, @@ -569,6 +435,7 @@ "outputs": [ { "name": "LATENT", + "localized_name": "LATENT", "type": "LATENT", "links": [ 558 @@ -598,11 +465,12 @@ 58 ], "flags": {}, - "order": 15, + "order": 14, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 571 } @@ -610,6 +478,7 @@ "outputs": [ { "name": "output_image", + "localized_name": "output_image", "type": "IMAGE", "links": [ 572 @@ -636,7 +505,7 @@ 93.54439544677734 ], "flags": {}, - "order": 4, + "order": 2, "mode": 0, "inputs": [], "outputs": [], @@ -647,79 +516,6 @@ "color": "#432", "bgcolor": "#653" }, - { - "id": 195, - "type": "VHS_VideoCombine", - "pos": [ - 2006.0511474609375, - 61.66352081298828 - ], - "size": [ - 315, - 352 - ], - "flags": {}, - "order": 25, - "mode": 0, - "inputs": [ - { - "name": "images", - "type": "IMAGE", - "shape": 7, - "link": 530 - }, - { - "name": "audio", - "type": "AUDIO", - "shape": 7, - "link": null - }, - { - "name": "meta_batch", - "type": "VHS_BatchManager", - "shape": 7, - "link": null - }, - { - "name": "vae", - "type": "VAE", - "shape": 7, - "link": null - } - ], - "outputs": [ - { - "name": "Filenames", - "type": "VHS_FILENAMES", - "links": null - } - ], - "properties": { - "Node name for S&R": "VHS_VideoCombine" - }, - "widgets_values": { - "frame_rate": 25, - "loop_count": 0, - "filename_prefix": "ltxv", - "format": "video/h264-mp4", - "pix_fmt": "yuv420p", - "crf": 19, - "save_metadata": true, - "pingpong": false, - "save_output": true, - "videopreview": { - "hidden": false, - "paused": false, - "params": { - "filename": "ltxv_00114.mp4", - "subfolder": "", - "type": "output", - "format": "video/h264-mp4", - "frame_rate": 25 - } - } - } - }, { "id": 200, "type": "SamplerCustomAdvanced", @@ -732,31 +528,36 @@ 106 ], "flags": {}, - "order": 21, + "order": 20, "mode": 0, "inputs": [ { "name": "noise", + "localized_name": "noise", "type": "NOISE", "link": 540 }, { "name": "guider", + "localized_name": "guider", "type": "GUIDER", - "link": 544 + "link": 584 }, { "name": "sampler", + "localized_name": "sampler", "type": "SAMPLER", "link": 541 }, { "name": "sigmas", + "localized_name": "sigmas", "type": "SIGMAS", "link": 542 }, { "name": "latent_image", + "localized_name": "latent_image", "type": "LATENT", "link": 563 } @@ -764,6 +565,7 @@ "outputs": [ { "name": "output", + "localized_name": "output", "type": "LATENT", "links": [ 578 @@ -772,6 +574,7 @@ }, { "name": "denoised_output", + "localized_name": "denoised_output", "type": "LATENT", "links": null } @@ -781,144 +584,6 @@ }, "widgets_values": [] }, - { - "id": 212, - "type": "LTXVCropGuides", - "pos": [ - 1656.453369140625, - 31.322202682495117 - ], - "size": [ - 216.59999084472656, - 66 - ], - "flags": {}, - "order": 22, - "mode": 0, - "inputs": [ - { - "name": "positive", - "type": "CONDITIONING", - "link": 576 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 577 - }, - { - "name": "latent", - "type": "LATENT", - "link": 578 - } - ], - "outputs": [ - { - "name": "positive", - "type": "CONDITIONING", - "links": null - }, - { - "name": "negative", - "type": "CONDITIONING", - "links": null - }, - { - "name": "latent", - "type": "LATENT", - "links": [ - 579 - ], - "slot_index": 2 - } - ], - "properties": { - "Node name for S&R": "LTXVCropGuides" - }, - "widgets_values": [] - }, - { - "id": 8, - "type": "VAEDecode", - "pos": [ - 1660.500244140625, - 168.7158966064453 - ], - "size": [ - 210, - 46 - ], - "flags": {}, - "order": 23, - "mode": 0, - "inputs": [ - { - "name": "samples", - "type": "LATENT", - "link": 579 - }, - { - "name": "vae", - "type": "VAE", - "link": 565 - } - ], - "outputs": [ - { - "name": "IMAGE", - "type": "IMAGE", - "links": [ - 575 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "VAEDecode" - }, - "widgets_values": [] - }, - { - "id": 193, - "type": "ImageBatch", - "pos": [ - 1667.016845703125, - 302.3862609863281 - ], - "size": [ - 210, - 46 - ], - "flags": {}, - "order": 24, - "mode": 0, - "inputs": [ - { - "name": "image1", - "type": "IMAGE", - "link": 575 - }, - { - "name": "image2", - "type": "IMAGE", - "link": 574 - } - ], - "outputs": [ - { - "name": "IMAGE", - "type": "IMAGE", - "links": [ - 530 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "ImageBatch" - }, - "widgets_values": [] - }, { "id": 192, "type": "VHS_SelectImages", @@ -931,11 +596,12 @@ 106 ], "flags": {}, - "order": 11, + "order": 10, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 525 } @@ -943,6 +609,7 @@ "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 571 @@ -971,11 +638,12 @@ 106 ], "flags": {}, - "order": 12, + "order": 11, "mode": 0, "inputs": [ { "name": "image", + "localized_name": "image", "type": "IMAGE", "link": 527 } @@ -983,6 +651,7 @@ "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 574 @@ -999,117 +668,6 @@ "err_if_empty": true } }, - { - "id": 206, - "type": "LTXVAddGuide", - "pos": [ - 831.139404296875, - 10.611289978027344 - ], - "size": [ - 315, - 162 - ], - "flags": {}, - "order": 18, - "mode": 0, - "inputs": [ - { - "name": "positive", - "type": "CONDITIONING", - "link": 556 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 557 - }, - { - "name": "vae", - "type": "VAE", - "link": 566 - }, - { - "name": "latent", - "type": "LATENT", - "link": 558 - }, - { - "name": "image", - "type": "IMAGE", - "link": 572 - } - ], - "outputs": [ - { - "name": "positive", - "type": "CONDITIONING", - "links": [ - 561, - 576 - ], - "slot_index": 0 - }, - { - "name": "negative", - "type": "CONDITIONING", - "links": [ - 562, - 577 - ], - "slot_index": 1 - }, - { - "name": "latent", - "type": "LATENT", - "links": [ - 563, - 564 - ], - "slot_index": 2 - } - ], - "properties": { - "Node name for S&R": "LTXVAddGuide" - }, - "widgets_values": [ - -9, - 1 - ] - }, - { - "id": 190, - "type": "RandomNoise", - "pos": [ - 831.1925048828125, - -140.77906799316406 - ], - "size": [ - 315, - 82 - ], - "flags": {}, - "order": 5, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "NOISE", - "type": "NOISE", - "links": [ - 540 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "RandomNoise" - }, - "widgets_values": [ - 43, - "fixed" - ] - }, { "id": 208, "type": "Note", @@ -1122,7 +680,7 @@ 93.54439544677734 ], "flags": {}, - "order": 6, + "order": 3, "mode": 0, "inputs": [], "outputs": [], @@ -1145,17 +703,19 @@ 422.55194091796875 ], "flags": {}, - "order": 7, + "order": 4, "mode": 0, "inputs": [ { "name": "meta_batch", + "localized_name": "meta_batch", "type": "VHS_BatchManager", "shape": 7, "link": null }, { "name": "vae", + "localized_name": "vae", "type": "VAE", "shape": 7, "link": null @@ -1164,6 +724,7 @@ "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 523, @@ -1175,16 +736,19 @@ }, { "name": "frame_count", + "localized_name": "frame_count", "type": "INT", "links": null }, { "name": "audio", + "localized_name": "audio", "type": "AUDIO", "links": null }, { "name": "video_info", + "localized_name": "video_info", "type": "VHS_VIDEOINFO", "links": null } @@ -1216,6 +780,494 @@ } } } + }, + { + "id": 73, + "type": "KSamplerSelect", + "pos": [ + 839.142333984375, + 511.1702575683594 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "SAMPLER", + "localized_name": "SAMPLER", + "type": "SAMPLER", + "links": [ + 541 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSamplerSelect" + }, + "widgets_values": [ + "gradient_estimation" + ] + }, + { + "id": 206, + "type": "LTXVAddGuide", + "pos": [ + 831.139404296875, + 10.611289978027344 + ], + "size": [ + 315, + 162 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "link": 556 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "link": 557 + }, + { + "name": "vae", + "localized_name": "vae", + "type": "VAE", + "link": 566 + }, + { + "name": "latent", + "localized_name": "latent", + "type": "LATENT", + "link": 558 + }, + { + "name": "image", + "localized_name": "image", + "type": "IMAGE", + "link": 572 + } + ], + "outputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "links": [ + 576, + 581 + ], + "slot_index": 0 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "links": [ + 577, + 582 + ], + "slot_index": 1 + }, + { + "name": "latent", + "localized_name": "latent", + "type": "LATENT", + "links": [ + 563, + 564 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "LTXVAddGuide" + }, + "widgets_values": [ + -9, + 1 + ] + }, + { + "id": 44, + "type": "CheckpointLoaderSimple", + "pos": [ + -301.724853515625, + -148.44154357910156 + ], + "size": [ + 315, + 98 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "localized_name": "MODEL", + "type": "MODEL", + "links": [ + 583 + ], + "slot_index": 0 + }, + { + "name": "CLIP", + "localized_name": "CLIP", + "type": "CLIP", + "links": null + }, + { + "name": "VAE", + "localized_name": "VAE", + "type": "VAE", + "links": [ + 565, + 566 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "ltxv-2b-0.9.6-dev-04-25.safetensors" + ] + }, + { + "id": 213, + "type": "STGGuiderAdvanced", + "pos": [ + 1207.9185791015625, + -48.71029281616211 + ], + "size": [ + 327.5999755859375, + 242 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "model", + "localized_name": "model", + "type": "MODEL", + "link": 583 + }, + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "link": 581 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "link": 582 + } + ], + "outputs": [ + { + "name": "GUIDER", + "localized_name": "GUIDER", + "type": "GUIDER", + "links": [ + 584 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "STGGuiderAdvanced" + }, + "widgets_values": [ + 0.996, + true, + "1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180", + "4, 4, 4, 4, 1, 1", + "2, 2, 2, 2, 1, 0", + "1, 1, 1, 1, 1, 1", + "[14], [14], [14], [14], [14], [14]" + ] + }, + { + "id": 212, + "type": "LTXVCropGuides", + "pos": [ + 1632.5416259765625, + -108.9360580444336 + ], + "size": [ + 216.59999084472656, + 66 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "link": 576 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "link": 577 + }, + { + "name": "latent", + "localized_name": "latent", + "type": "LATENT", + "link": 578 + } + ], + "outputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "links": null + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "links": null + }, + { + "name": "latent", + "localized_name": "latent", + "type": "LATENT", + "links": [ + 579 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "LTXVCropGuides" + }, + "widgets_values": [] + }, + { + "id": 8, + "type": "VAEDecode", + "pos": [ + 1632.39990234375, + 21.121004104614258 + ], + "size": [ + 210, + 46 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "samples", + "localized_name": "samples", + "type": "LATENT", + "link": 579 + }, + { + "name": "vae", + "localized_name": "vae", + "type": "VAE", + "link": 565 + } + ], + "outputs": [ + { + "name": "IMAGE", + "localized_name": "IMAGE", + "type": "IMAGE", + "links": [ + 575 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 193, + "type": "ImageBatch", + "pos": [ + 1633.234130859375, + 133.8223419189453 + ], + "size": [ + 210, + 46 + ], + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "image1", + "localized_name": "image1", + "type": "IMAGE", + "link": 575 + }, + { + "name": "image2", + "localized_name": "image2", + "type": "IMAGE", + "link": 574 + } + ], + "outputs": [ + { + "name": "IMAGE", + "localized_name": "IMAGE", + "type": "IMAGE", + "links": [ + 530 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageBatch" + }, + "widgets_values": [] + }, + { + "id": 195, + "type": "VHS_VideoCombine", + "pos": [ + 1635.779052734375, + 243.89697265625 + ], + "size": [ + 315, + 520.6666870117188 + ], + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "images", + "localized_name": "images", + "type": "IMAGE", + "shape": 7, + "link": 530 + }, + { + "name": "audio", + "localized_name": "audio", + "type": "AUDIO", + "shape": 7, + "link": null + }, + { + "name": "meta_batch", + "localized_name": "meta_batch", + "type": "VHS_BatchManager", + "shape": 7, + "link": null + }, + { + "name": "vae", + "localized_name": "vae", + "type": "VAE", + "shape": 7, + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "localized_name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "Node name for S&R": "VHS_VideoCombine" + }, + "widgets_values": { + "frame_rate": 25, + "loop_count": 0, + "filename_prefix": "ltxv", + "format": "video/h264-mp4", + "pix_fmt": "yuv420p", + "crf": 19, + "save_metadata": true, + "pingpong": false, + "save_output": true, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "ltxv_00124.mp4", + "subfolder": "", + "type": "output", + "format": "video/h264-mp4", + "frame_rate": 25 + } + } + } + }, + { + "id": 190, + "type": "RandomNoise", + "pos": [ + 831.1925048828125, + -140.77906799316406 + ], + "size": [ + 315, + 82 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "NOISE", + "localized_name": "NOISE", + "type": "NOISE", + "links": [ + 540 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "RandomNoise" + }, + "widgets_values": [ + 42, + "fixed" + ] } ], "links": [ @@ -1259,22 +1311,6 @@ 1, "STRING" ], - [ - 508, - 44, - 0, - 188, - 0, - "MODEL" - ], - [ - 516, - 188, - 0, - 191, - 0, - "MODEL" - ], [ 523, 134, @@ -1339,14 +1375,6 @@ 3, "SIGMAS" ], - [ - 544, - 191, - 0, - 200, - 1, - "GUIDER" - ], [ 556, 69, @@ -1371,22 +1399,6 @@ 3, "LATENT" ], - [ - 561, - 206, - 0, - 191, - 1, - "CONDITIONING" - ], - [ - 562, - 206, - 1, - 191, - 2, - "CONDITIONING" - ], [ 563, 206, @@ -1514,16 +1526,48 @@ 8, 0, "LATENT" + ], + [ + 581, + 206, + 0, + 213, + 1, + "CONDITIONING" + ], + [ + 582, + 206, + 1, + 213, + 2, + "CONDITIONING" + ], + [ + 583, + 44, + 0, + 213, + 0, + "MODEL" + ], + [ + 584, + 213, + 0, + 200, + 1, + "GUIDER" ] ], "groups": [], "config": {}, "extra": { "ds": { - "scale": 0.7117163576202091, + "scale": 0.6303940863128502, "offset": [ - 500.3176701951572, - 447.6564128377701 + 544.9425929851524, + 236.16737008581478 ] }, "prompt": { @@ -1585,7 +1629,7 @@ }, "44": { "inputs": { - "ckpt_name": "ltx-video-2b-v0.9.5.safetensors" + "ckpt_name": "ltxv-2b-0.9.6-dev-04-25.safetensors" }, "class_type": "CheckpointLoaderSimple", "_meta": { @@ -1690,51 +1734,15 @@ "title": "🅛🅣🅧 LTXV Prompt Enhancer" } }, - "188": { - "inputs": { - "block_indices": "14", - "model": [ - "44", - 0 - ] - }, - "class_type": "LTXVApplySTG", - "_meta": { - "title": "🅛🅣🅧 LTXV Apply STG" - } - }, "190": { "inputs": { - "noise_seed": 43 + "noise_seed": 42 }, "class_type": "RandomNoise", "_meta": { "title": "RandomNoise" } }, - "191": { - "inputs": { - "cfg": 3.5, - "stg": 1, - "rescale": 0.75, - "model": [ - "188", - 0 - ], - "positive": [ - "206", - 0 - ], - "negative": [ - "206", - 1 - ] - }, - "class_type": "STGGuider", - "_meta": { - "title": "🅛🅣🅧 STG Guider" - } - }, "192": { "inputs": { "indexes": ":9", @@ -1819,7 +1827,7 @@ 0 ], "guider": [ - "191", + "213", 0 ], "sampler": [ @@ -1914,11 +1922,38 @@ "_meta": { "title": "LTXVCropGuides" } + }, + "213": { + "inputs": { + "skip_steps_sigma_threshold": 0.996, + "cfg_star_rescale": true, + "sigmas": "1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180", + "cfg_values": "4, 4, 4, 4, 1, 1", + "stg_scale_values": "2, 2, 2, 2, 1, 0", + "stg_rescale_values": "1, 1, 1, 1, 1, 1", + "stg_layers_indices": "[14], [14], [14], [14], [14], [14]", + "model": [ + "44", + 0 + ], + "positive": [ + "206", + 0 + ], + "negative": [ + "206", + 1 + ] + }, + "class_type": "STGGuiderAdvanced", + "_meta": { + "title": "🅛🅣🅧 STG Guider Advanced" + } } }, - "comfy_fork_version": "HEAD@e7bd1751", + "comfy_fork_version": "feature/memory_prof@f7e64946", "node_versions": { - "comfy-core": "0.3.18" + "comfy-core": "0.3.27" } }, "version": 0.4 diff --git a/assets/ltxvideo-last-sequence-conditioning.png b/assets/ltxvideo-last-sequence-conditioning.png index 68fb24b..a5b92b9 100644 --- a/assets/ltxvideo-last-sequence-conditioning.png +++ b/assets/ltxvideo-last-sequence-conditioning.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7ba0a0ab34867f35268823c6ef8ca4cd8067cd6484e0c6f5b1277c9778bb243e -size 1379716 +oid sha256:006feae06d8679de9175eae516bf0919b273745859bb045b3d229329a34084fb +size 1160850 diff --git a/assets/ltxvideo-t2v.json b/assets/ltxvideo-t2v.json index bc48def..6658ecf 100644 --- a/assets/ltxvideo-t2v.json +++ b/assets/ltxvideo-t2v.json @@ -1,119 +1,7 @@ { - "last_node_id": 88, - "last_link_id": 212, + "last_node_id": 90, + "last_link_id": 220, "nodes": [ - { - "id": 81, - "type": "SamplerCustomAdvanced", - "pos": [ - 1199.310302734375, - 17.57975959777832 - ], - "size": [ - 355.20001220703125, - 106 - ], - "flags": {}, - "order": 13, - "mode": 0, - "inputs": [ - { - "name": "noise", - "type": "NOISE", - "link": 194 - }, - { - "name": "guider", - "type": "GUIDER", - "link": 200 - }, - { - "name": "sampler", - "type": "SAMPLER", - "link": 196 - }, - { - "name": "sigmas", - "type": "SIGMAS", - "link": 197 - }, - { - "name": "latent_image", - "type": "LATENT", - "link": 205 - } - ], - "outputs": [ - { - "name": "output", - "type": "LATENT", - "links": [ - 199 - ], - "slot_index": 0 - }, - { - "name": "denoised_output", - "type": "LATENT", - "links": null - } - ], - "properties": { - "Node name for S&R": "SamplerCustomAdvanced" - }, - "widgets_values": [] - }, - { - "id": 69, - "type": "LTXVConditioning", - "pos": [ - 900.875, - 273.27288818359375 - ], - "size": [ - 223.8660125732422, - 78 - ], - "flags": {}, - "order": 11, - "mode": 0, - "inputs": [ - { - "name": "positive", - "type": "CONDITIONING", - "link": 203 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 204 - } - ], - "outputs": [ - { - "name": "positive", - "type": "CONDITIONING", - "links": [ - 201 - ], - "slot_index": 0 - }, - { - "name": "negative", - "type": "CONDITIONING", - "links": [ - 202 - ], - "slot_index": 1 - } - ], - "properties": { - "Node name for S&R": "LTXVConditioning" - }, - "widgets_values": [ - 25 - ] - }, { "id": 6, "type": "CLIPTextEncode", @@ -123,16 +11,17 @@ ], "size": [ 295.2641296386719, - 54 + 78 ], "flags": { "collapsed": true }, - "order": 10, + "order": 9, "mode": 0, "inputs": [ { "name": "clip", + "localized_name": "clip", "type": "CLIP", "link": 74 }, @@ -148,6 +37,7 @@ "outputs": [ { "name": "CONDITIONING", + "localized_name": "CONDITIONING", "type": "CONDITIONING", "links": [ 203 @@ -157,7 +47,9 @@ ], "title": "CLIP Text Encode (Positive Prompt)", "properties": { - "Node name for S&R": "CLIPTextEncode" + "Node name for S&R": "CLIPTextEncode", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ "" @@ -179,11 +71,12 @@ "flags": { "collapsed": true }, - "order": 9, + "order": 8, "mode": 0, "inputs": [ { "name": "clip", + "localized_name": "clip", "type": "CLIP", "link": 75 } @@ -191,6 +84,7 @@ "outputs": [ { "name": "CONDITIONING", + "localized_name": "CONDITIONING", "type": "CONDITIONING", "links": [ 204 @@ -200,7 +94,9 @@ ], "title": "CLIP Text Encode (Negative Prompt)", "properties": { - "Node name for S&R": "CLIPTextEncode" + "Node name for S&R": "CLIPTextEncode", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ "low quality, worst quality, deformed, distorted, disfigured, motion smear, motion artifacts, fused fingers, bad anatomy, weird hand, ugly" @@ -226,6 +122,7 @@ "outputs": [ { "name": "prompt_enhancer", + "localized_name": "prompt_enhancer", "type": "LTXV_PROMPT_ENHANCER", "links": [ 206 @@ -241,88 +138,6 @@ "MiaoshouAI/Florence-2-large-PromptGen-v2.0" ] }, - { - "id": 82, - "type": "STGGuider", - "pos": [ - 844.2092895507812, - 72.4302978515625 - ], - "size": [ - 315, - 146 - ], - "flags": {}, - "order": 12, - "mode": 0, - "inputs": [ - { - "name": "model", - "type": "MODEL", - "link": 195 - }, - { - "name": "positive", - "type": "CONDITIONING", - "link": 201 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 202 - } - ], - "outputs": [ - { - "name": "GUIDER", - "type": "GUIDER", - "links": [ - 200 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "STGGuider" - }, - "widgets_values": [ - 3, - 1, - 0.75 - ] - }, - { - "id": 73, - "type": "KSamplerSelect", - "pos": [ - 853.5048828125, - -61.43290328979492 - ], - "size": [ - 315, - 58 - ], - "flags": {}, - "order": 1, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "SAMPLER", - "type": "SAMPLER", - "links": [ - 196 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "KSamplerSelect" - }, - "widgets_values": [ - "gradient_estimation" - ] - }, { "id": 84, "type": "EmptyLTXVLatentVideo", @@ -335,12 +150,13 @@ 130 ], "flags": {}, - "order": 2, + "order": 1, "mode": 0, "inputs": [], "outputs": [ { "name": "LATENT", + "localized_name": "LATENT", "type": "LATENT", "links": [ 205, @@ -350,7 +166,9 @@ } ], "properties": { - "Node name for S&R": "EmptyLTXVLatentVideo" + "Node name for S&R": "EmptyLTXVLatentVideo", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ 768, @@ -359,177 +177,6 @@ 1 ] }, - { - "id": 79, - "type": "LTXVApplySTG", - "pos": [ - 456.1823425292969, - 77.06049346923828 - ], - "size": [ - 315, - 58 - ], - "flags": {}, - "order": 8, - "mode": 0, - "inputs": [ - { - "name": "model", - "type": "MODEL", - "link": 191 - } - ], - "outputs": [ - { - "name": "model", - "type": "MODEL", - "links": [ - 195 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "LTXVApplySTG" - }, - "widgets_values": [ - "14" - ] - }, - { - "id": 71, - "type": "LTXVScheduler", - "pos": [ - 1215.2900390625, - 217.12747192382812 - ], - "size": [ - 315, - 154 - ], - "flags": {}, - "order": 7, - "mode": 0, - "inputs": [ - { - "name": "latent", - "type": "LATENT", - "shape": 7, - "link": 210 - } - ], - "outputs": [ - { - "name": "SIGMAS", - "type": "SIGMAS", - "links": [ - 197 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "LTXVScheduler" - }, - "widgets_values": [ - 20, - 2.05, - 0.95, - true, - 0.1 - ] - }, - { - "id": 86, - "type": "LTXVPromptEnhancer", - "pos": [ - 447.4213562011719, - 346.47674560546875 - ], - "size": [ - 335.70489501953125, - 124.35137939453125 - ], - "flags": {}, - "order": 6, - "mode": 0, - "inputs": [ - { - "name": "prompt_enhancer", - "type": "LTXV_PROMPT_ENHANCER", - "link": 206 - }, - { - "name": "image_prompt", - "type": "IMAGE", - "shape": 7, - "link": null - } - ], - "outputs": [ - { - "name": "str", - "type": "STRING", - "links": [ - 207 - ], - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "LTXVPromptEnhancer" - }, - "widgets_values": [ - "dog", - 256 - ] - }, - { - "id": 44, - "type": "CheckpointLoaderSimple", - "pos": [ - 93.61398315429688, - -66.24134063720703 - ], - "size": [ - 315, - 98 - ], - "flags": {}, - "order": 3, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "MODEL", - "type": "MODEL", - "links": [ - 191 - ], - "slot_index": 0 - }, - { - "name": "CLIP", - "type": "CLIP", - "links": null - }, - { - "name": "VAE", - "type": "VAE", - "links": [ - 211 - ], - "slot_index": 2 - } - ], - "properties": { - "Node name for S&R": "CheckpointLoaderSimple" - }, - "widgets_values": [ - "ltx-video-2b-v0.9.5.safetensors" - ] - }, { "id": 38, "type": "CLIPLoader", @@ -539,15 +186,16 @@ ], "size": [ 315, - 82 + 106 ], "flags": {}, - "order": 4, + "order": 2, "mode": 0, "inputs": [], "outputs": [ { "name": "CLIP", + "localized_name": "CLIP", "type": "CLIP", "links": [ 74, @@ -557,7 +205,9 @@ } ], "properties": { - "Node name for S&R": "CLIPLoader" + "Node name for S&R": "CLIPLoader", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ "t5xxl_fp16.safetensors", @@ -577,12 +227,13 @@ 82 ], "flags": {}, - "order": 5, + "order": 3, "mode": 0, "inputs": [], "outputs": [ { "name": "NOISE", + "localized_name": "NOISE", "type": "NOISE", "links": [ 194 @@ -591,35 +242,191 @@ } ], "properties": { - "Node name for S&R": "RandomNoise" + "Node name for S&R": "RandomNoise", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [ 42, "fixed" ] }, + { + "id": 73, + "type": "KSamplerSelect", + "pos": [ + 830.7018432617188, + -151.5533905029297 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "SAMPLER", + "localized_name": "SAMPLER", + "type": "SAMPLER", + "links": [ + 196 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSamplerSelect", + "cnr_id": "comfy-core", + "ver": "0.3.28" + }, + "widgets_values": [ + "gradient_estimation" + ] + }, + { + "id": 81, + "type": "SamplerCustomAdvanced", + "pos": [ + 1206.2567138671875, + 111.3145523071289 + ], + "size": [ + 355.20001220703125, + 106 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "noise", + "localized_name": "noise", + "type": "NOISE", + "link": 194 + }, + { + "name": "guider", + "localized_name": "guider", + "type": "GUIDER", + "link": 218 + }, + { + "name": "sampler", + "localized_name": "sampler", + "type": "SAMPLER", + "link": 196 + }, + { + "name": "sigmas", + "localized_name": "sigmas", + "type": "SIGMAS", + "link": 197 + }, + { + "name": "latent_image", + "localized_name": "latent_image", + "type": "LATENT", + "link": 205 + } + ], + "outputs": [ + { + "name": "output", + "localized_name": "output", + "type": "LATENT", + "links": [ + 199 + ], + "slot_index": 0 + }, + { + "name": "denoised_output", + "localized_name": "denoised_output", + "type": "LATENT", + "links": null + } + ], + "properties": { + "Node name for S&R": "SamplerCustomAdvanced", + "cnr_id": "comfy-core", + "ver": "0.3.28" + }, + "widgets_values": [] + }, + { + "id": 71, + "type": "LTXVScheduler", + "pos": [ + 1210.519287109375, + -119.96339416503906 + ], + "size": [ + 315, + 154 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "latent", + "localized_name": "latent", + "type": "LATENT", + "shape": 7, + "link": 210 + } + ], + "outputs": [ + { + "name": "SIGMAS", + "localized_name": "SIGMAS", + "type": "SIGMAS", + "links": [ + 197 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "LTXVScheduler", + "cnr_id": "comfy-core", + "ver": "0.3.28" + }, + "widgets_values": [ + 20, + 2.05, + 0.95, + true, + 0.1 + ] + }, { "id": 8, "type": "VAEDecode", "pos": [ - 1600, - 30 + 1268.183349609375, + 275.46270751953125 ], "size": [ 210, 46 ], "flags": {}, - "order": 14, + "order": 13, "mode": 0, "inputs": [ { "name": "samples", + "localized_name": "samples", "type": "LATENT", "link": 199 }, { "name": "vae", + "localized_name": "vae", "type": "VAE", "link": 211 } @@ -627,6 +434,7 @@ "outputs": [ { "name": "IMAGE", + "localized_name": "IMAGE", "type": "IMAGE", "links": [ 212 @@ -635,7 +443,9 @@ } ], "properties": { - "Node name for S&R": "VAEDecode" + "Node name for S&R": "VAEDecode", + "cnr_id": "comfy-core", + "ver": "0.3.28" }, "widgets_values": [] }, @@ -643,37 +453,41 @@ "id": 88, "type": "VHS_VideoCombine", "pos": [ - 1862.038330078125, - 29.338851928710938 + 1592.291748046875, + -89.84502410888672 ], "size": [ 315, 520.6666870117188 ], "flags": {}, - "order": 15, + "order": 14, "mode": 0, "inputs": [ { "name": "images", + "localized_name": "images", "type": "IMAGE", "shape": 7, "link": 212 }, { "name": "audio", + "localized_name": "audio", "type": "AUDIO", "shape": 7, "link": null }, { "name": "meta_batch", + "localized_name": "meta_batch", "type": "VHS_BatchManager", "shape": 7, "link": null }, { "name": "vae", + "localized_name": "vae", "type": "VAE", "shape": 7, "link": null @@ -682,6 +496,7 @@ "outputs": [ { "name": "Filenames", + "localized_name": "Filenames", "type": "VHS_FILENAMES", "links": null } @@ -703,7 +518,7 @@ "hidden": false, "paused": false, "params": { - "filename": "ltxv_00088.mp4", + "filename": "ltxv_00128.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4", @@ -711,6 +526,219 @@ } } } + }, + { + "id": 44, + "type": "CheckpointLoaderSimple", + "pos": [ + 93.61398315429688, + -66.24134063720703 + ], + "size": [ + 315, + 98 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "localized_name": "MODEL", + "type": "MODEL", + "links": [ + 217 + ], + "slot_index": 0 + }, + { + "name": "CLIP", + "localized_name": "CLIP", + "type": "CLIP", + "links": null + }, + { + "name": "VAE", + "localized_name": "VAE", + "type": "VAE", + "links": [ + 211 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple", + "cnr_id": "comfy-core", + "ver": "0.3.28" + }, + "widgets_values": [ + "ltxv-2b-0.9.6-dev-04-25.safetensors" + ] + }, + { + "id": 90, + "type": "STGGuiderAdvanced", + "pos": [ + 830.8892822265625, + -37.005123138427734 + ], + "size": [ + 327.5999755859375, + 242 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "model", + "localized_name": "model", + "type": "MODEL", + "link": 217 + }, + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "link": 219 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "link": 220 + } + ], + "outputs": [ + { + "name": "GUIDER", + "localized_name": "GUIDER", + "type": "GUIDER", + "links": [ + 218 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "STGGuiderAdvanced" + }, + "widgets_values": [ + 0.996, + true, + "1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180", + "4, 4, 4, 4, 1, 1", + "2, 2, 2, 2, 1, 0", + "1, 1, 1, 1, 1, 1", + "[14], [14], [14], [14], [14], [14]" + ] + }, + { + "id": 69, + "type": "LTXVConditioning", + "pos": [ + 900.875, + 273.27288818359375 + ], + "size": [ + 223.8660125732422, + 78 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "link": 203 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "link": 204 + } + ], + "outputs": [ + { + "name": "positive", + "localized_name": "positive", + "type": "CONDITIONING", + "links": [ + 219 + ], + "slot_index": 0 + }, + { + "name": "negative", + "localized_name": "negative", + "type": "CONDITIONING", + "links": [ + 220 + ], + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "LTXVConditioning", + "cnr_id": "comfy-core", + "ver": "0.3.28" + }, + "widgets_values": [ + 25 + ] + }, + { + "id": 86, + "type": "LTXVPromptEnhancer", + "pos": [ + 447.4213562011719, + 346.47674560546875 + ], + "size": [ + 335.70489501953125, + 124.35137939453125 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "prompt_enhancer", + "localized_name": "prompt_enhancer", + "type": "LTXV_PROMPT_ENHANCER", + "link": 206 + }, + { + "name": "image_prompt", + "localized_name": "image_prompt", + "type": "IMAGE", + "shape": 7, + "link": null + } + ], + "outputs": [ + { + "name": "str", + "localized_name": "str", + "type": "STRING", + "links": [ + 207 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "LTXVPromptEnhancer" + }, + "widgets_values": [ + "sleeping cat", + 256 + ] } ], "links": [ @@ -730,14 +758,6 @@ 0, "CLIP" ], - [ - 191, - 44, - 0, - 79, - 0, - "MODEL" - ], [ 194, 83, @@ -746,14 +766,6 @@ 0, "NOISE" ], - [ - 195, - 79, - 0, - 82, - 0, - "MODEL" - ], [ 196, 73, @@ -778,30 +790,6 @@ 0, "LATENT" ], - [ - 200, - 82, - 0, - 81, - 1, - "GUIDER" - ], - [ - 201, - 69, - 0, - 82, - 1, - "CONDITIONING" - ], - [ - 202, - 69, - 1, - 82, - 2, - "CONDITIONING" - ], [ 203, 6, @@ -865,20 +853,52 @@ 88, 0, "IMAGE" + ], + [ + 217, + 44, + 0, + 90, + 0, + "MODEL" + ], + [ + 218, + 90, + 0, + 81, + 1, + "GUIDER" + ], + [ + 219, + 69, + 0, + 90, + 1, + "CONDITIONING" + ], + [ + 220, + 69, + 1, + 90, + 2, + "CONDITIONING" ] ], "groups": [], "config": {}, "extra": { "ds": { - "scale": 0.7865676463226887, + "scale": 0.6934334949441353, "offset": [ - 105.43466179233377, - 168.14196262252545 + 217.20361259812148, + 342.27826789342566 ] }, "node_versions": { - "comfy-core": "0.3.18" + "comfy-core": "0.3.27" }, "prompt": { "6": { @@ -939,7 +959,7 @@ }, "44": { "inputs": { - "ckpt_name": "ltx-video-2b-v0.9.5.safetensors" + "ckpt_name": "ltxv-2b-0.9.6-dev-04-25.safetensors" }, "class_type": "CheckpointLoaderSimple", "_meta": { @@ -989,19 +1009,6 @@ "title": "KSamplerSelect" } }, - "79": { - "inputs": { - "block_indices": "14", - "model": [ - "44", - 0 - ] - }, - "class_type": "LTXVApplySTG", - "_meta": { - "title": "🅛🅣🅧 LTXV Apply STG" - } - }, "81": { "inputs": { "noise": [ @@ -1009,7 +1016,7 @@ 0 ], "guider": [ - "82", + "90", 0 ], "sampler": [ @@ -1030,29 +1037,6 @@ "title": "SamplerCustomAdvanced" } }, - "82": { - "inputs": { - "cfg": 3, - "stg": 1, - "rescale": 0.75, - "model": [ - "79", - 0 - ], - "positive": [ - "69", - 0 - ], - "negative": [ - "69", - 1 - ] - }, - "class_type": "STGGuider", - "_meta": { - "title": "🅛🅣🅧 STG Guider" - } - }, "83": { "inputs": { "noise_seed": 42 @@ -1086,7 +1070,7 @@ }, "86": { "inputs": { - "prompt": "dog", + "prompt": "sleeping cat", "max_resulting_tokens": 256, "prompt_enhancer": [ "85", @@ -1118,9 +1102,36 @@ "_meta": { "title": "Video Combine 🎥🅥🅗🅢" } + }, + "90": { + "inputs": { + "skip_steps_sigma_threshold": 0.996, + "cfg_star_rescale": true, + "sigmas": "1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180", + "cfg_values": "4, 4, 4, 4, 1, 1", + "stg_scale_values": "2, 2, 2, 2, 1, 0", + "stg_rescale_values": "1, 1, 1, 1, 1, 1", + "stg_layers_indices": "[14], [14], [14], [14], [14], [14]", + "model": [ + "44", + 0 + ], + "positive": [ + "69", + 0 + ], + "negative": [ + "69", + 1 + ] + }, + "class_type": "STGGuiderAdvanced", + "_meta": { + "title": "🅛🅣🅧 STG Guider Advanced" + } } }, - "comfy_fork_version": "update_nodes@db0f122d" + "comfy_fork_version": "feature/memory_prof@f7e64946" }, "version": 0.4 } diff --git a/assets/ltxvideo-t2v.png b/assets/ltxvideo-t2v.png index f7a55b3..8fad809 100644 --- a/assets/ltxvideo-t2v.png +++ b/assets/ltxvideo-t2v.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0823a77dec3324a8f696072a3988fe50431ce89482698e09047d32852f886cdc -size 770420 +oid sha256:7a4f2fe897fd955633099a429aa73bccc2e6007627a3e1bf419b4b8db67bce80 +size 817453 diff --git a/latents.py b/latents.py new file mode 100644 index 0000000..5323c20 --- /dev/null +++ b/latents.py @@ -0,0 +1,351 @@ +from typing import Optional + +import comfy_extras.nodes_lt as nodes_lt +import torch + +from .nodes_registry import comfy_node + + +@comfy_node(name="LTXVSelectLatents") +class LTXVSelectLatents: + """ + Selects a range of frames from a video latent. + + Features: + - Supports positive and negative indexing + - Preserves batch processing capabilities + - Handles noise masks if present + - Maintains 5D tensor format + """ + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "samples": ("LATENT",), + "start_index": ( + "INT", + {"default": 0, "min": -9999, "max": 9999, "step": 1}, + ), + "end_index": ( + "INT", + {"default": -1, "min": -9999, "max": 9999, "step": 1}, + ), + } + } + + RETURN_TYPES = ("LATENT",) + FUNCTION = "select_latents" + CATEGORY = "latent/video" + + def select_latents(self, samples: dict, start_index: int, end_index: int) -> tuple: + """ + Selects a range of frames from the video latent. + + Args: + samples (dict): Video latent dictionary + start_index (int): Starting frame index (supports negative indexing) + end_index (int): Ending frame index (supports negative indexing) + + Returns: + tuple: Contains modified latent dictionary with selected frames + + Raises: + ValueError: If indices are invalid + """ + try: + s = samples.copy() + video_latent = s["samples"] + batch, channels, frames, height, width = video_latent.shape + + # Handle negative indices + start_idx = frames + start_index if start_index < 0 else start_index + end_idx = frames + end_index if end_index < 0 else end_index + + # Validate and clamp indices + start_idx = max(0, min(start_idx, frames - 1)) + end_idx = max(0, min(end_idx, frames - 1)) + if start_idx > end_idx: + start_idx = min(start_idx, end_idx) + + # Select frames while maintaining 5D format + s["samples"] = video_latent[:, :, start_idx : end_idx + 1, :, :] + + # Handle noise mask if present + if "noise_mask" in s: + s["noise_mask"] = s["noise_mask"][:, :, start_idx : end_idx + 1, :, :] + + return (s,) + + except Exception as e: + print(f"[LTXVSelectLatents] Error: {str(e)}") + raise + + +@comfy_node(name="LTXVAddLatents") +class LTXVAddLatents: + """ + Concatenates two video latents along the frames dimension. + + Features: + - Validates dimension compatibility + - Handles device placement + - Preserves noise masks with proper handling + - Supports batch processing + """ + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "latents1": ("LATENT",), + "latents2": ("LATENT",), + } + } + + RETURN_TYPES = ("LATENT",) + FUNCTION = "add_latents" + CATEGORY = "latent/video" + + def add_latents( + self, latents1: torch.Tensor, latents2: torch.Tensor + ) -> torch.Tensor: + """ + Concatenates two video latents along the frames dimension. + + Args: + latents1 (dict): First video latent dictionary + latents2 (dict): Second video latent dictionary + + Returns: + tuple: Contains concatenated latent dictionary + + Raises: + ValueError: If latent dimensions don't match + RuntimeError: If tensor operations fail + """ + try: + s = latents1.copy() + video_latent1 = latents1["samples"] + video_latent2 = latents2["samples"] + + # Ensure tensors are on the same device + target_device = video_latent1.device + video_latent2 = video_latent2.to(target_device) + + # Validate dimensions + self._validate_dimensions(video_latent1, video_latent2) + + # Concatenate along frames dimension + s["samples"] = torch.cat([video_latent1, video_latent2], dim=2) + + # Handle noise masks + s["noise_mask"] = self._merge_noise_masks( + latents1, latents2, video_latent1.shape[2], video_latent2.shape[2] + ) + + return (s,) + + except Exception as e: + print(f"[LTXVAddLatents] Error: {str(e)}") + raise + + def _validate_dimensions(self, latent1: torch.Tensor, latent2: torch.Tensor): + """Validates that latent dimensions match except for frames.""" + b1, c1, f1, h1, w1 = latent1.shape + b2, c2, f2, h2, w2 = latent2.shape + + if not (b1 == b2 and c1 == c2 and h1 == h2 and w1 == w2): + raise ValueError( + f"Latent dimensions must match (except frames dimension).\n" + f"Got shapes {latent1.shape} and {latent2.shape}" + ) + + def _merge_noise_masks( + self, latents1: torch.Tensor, latents2: torch.Tensor, frames1: int, frames2: int + ) -> Optional[torch.Tensor]: + """Merges noise masks from both latents with proper handling.""" + if "noise_mask" in latents1 and "noise_mask" in latents2: + return torch.cat([latents1["noise_mask"], latents2["noise_mask"]], dim=2) + elif "noise_mask" in latents1: + zeros = torch.zeros_like(latents1["noise_mask"][:, :, :frames2, :, :]) + return torch.cat([latents1["noise_mask"], zeros], dim=2) + elif "noise_mask" in latents2: + zeros = torch.zeros_like(latents2["noise_mask"][:, :, :frames1, :, :]) + return torch.cat([zeros, latents2["noise_mask"]], dim=2) + return None + + +@comfy_node(name="LTXVSetVideoLatentNoiseMasks") +class LTXVSetVideoLatentNoiseMasks: + """ + Applies multiple masks to a video latent. + + Features: + - Supports multiple input mask formats (2D, 3D, 4D) + - Automatically handles fewer masks than frames by reusing the last mask + - Resizes masks to match latent dimensions + - Preserves batch processing capabilities + + Input Formats: + - 2D mask: Single mask [H, W] + - 3D mask: Multiple masks [M, H, W] + - 4D mask: Multiple masks with channels [M, C, H, W] + """ + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "samples": ("LATENT",), + "masks": ("MASK",), + } + } + + RETURN_TYPES = ("LATENT",) + FUNCTION = "set_mask" + CATEGORY = "latent/video" + + def set_mask(self, samples: dict, masks: torch.Tensor) -> tuple: + """ + Applies masks to video latent frames. + + Args: + samples (dict): Video latent dictionary containing 'samples' tensor + masks (torch.Tensor): Mask tensor in various possible formats + - 2D: [H, W] single mask + - 3D: [M, H, W] multiple masks + - 4D: [M, C, H, W] multiple masks with channels + + Returns: + tuple: Contains modified latent dictionary with applied masks + + Raises: + ValueError: If mask dimensions are unsupported + RuntimeError: If tensor operations fail + """ + try: + s = samples.copy() + video_latent = s["samples"] + batch_size, channels, num_frames, height, width = video_latent.shape + + # Initialize noise_mask if not present + if "noise_mask" not in s: + s["noise_mask"] = torch.zeros( + (batch_size, 1, num_frames, height, width), + dtype=video_latent.dtype, + device=video_latent.device, + ) + + # Process masks + masks_reshaped = self._reshape_masks(masks) + M = masks_reshaped.shape[0] + resized_masks = self._resize_masks(masks_reshaped, height, width) + + # Apply masks efficiently + self._apply_masks(s["noise_mask"], resized_masks, num_frames, M) + return (s,) + + except Exception as e: + print(f"[LTXVSetVideoLatentNoiseMasks] Error: {str(e)}") + raise + + def _reshape_masks(self, masks: torch.Tensor) -> torch.Tensor: + """Reshapes input masks to consistent 4D format.""" + original_shape = tuple(masks.shape) + ndims = masks.ndim + + if ndims == 2: + return masks.unsqueeze(0).unsqueeze(0) + elif ndims == 3: + return masks.reshape(masks.shape[0], 1, masks.shape[1], masks.shape[2]) + elif ndims == 4: + return masks.reshape(masks.shape[0], 1, masks.shape[2], masks.shape[3]) + else: + raise ValueError( + f"Unsupported 'masks' dimension: {original_shape}. " + "Must be 2D (H,W), 3D (M,H,W), or 4D (M,C,H,W)." + ) + + def _resize_masks( + self, masks: torch.Tensor, height: int, width: int + ) -> torch.Tensor: + """Resizes all masks to match latent dimensions.""" + return torch.nn.functional.interpolate( + masks, size=(height, width), mode="bilinear", align_corners=False + ) + + def _apply_masks( + self, + noise_mask: torch.Tensor, + resized_masks: torch.Tensor, + num_frames: int, + M: int, + ) -> None: + """Applies resized masks to all frames.""" + for f in range(num_frames): + mask_idx = min(f, M - 1) # Reuse last mask if we run out + noise_mask[:, :, f] = resized_masks[mask_idx] + + +@comfy_node(name="LTXVAddLatentGuide") +class LTXVAddLatentGuide(nodes_lt.LTXVAddGuide): + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "vae": ("VAE",), + "positive": ("CONDITIONING",), + "negative": ("CONDITIONING",), + "latent": ("LATENT",), + "guiding_latent": ("LATENT",), + "latent_idx": ( + "INT", + { + "default": 0, + "min": -9999, + "max": 9999, + "step": 1, + "tooltip": "Latent index to start the conditioning at. Can be negative to" + "indicate that the conditioning is on the frames before the latent.", + }, + ), + "strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0}), + } + } + + RETURN_TYPES = ("CONDITIONING", "CONDITIONING", "LATENT") + RETURN_NAMES = ("positive", "negative", "latent") + + CATEGORY = "ltxtricks" + FUNCTION = "generate" + + def generate( + self, vae, positive, negative, latent, guiding_latent, latent_idx, strength + ): + noise_mask = nodes_lt.get_noise_mask(latent) + latent = latent["samples"] + guiding_latent = guiding_latent["samples"] + scale_factors = vae.downscale_index_formula + + if latent_idx <= 0: + frame_idx = latent_idx * scale_factors[0] + else: + frame_idx = 1 + (latent_idx - 1) * scale_factors[0] + + positive, negative, latent, noise_mask = self.append_keyframe( + positive=positive, + negative=negative, + frame_idx=frame_idx, + latent_image=latent, + noise_mask=noise_mask, + guiding_latent=guiding_latent, + strength=strength, + scale_factors=scale_factors, + ) + + return ( + positive, + negative, + {"samples": latent, "noise_mask": noise_mask}, + ) diff --git a/pyproject.toml b/pyproject.toml index ba6d54c..b6a70c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,8 @@ dependencies = [ [project.optional-dependencies] internal = [ "ltx-video@git+https://github.com/Lightricks/LTX-Video@ltx-video-0.9.1", - "av>=10.0.0" + "av>=10.0.0", + "q8-kernels>=0.0.2" ] dev = [ "pre-commit>=4.0.1", diff --git a/recurrent_sampler.py b/recurrent_sampler.py new file mode 100644 index 0000000..450301d --- /dev/null +++ b/recurrent_sampler.py @@ -0,0 +1,254 @@ +import torch +from comfy_extras.nodes_custom_sampler import CFGGuider, SamplerCustomAdvanced +from comfy_extras.nodes_lt import LTXVAddGuide, LTXVCropGuides + +from .latents import LTXVAddLatents, LTXVSelectLatents +from .nodes_registry import comfy_node +from .tricks import AddLatentGuideNode + + +@comfy_node(description="Linear transition with overlap") +class LinearOverlapLatentTransition: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "samples1": ("LATENT",), + "samples2": ("LATENT",), + "overlap": ("INT", {"default": 1, "min": 1, "max": 256}), + }, + "optional": { + "axis": ("INT", {"default": 0}), + }, + } + + RETURN_TYPES = ("LATENT",) + FUNCTION = "process" + + CATEGORY = "Lightricks/latent" + + def get_subbatch(self, samples): + s = samples.copy() + samples = s["samples"] + return samples + + def process(self, samples1, samples2, overlap, axis=0): + samples1 = self.get_subbatch(samples1) + samples2 = self.get_subbatch(samples2) + + # Create transition coefficients + alpha = torch.linspace(1, 0, overlap + 2)[1:-1].to(samples1.device) + + # Create shape for broadcasting based on the axis + shape = [1] * samples1.dim() + shape[axis] = alpha.size(0) + alpha = alpha.reshape(shape) + + # Create slices for the overlap regions + slice_all = [slice(None)] * samples1.dim() + slice_overlap1 = slice_all.copy() + slice_overlap1[axis] = slice(-overlap, None) + slice_overlap2 = slice_all.copy() + slice_overlap2[axis] = slice(0, overlap) + slice_rest1 = slice_all.copy() + slice_rest1[axis] = slice(None, -overlap) + slice_rest2 = slice_all.copy() + slice_rest2[axis] = slice(overlap, None) + + # Combine samples + parts = [ + samples1[tuple(slice_rest1)], + alpha * samples1[tuple(slice_overlap1)] + + (1 - alpha) * samples2[tuple(slice_overlap2)], + samples2[tuple(slice_rest2)], + ] + + combined_samples = torch.cat(parts, dim=axis) + combined_batch_index = torch.arange(0, combined_samples.shape[0]) + + return ( + { + "samples": combined_samples, + "batch_index": combined_batch_index, + }, + ) + + +@comfy_node( + name="LTXVRecurrentKSampler", +) +class LTXVRecurrentKSampler: + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "model": ("MODEL",), + "vae": ("VAE",), + "noise": ("NOISE",), + "sampler": ("SAMPLER",), + "sigmas": ("SIGMAS",), + "latents": ("LATENT",), + "chunk_sizes": ("STRING", {"default": "3", "multiline": False}), + "overlaps": ("STRING", {"default": "1", "multiline": False}), + "positive": ("CONDITIONING",), + "negative": ("CONDITIONING",), + "input_image": ("IMAGE",), + "linear_blend_latents": ("BOOLEAN", {"default": True}), + "conditioning_strength": ( + "FLOAT", + {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.01}, + ), + }, + "optional": { + "guider": ("GUIDER",), + }, + } + + RETURN_TYPES = ( + "LATENT", + "LATENT", + ) + RETURN_NAMES = ( + "output", + "denoised_output", + ) + + FUNCTION = "sample" + + CATEGORY = "sampling" + + def sample( + self, + model, + vae, + noise, + sampler, + sigmas, + latents, + chunk_sizes, + overlaps, + positive, + negative, + input_image, + linear_blend_latents, + conditioning_strength, + guider=None, + ): + select_latents = LTXVSelectLatents().select_latents + add_latent_guide = AddLatentGuideNode().generate + add_latents = LTXVAddLatents().add_latents + positive_orig = positive.copy() + negative_orig = negative.copy() + + # Parse chunk sizes and overlaps from strings + chunk_sizes = [int(x) for x in chunk_sizes.split(",")] + overlaps = [int(x) for x in overlaps.split(",")] + + # Extend lists if shorter than number of sigma steps + n_steps = len(sigmas) - 1 + if len(chunk_sizes) < n_steps: + chunk_sizes.extend([chunk_sizes[-1]] * (n_steps - len(chunk_sizes))) + if len(overlaps) < n_steps: + overlaps.extend([overlaps[-1]] * (n_steps - len(overlaps))) + + # Initialize working latents + current_latents = latents.copy() + t_latents = None + # Loop through sigma pairs for progressive denoising + for i in range(n_steps): + current_sigmas = sigmas[i : i + 2] + current_chunk_size = chunk_sizes[i] + current_overlap = overlaps[i] + + print(f"\nProcessing sigma step {i} with sigmas {current_sigmas}") + print( + f"Using chunk size {current_chunk_size} and overlap {current_overlap}" + ) + + # Calculate valid chunk starts to ensure the last chunk isn't shorter than the overlap + total_frames = current_latents["samples"].shape[2] + chunk_stride = current_chunk_size - current_overlap + valid_chunk_starts = list( + range(0, total_frames - current_overlap, chunk_stride) + ) + + # If the last chunk would be too short, remove the last start position + if ( + total_frames > chunk_stride + and (total_frames - valid_chunk_starts[-1]) < current_chunk_size + ): + print( + "last chunk is too short, it will only be of size", + total_frames - valid_chunk_starts[-1], + "frames", + ) + + # Process each chunk for current sigma pair + for i_chunk, chunk_start in enumerate(valid_chunk_starts): + (latents_chunk,) = select_latents( + current_latents, chunk_start, chunk_start + current_chunk_size - 1 + ) + print(f"Processing chunk {i_chunk} starting at frame {chunk_start}") + + if i_chunk == 0: + positive, negative, latents_chunk = LTXVAddGuide().generate( + positive_orig, + negative_orig, + vae, + latents_chunk, + input_image, + 0, + 0.75, + ) + else: + (cond_latent,) = select_latents(t_latents, -current_overlap, -1) + model, latents_chunk = add_latent_guide( + model, latents_chunk, cond_latent, 0, conditioning_strength + ) + + if guider is None: + (guider_obj,) = CFGGuider().get_guider( + model, positive, negative, 1.0 + ) + else: + guider_obj = guider + (_, denoised_latents) = SamplerCustomAdvanced().sample( + noise, guider_obj, sampler, current_sigmas, latents_chunk + ) + (positive, negative, denoised_latents) = LTXVCropGuides().crop( + positive, negative, denoised_latents + ) + + if i_chunk == 0: + t_latents = denoised_latents + else: + if linear_blend_latents and current_overlap > 1: + # the first output latent is the result of a 1:8 latent + # reinterpreted as a 1:1 latent, so we ignore it + (denoised_latents_drop_first,) = select_latents( + denoised_latents, 1, -1 + ) + (t_latents,) = LinearOverlapLatentTransition().process( + t_latents, + denoised_latents_drop_first, + current_overlap - 1, + axis=2, + ) + else: + (truncated_denoised_latents,) = select_latents( + denoised_latents, current_overlap, -1 + ) + (t_latents,) = add_latents( + t_latents, truncated_denoised_latents + ) + + print( + f"Completed chunk {i_chunk}, current output shape: {t_latents['samples'].shape}" + ) + + # Update current_latents for next sigma step + current_latents = t_latents.copy() + print(f"Completed sigma step {i}") + + return t_latents, t_latents diff --git a/stg.py b/stg.py index a7d18fe..b6f1250 100644 --- a/stg.py +++ b/stg.py @@ -1,10 +1,10 @@ import contextlib +import math from dataclasses import dataclass from typing import List import comfy.ldm.modules.attention import comfy.samplers -import comfy.utils import torch from comfy.model_patcher import ModelPatcher @@ -20,8 +20,8 @@ def stg( rescale_scale, ): noise_pred = ( - noise_pred_neg - + cfg_scale * (noise_pred_pos - noise_pred_neg) + noise_pred_pos + + (cfg_scale - 1) * (noise_pred_pos - noise_pred_neg) + stg_scale * (noise_pred_pos - noise_pred_pertubed) ) if rescale_scale != 0: @@ -183,6 +183,18 @@ class STGGuider(comfy.samplers.CFGGuider): positive_cond = self.conds.get("positive", None) negative_cond = self.conds.get("negative", None) + if model_options.get("sigma_to_params_mapping", None) is not None: + cfg_value, stg_scale, stg_layer_skip_layer_indices, stg_rescale = ( + model_options["sigma_to_params_mapping"](timestep) + ) + self.stg_flag.skip_layers = stg_layer_skip_layer_indices + self.patch_model(self.model_patcher, self.stg_flag) + + else: + cfg_value = self.cfg + stg_scale = self.stg_scale + stg_rescale = self.rescale_scale + noise_pred_pos = comfy.samplers.calc_cond_batch( self.inner_model, [positive_cond], @@ -194,7 +206,7 @@ class STGGuider(comfy.samplers.CFGGuider): noise_pred_neg = 0 noise_pred_perturbed = 0 - if self.cfg > 1: + if not math.isclose(cfg_value, 1.0): noise_pred_neg = comfy.samplers.calc_cond_batch( self.inner_model, [negative_cond], @@ -203,7 +215,7 @@ class STGGuider(comfy.samplers.CFGGuider): model_options, )[0] - if self.stg_scale > 0: + if not math.isclose(stg_scale, 0.0): try: model_options["transformer_options"]["ptb_index"] = 0 self.stg_flag.do_skip = True @@ -222,9 +234,161 @@ class STGGuider(comfy.samplers.CFGGuider): noise_pred_pos, noise_pred_neg, noise_pred_perturbed, - self.cfg, - self.stg_scale, - self.rescale_scale, + cfg_value, + stg_scale, + stg_rescale, + ) + + # normally this would be done in cfg_function, but we skipped + # that for efficiency: we can compute the noise predictions in + # a single call to calc_cond_batch() (rather than two) + # so we replicate the hook here + for fn in model_options.get("sampler_post_cfg_function", []): + args = { + "denoised": stg_result, + "cond": positive_cond, + "uncond": negative_cond, + "model": self.inner_model, + "uncond_denoised": noise_pred_neg, + "cond_denoised": noise_pred_pos, + "sigma": timestep, + "model_options": model_options, + "input": x, + # not in the original call in samplers.py:cfg_function, but made available for future hooks + "perturbed_cond": positive_cond, + "perturbed_cond_denoised": noise_pred_perturbed, + } + stg_result = fn(args) + + return stg_result + + +class STGGuiderAdvanced(comfy.samplers.CFGGuider): + def __init__( + self, + model: ModelPatcher, + sigma_list, + cfg_list, + stg_scale_list, + stg_rescale_list, + stg_layers_indices_list, + skip_steps_sigma_threshold, + cfg_star_rescale, + ): + model = model.clone() + super().__init__(model) + + self.stg_flag = STGFlag( + do_skip=False, + skip_layers=model.model_options["transformer_options"].get( + "skip_block_list" + ), + ) + + self.sigma_list = sigma_list + self.cfg_list = cfg_list + self.stg_scale_list = stg_scale_list + self.stg_rescale_list = stg_rescale_list + self.stg_layers_indices_list = stg_layers_indices_list + self.skip_steps_sigma_threshold = skip_steps_sigma_threshold + self.cfg_star_rescale = cfg_star_rescale + STGGuider.patch_model(model, self.stg_flag) + + def sigma_to_params_mapping(self, sigma): + # Find the closest higher sigma value and return corresponding cfg + higher_sigmas = [s for s in self.sigma_list if s >= sigma] + if not higher_sigmas: + return self.cfg_list[-1] # Return last cfg if no higher sigma exists + closest_higher = min(higher_sigmas) + closest_idx = self.sigma_list.index(closest_higher) + return ( + self.cfg_list[closest_idx], + self.stg_scale_list[closest_idx], + self.stg_rescale_list[closest_idx], + self.stg_layers_indices_list[closest_idx], + ) + + def set_conds(self, positive, negative): + self.inner_set_conds({"positive": positive, "negative": negative}) + + def predict_noise( + self, + x: torch.Tensor, + timestep: torch.Tensor, + model_options: dict = {}, + seed=None, + ): + # CFG zero init - skipping steps with timestep bigger than given threshold. + if timestep > self.skip_steps_sigma_threshold: + return torch.zeros_like(x) + + # in CFGGuider.predict_noise, we call sampling_function(), which uses cfg_function() to compute pos & neg + # but we'd rather do a single batch of sampling pos, neg, and perturbed, so we call calc_cond_batch([perturbed,pos,neg]) directly + positive_cond = self.conds.get("positive", None) + negative_cond = self.conds.get("negative", None) + + cfg_value, stg_scale, stg_rescale, stg_layer_skip_layer_indices = ( + self.sigma_to_params_mapping(timestep) + ) + + if stg_layer_skip_layer_indices is not None: + self.stg_flag.skip_layers = stg_layer_skip_layer_indices + STGGuider.patch_model(self.model_patcher, self.stg_flag) + + noise_pred_pos = comfy.samplers.calc_cond_batch( + self.inner_model, + [positive_cond], + x, + timestep, + model_options, + )[0] + + noise_pred_neg = 0 + noise_pred_perturbed = 0 + + if not math.isclose(cfg_value, 1.0): + noise_pred_neg = comfy.samplers.calc_cond_batch( + self.inner_model, + [negative_cond], + x, + timestep, + model_options, + )[0] + + if self.cfg_star_rescale: + batch_size = noise_pred_pos.shape[0] + + positive_flat = noise_pred_pos.view(batch_size, -1) + negative_flat = noise_pred_neg.view(batch_size, -1) + dot_product = torch.sum( + positive_flat * negative_flat, dim=1, keepdim=True + ) + squared_norm = torch.sum(negative_flat**2, dim=1, keepdim=True) + 1e-8 + alpha = dot_product / squared_norm + noise_pred_neg = alpha * noise_pred_neg + + if not math.isclose(stg_scale, 0.0): + try: + model_options["transformer_options"]["ptb_index"] = 0 + self.stg_flag.do_skip = True + noise_pred_perturbed = comfy.samplers.calc_cond_batch( + self.inner_model, + [positive_cond], + x, + timestep, + model_options, + )[0] + finally: + self.stg_flag.do_skip = False + del model_options["transformer_options"]["ptb_index"] + + stg_result = stg( + noise_pred_pos, + noise_pred_neg, + noise_pred_perturbed, + cfg_value, + stg_scale, + stg_rescale, ) # normally this would be done in cfg_function, but we skipped @@ -290,3 +454,130 @@ class STGGuiderNode: guider = STGGuider(model, cfg, stg, rescale) guider.set_conds(positive, negative) return (guider,) + + +@comfy_node(name="STGGuiderAdvanced") +class STGGuiderAdvancedNode: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "model": ("MODEL",), + "positive": ("CONDITIONING",), + "negative": ("CONDITIONING",), + "skip_steps_sigma_threshold": ( + "FLOAT", + { + "default": 0.996, + "min": 0.0, + "max": 100.0, + "step": 0.001, + "tooltip": "Steps with sigma greater than this values will be skipped.", + }, + ), + "cfg_star_rescale": ( + "BOOLEAN", + { + "default": True, + "tooltip": "If true, applies the cfg star rescale, scales the negative prediction according to dot product between positive and negative.", + }, + ), + "sigmas": ( + "STRING", + { + "default": "1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180", + "tooltip": "Comma-separated list sigmas, the actual parameters will be selected according to the closest sigma from this list to current timestep sigma.", + }, + ), + "cfg_values": ( + "STRING", + { + "default": "4, 4, 4, 4, 1, 1", + "tooltip": "Comma-separated list of cfg values. Should be same length as sigmas list.", + }, + ), + "stg_scale_values": ( + "STRING", + { + "default": "2, 2, 2, 2, 1, 0", + "tooltip": "Comma-separated list of stg scale values. Should be same length as sigmas list.", + }, + ), + "stg_rescale_values": ( + "STRING", + { + "default": "1, 1, 1, 1, 1, 1", + "tooltip": "Comma-separated list of stg rescale values. Should be same length as sigmas list.", + }, + ), + "stg_layers_indices": ( + "STRING", + { + "default": "[14], [14], [14], [14], [14], [14]", + "tooltip": "Comma-separated list of list of layer indices. Should be same length as sigmas list.", + }, + ), + } + } + + RETURN_TYPES = ("GUIDER",) + + FUNCTION = "get_guider" + CATEGORY = "lightricks/LTXV" + + @classmethod + def parse_stg_layers_indices(cls, stg_layers_indices: str) -> List[List[int]]: + # First split by "], " to separate the lists, but preserve the closing bracket + lists = [s + "]" for s in stg_layers_indices.split("],")[:-1]] + # Add the last list which already has its closing bracket + if stg_layers_indices.strip(): + lists.append(stg_layers_indices.split("],")[-1]) + + result = [] + for s in lists: + s = s.strip() + if s == "[]": # Empty list case + result.append([]) + else: + # Remove brackets and whitespace + s = s.strip("[]").strip() + if not s: # Handle case like "[]" after split + result.append([]) + else: + # Split by comma and convert to integers + numbers = [int(n.strip()) for n in s.split(",") if n.strip()] + result.append(numbers) + + return result + + def get_guider( + self, + model, + positive, + negative, + skip_steps_sigma_threshold, + cfg_star_rescale, + sigmas, + cfg_values, + stg_scale_values, + stg_rescale_values, + stg_layers_indices, + ): + sigma_list = [float(s.strip()) for s in sigmas.split(",")] + cfg_list = [float(c.strip()) for c in cfg_values.split(",")] + stg_scale_list = [float(s.strip()) for s in stg_scale_values.split(",")] + stg_rescale_list = [float(s.strip()) for s in stg_rescale_values.split(",")] + stg_layers_indices_list = self.parse_stg_layers_indices(stg_layers_indices) + + guider = STGGuiderAdvanced( + model, + sigma_list, + cfg_list, + stg_scale_list, + stg_rescale_list, + stg_layers_indices_list, + skip_steps_sigma_threshold, + cfg_star_rescale, + ) + guider.set_conds(positive, negative) + return (guider,) diff --git a/tricks/assets/ltxvideo-flow-edit.json b/tricks/assets/ltxvideo-flow-edit.json index c45b66b..c0af777 100644 --- a/tricks/assets/ltxvideo-flow-edit.json +++ b/tricks/assets/ltxvideo-flow-edit.json @@ -1302,7 +1302,7 @@ "Node name for S&R": "CheckpointLoaderSimple" }, "widgets_values": [ - "ltx-video-2b-v0.9.5.safetensors" + "ltxv-2b-0.9.6-dev-04-25.safetensors" ] }, { @@ -2547,7 +2547,7 @@ }, "44": { "inputs": { - "ckpt_name": "ltx-video-2b-v0.9.5.safetensors" + "ckpt_name": "ltxv-2b-0.9.6-dev-04-25.safetensors" }, "class_type": "CheckpointLoaderSimple", "_meta": { diff --git a/tricks/assets/ltxvideo-rf-edit.json b/tricks/assets/ltxvideo-rf-edit.json index c0ceb5f..91eed8e 100644 --- a/tricks/assets/ltxvideo-rf-edit.json +++ b/tricks/assets/ltxvideo-rf-edit.json @@ -1574,7 +1574,7 @@ "Node name for S&R": "CheckpointLoaderSimple" }, "widgets_values": [ - "ltx-video-2b-v0.9.5.safetensors" + "ltxv-2b-0.9.6-dev-04-25.safetensors" ] }, { @@ -3362,7 +3362,7 @@ }, "44": { "inputs": { - "ckpt_name": "ltx-video-2b-v0.9.5.safetensors" + "ckpt_name": "ltxv-2b-0.9.6-dev-04-25.safetensors" }, "class_type": "CheckpointLoaderSimple", "_meta": { diff --git a/tricks/nodes/latent_guide_node.py b/tricks/nodes/latent_guide_node.py index d3d1bc2..652a689 100644 --- a/tricks/nodes/latent_guide_node.py +++ b/tricks/nodes/latent_guide_node.py @@ -10,6 +10,7 @@ class AddLatentGuideNode(nodes_lt.LTXVAddGuide): "latent": ("LATENT",), "image_latent": ("LATENT",), "index": ("INT", {"default": 0, "min": -1, "max": 9999, "step": 1}), + "strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0}), } } @@ -19,7 +20,7 @@ class AddLatentGuideNode(nodes_lt.LTXVAddGuide): CATEGORY = "ltxtricks" FUNCTION = "generate" - def generate(self, model, latent, image_latent, index): + def generate(self, model, latent, image_latent, index, strength): noise_mask = nodes_lt.get_noise_mask(latent) latent = latent["samples"] @@ -30,7 +31,7 @@ class AddLatentGuideNode(nodes_lt.LTXVAddGuide): noise_mask, image_latent, index, - 1.0, + strength, ) return (