Files

703 lines
16 KiB
JSON

{
"id": "h3-seamless-chain-core",
"revision": 0,
"last_node_id": 12,
"last_link_id": 13,
"nodes": [
{
"id": 1,
"type": "Note",
"pos": [
-1700,
-560
],
"size": [
600,
620
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [],
"title": "CORE - START HERE",
"color": "#432",
"bgcolor": "#653",
"properties": {},
"widgets_values": [
"CORE - H3 SEAMLESS CHAIN (no extra packs needed)\n\nThis variant uses ONLY this node pack and stock ComfyUI nodes. Type your\nshots into the sampler's script box, one prompt per shot with --- on its\nown line between them, and queue once. Each shot's last frame becomes the\nnext shot's first frame, the duplicate boundary frame is trimmed, and the\nseam audio is welded at the quietest gap so words are not clipped.\n\nEverything lands as one master video plus a matching audio file in\noutput/video/H3CHAIN/.\n\nRECIPE (shipped, render-verified): fl2va checkpoint, euler + beta57,\n14 steps, 243 frames per shot (~10.1s at 24fps). Keep the mux at 24fps -\nother rates audibly shift voice accents.\n\nWRITING RULES FOR CLEAN JOINS\n- Every shot after the first OPENS holding the previous shot's exact\n closing arrangement, with about two quiet seconds (a breath, a small\n weight shift) before anyone speaks.\n- Every shot ENDS settled, dialogue finished, ~2 seconds spare.\n- A spoken line never straddles two shots.\n- Repeat each character's appearance AND the room/lighting description\n word-for-word in every shot - that verbatim repetition is what holds\n identity, together with the frame relay.\n\nWant the LLM prompt writer, raw-latent context pinning, and the VRAM\npanel? Use H3_Seamless_Chain_v1.json and install the optional packs\nlisted in INSTALL.md."
]
},
{
"id": 2,
"type": "H3StudioControls",
"pos": [
-1700,
120
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "width",
"type": "INT",
"links": [
6
],
"slot_index": 0
},
{
"name": "height",
"type": "INT",
"links": [
7
],
"slot_index": 1
},
{
"name": "frames_per_shot",
"type": "INT",
"links": [
8
],
"slot_index": 2
},
{
"name": "steps",
"type": "INT",
"links": [
9
],
"slot_index": 3
},
{
"name": "sampler_name",
"type": "STRING",
"links": [],
"slot_index": 4
},
{
"name": "scheduler",
"type": "STRING",
"links": [],
"slot_index": 5
}
],
"title": "MASTER CONTROLS (size / frames / steps)",
"properties": {
"Node name for S&R": "H3StudioControls"
},
"widgets_values": [
1280,
736,
362,
14,
"euler",
"beta"
],
"color": "#322"
},
{
"id": 3,
"type": "H3ModelLoaderAny",
"pos": [
-1000,
-560
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
1
],
"slot_index": 0
}
],
"title": "H3 model",
"properties": {
"Node name for S&R": "H3ModelLoaderAny"
},
"widgets_values": [
"MiniMax-H3-ref2va-curve-Q8_0.gguf",
0.0
]
},
{
"id": 4,
"type": "H3ClipLoaderAny",
"pos": [
-1000,
-380
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "CLIP",
"type": "CLIP",
"links": [
3
],
"slot_index": 0
}
],
"title": "text encoder",
"properties": {
"Node name for S&R": "H3ClipLoaderAny"
},
"widgets_values": [
"qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
"minimax"
]
},
{
"id": 5,
"type": "H3LoraStack",
"pos": [
-1000,
-200
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 1
}
],
"outputs": [
{
"name": "model",
"type": "MODEL",
"links": [
2
],
"slot_index": 0
}
],
"title": "LoRA stack (inert until a slot is set)",
"properties": {
"Node name for S&R": "H3LoraStack"
},
"widgets_values": [
"None",
1.0,
"None",
1.0,
"None",
1.0,
"None",
1.0
]
},
{
"id": 6,
"type": "VAELoader",
"pos": [
-1000,
120
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "VAE",
"type": "VAE",
"links": [
4
],
"slot_index": 0
}
],
"title": "video VAE",
"properties": {
"Node name for S&R": "VAELoader"
},
"widgets_values": [
"minimax_h3_video_vae_fp16.safetensors"
]
},
{
"id": 7,
"type": "VAELoader",
"pos": [
-1000,
320
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "VAE",
"type": "VAE",
"links": [
5
],
"slot_index": 0
}
],
"title": "audio VAE",
"properties": {
"Node name for S&R": "VAELoader"
},
"widgets_values": [
"minimax_h3_audio_vae_fp32.safetensors"
]
},
{
"id": 8,
"type": "H3MultishotSampler",
"pos": [
-340,
-560
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 2
},
{
"name": "clip",
"type": "CLIP",
"link": 3
},
{
"name": "video_vae",
"type": "VAE",
"link": 4
},
{
"name": "audio_vae",
"type": "VAE",
"link": 5
},
{
"name": "start_image",
"type": "IMAGE",
"link": null
},
{
"name": "reference_images",
"type": "IMAGE",
"link": null
},
{
"name": "voice_ref",
"type": "AUDIO",
"link": null
},
{
"name": "sampler_override",
"type": "STRING",
"link": null
},
{
"name": "scheduler_override",
"type": "STRING",
"link": null
},
{
"name": "width",
"type": "INT",
"widget": {
"name": "width"
},
"link": 6
},
{
"name": "height",
"type": "INT",
"widget": {
"name": "height"
},
"link": 7
},
{
"name": "frames_per_shot",
"type": "INT",
"widget": {
"name": "frames_per_shot"
},
"link": 8
},
{
"name": "steps",
"type": "INT",
"widget": {
"name": "steps"
},
"link": 9
}
],
"outputs": [
{
"name": "master_frames",
"type": "IMAGE",
"links": [
10
],
"slot_index": 0
},
{
"name": "master_audio",
"type": "AUDIO",
"links": [
11,
12
],
"slot_index": 1
},
{
"name": "shots_rendered",
"type": "INT",
"links": [],
"slot_index": 2
},
{
"name": "first_shot_frames",
"type": "IMAGE",
"links": [],
"slot_index": 3
},
{
"name": "first_shot_audio",
"type": "AUDIO",
"links": [],
"slot_index": 4
}
],
"title": "SEAMLESS CHAIN SAMPLER (core)",
"properties": {
"Node name for S&R": "H3MultishotSampler"
},
"widgets_values": [
"A static camera sits at the end of the table and frames both of them from the chest up in a two-shot; the framing never changes. Live-action, shallow depth of field, fine 35mm grain. A man in his fifties with close-cropped grey hair, deep lines around the eyes and a heavy salt-and-pepper moustache, wearing a faded blue mechanic's jacket over a white t-shirt sits on one side of a late-night roadside diner booth: cracked red vinyl seats, a scratched formica table with two chipped white coffee mugs and a steel napkin dispenser, a rain-streaked window behind them reflecting an empty parking lot, and one warm pendant lamp directly above the table as the only light, the rest of the diner falling away into darkness. Across from him sits a woman in her late twenties with dark curly hair tied back, round wire-frame glasses and chipped green nail polish, wearing an oversized cream cable-knit sweater. He leans forward on his forearms, turning his mug slowly on the table, and the man in the faded blue mechanic's jacket says, \"So let me get this straight. The whole street goes dark for six minutes - traffic lights, the gas station, everything - and your shop keeps its lights on.\" He settles back against the vinyl with both hands around his mug and waits, watching her.\n---\nA static camera sits at the end of the table and frames both of them from the chest up in a two-shot; the framing never changes. Live-action, shallow depth of field, fine 35mm grain. A man in his fifties with close-cropped grey hair, deep lines around the eyes and a heavy salt-and-pepper moustache, wearing a faded blue mechanic's jacket over a white t-shirt sits on one side of a late-night roadside diner booth: cracked red vinyl seats, a scratched formica table with two chipped white coffee mugs and a steel napkin dispenser, a rain-streaked window behind them reflecting an empty parking lot, and one warm pendant lamp directly above the table as the only light, the rest of the diner falling away into darkness. Across from him sits a woman in her late twenties with dark curly hair tied back, round wire-frame glasses and chipped green nail polish, wearing an oversized cream cable-knit sweater. Both of them sit exactly as they were, hands resting on the table, the mugs untouched. For the first couple of seconds neither speaks - one of them shifts their weight slightly and breathes - and only then the woman in the cream cable-knit sweater says, \"Not just on. Brighter. The bulbs over the workbench went so white I had to look away. And the meter outside was spinning backwards.\" She settles back with both hands flat on the table and waits, watching him.\n---\nA static camera sits at the end of the table and frames both of them from the chest up in a two-shot; the framing never changes. Live-action, shallow depth of field, fine 35mm grain. A man in his fifties with close-cropped grey hair, deep lines around the eyes and a heavy salt-and-pepper moustache, wearing a faded blue mechanic's jacket over a white t-shirt sits on one side of a late-night roadside diner booth: cracked red vinyl seats, a scratched formica table with two chipped white coffee mugs and a steel napkin dispenser, a rain-streaked window behind them reflecting an empty parking lot, and one warm pendant lamp directly above the table as the only light, the rest of the diner falling away into darkness. Across from him sits a woman in her late twenties with dark curly hair tied back, round wire-frame glasses and chipped green nail polish, wearing an oversized cream cable-knit sweater. Both of them sit exactly as they were, hands resting on the table, the mugs untouched. For the first couple of seconds neither speaks - one of them shifts their weight slightly and breathes - and only then the man in the faded blue mechanic's jacket says, \"Meters do not spin backwards, and buildings do not get brighter when the grid drops. Somebody crossed a line upstream, and you will get a confusing bill.\" He settles back against the vinyl with both hands around his mug and waits, watching her.\n---\nA static camera sits at the end of the table and frames both of them from the chest up in a two-shot; the framing never changes. Live-action, shallow depth of field, fine 35mm grain. A man in his fifties with close-cropped grey hair, deep lines around the eyes and a heavy salt-and-pepper moustache, wearing a faded blue mechanic's jacket over a white t-shirt sits on one side of a late-night roadside diner booth: cracked red vinyl seats, a scratched formica table with two chipped white coffee mugs and a steel napkin dispenser, a rain-streaked window behind them reflecting an empty parking lot, and one warm pendant lamp directly above the table as the only light, the rest of the diner falling away into darkness. Across from him sits a woman in her late twenties with dark curly hair tied back, round wire-frame glasses and chipped green nail polish, wearing an oversized cream cable-knit sweater. Both of them sit exactly as they were, hands resting on the table, the mugs untouched. For the first couple of seconds neither speaks - one of them shifts their weight slightly and breathes - and only then the woman in the cream cable-knit sweater says, \"Then come and look at it yourself. Tomorrow, early, before the utility crew pulls the panel apart. There is nothing upstream of that meter but road.\" She settles back with both hands flat on the table and waits, watching him.",
0,
768,
1344,
243,
0,
"randomize",
14,
true,
"euler",
"beta",
true,
false,
1.5,
0.4,
0.35,
"match",
false,
"off"
]
},
{
"id": 9,
"type": "Note",
"pos": [
-340,
340
],
"size": [
600,
400
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [],
"outputs": [],
"title": "SAMPLER",
"color": "#432",
"bgcolor": "#653",
"properties": {},
"widgets_values": [
"SAMPLER\n\nscript: one prompt per shot, --- on its own line between shots.\n JSON {\"prompts\": [...]} is also accepted.\nshot_count: 0 = one shot per prompt; 1-8 forces the count.\nsize / frames / steps: driven by MASTER CONTROLS.\nsampler + scheduler: set here (euler + beta57 = the verified pair).\nseed_per_shot [ON]: leave it on - measured, per-shot seeds HOLD the\n face; a single seed for every shot drifted both face and voice.\nchain_gain_control: set to 'flatten' for chains past about 5 shots -\n texture ratchets roughly 1.3x per join otherwise.\nself_anchor_voice: pins shot 1's own voice into later shots. Needs a\n ref2va checkpoint; leave off on fl2va.\npreview_first_shot [ON]: writes shot 1 as soon as it decodes so a bad\n take can be cancelled before the whole chain renders."
]
},
{
"id": 10,
"type": "CreateVideo",
"pos": [
340,
-560
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 10
},
{
"name": "audio",
"type": "AUDIO",
"link": 11
}
],
"outputs": [
{
"name": "VIDEO",
"type": "VIDEO",
"links": [
13
],
"slot_index": 0
}
],
"title": "mux (fps must match the model's 24)",
"properties": {
"Node name for S&R": "CreateVideo"
},
"widgets_values": [
24.0,
8
]
},
{
"id": 11,
"type": "SaveVideo",
"pos": [
340,
-380
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "video",
"type": "VIDEO",
"link": 13
}
],
"outputs": [
{
"name": "video",
"type": "VIDEO",
"links": [],
"slot_index": 0
}
],
"title": "SAVE VIDEO",
"properties": {
"Node name for S&R": "SaveVideo"
},
"widgets_values": [
"video/H3CHAIN/core",
"auto",
"auto"
]
},
{
"id": 12,
"type": "SaveAudio",
"pos": [
340,
-180
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "audio",
"type": "AUDIO",
"link": 12
}
],
"outputs": [
{
"name": "audio",
"type": "AUDIO",
"links": [],
"slot_index": 0
}
],
"title": "SAVE AUDIO",
"properties": {
"Node name for S&R": "SaveAudio"
},
"widgets_values": [
"audio/H3CHAIN/core"
]
}
],
"links": [
[
1,
3,
0,
5,
0,
"MODEL"
],
[
2,
5,
0,
8,
0,
"MODEL"
],
[
3,
4,
0,
8,
1,
"CLIP"
],
[
4,
6,
0,
8,
2,
"VAE"
],
[
5,
7,
0,
8,
3,
"VAE"
],
[
6,
2,
0,
8,
9,
"INT"
],
[
7,
2,
1,
8,
10,
"INT"
],
[
8,
2,
2,
8,
11,
"INT"
],
[
9,
2,
3,
8,
12,
"INT"
],
[
10,
8,
0,
10,
0,
"IMAGE"
],
[
11,
8,
1,
10,
1,
"AUDIO"
],
[
12,
8,
1,
12,
0,
"AUDIO"
],
[
13,
10,
0,
11,
0,
"VIDEO"
]
],
"groups": [
{
"title": "MASTER",
"bounding": [
-1740,
-620,
660,
1000
],
"color": "#3f5159",
"font_size": 24
},
{
"title": "MODELS",
"bounding": [
-1040,
-620,
620,
1000
],
"color": "#3f5159",
"font_size": 24
},
{
"title": "SAMPLER",
"bounding": [
-380,
-620,
660,
1400
],
"color": "#A88",
"font_size": 24
},
{
"title": "OUTPUT",
"bounding": [
300,
-620,
460,
640
],
"color": "#8A8",
"font_size": 24
}
],
"config": {},
"extra": {},
"version": 0.4
}