@ignix-social/creator 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +57 -2
  2. package/dist/box-kit/comfyui/locks/linux-x64.txt +2409 -0
  3. package/dist/box-kit/comfyui/locks/macos-arm64.txt +2243 -0
  4. package/dist/box-kit/comfyui/locks/windows-x64.txt +2322 -0
  5. package/dist/box-kit/comfyui/recast/LICENSE-WAN.txt +201 -0
  6. package/dist/box-kit/comfyui/recast/people.py +115 -0
  7. package/dist/box-kit/comfyui/recast/persons.py +90 -0
  8. package/dist/box-kit/comfyui/recast/prep.py +204 -0
  9. package/dist/box-kit/comfyui/recast/wan_pose_draw.py +1368 -0
  10. package/dist/box-kit/comfyui/recast/wan_pose_utils.py +1160 -0
  11. package/dist/box-kit/comfyui/recast/wan_utils.py +227 -0
  12. package/dist/box-kit/comfyui/workflows/infinitetalk.v1.json +94 -0
  13. package/dist/box-kit/comfyui/workflows/wan22-i2v-14b.v1.json +112 -0
  14. package/dist/box-kit/comfyui/workflows/wan22-i2v.v1.json +62 -0
  15. package/dist/cli.cjs +23801 -0
  16. package/dist/core.cjs +63459 -0
  17. package/dist/sfx-kit/achievement.wav +0 -0
  18. package/dist/sfx-kit/applause.wav +0 -0
  19. package/dist/sfx-kit/aww.wav +0 -0
  20. package/dist/sfx-kit/boing.wav +0 -0
  21. package/dist/sfx-kit/bonk.wav +0 -0
  22. package/dist/sfx-kit/boo.wav +0 -0
  23. package/dist/sfx-kit/boom.wav +0 -0
  24. package/dist/sfx-kit/camera-shutter.wav +0 -0
  25. package/dist/sfx-kit/cash-register.wav +0 -0
  26. package/dist/sfx-kit/cheer.wav +0 -0
  27. package/dist/sfx-kit/clap-hit.wav +0 -0
  28. package/dist/sfx-kit/click.wav +0 -0
  29. package/dist/sfx-kit/clock-tick.wav +0 -0
  30. package/dist/sfx-kit/coffee-pour.wav +0 -0
  31. package/dist/sfx-kit/coin.wav +0 -0
  32. package/dist/sfx-kit/coins.wav +0 -0
  33. package/dist/sfx-kit/correct.wav +0 -0
  34. package/dist/sfx-kit/countdown-beep.wav +0 -0
  35. package/dist/sfx-kit/crickets.wav +0 -0
  36. package/dist/sfx-kit/ding.wav +0 -0
  37. package/dist/sfx-kit/door-bell.wav +0 -0
  38. package/dist/sfx-kit/door-knock.wav +0 -0
  39. package/dist/sfx-kit/error.wav +0 -0
  40. package/dist/sfx-kit/flash.wav +0 -0
  41. package/dist/sfx-kit/gasp.wav +0 -0
  42. package/dist/sfx-kit/glitch.wav +0 -0
  43. package/dist/sfx-kit/heartbeat.wav +0 -0
  44. package/dist/sfx-kit/honk.wav +0 -0
  45. package/dist/sfx-kit/impact.wav +0 -0
  46. package/dist/sfx-kit/laugh.wav +0 -0
  47. package/dist/sfx-kit/level-up.wav +0 -0
  48. package/dist/sfx-kit/message-received.wav +0 -0
  49. package/dist/sfx-kit/message-sent.wav +0 -0
  50. package/dist/sfx-kit/notification.wav +0 -0
  51. package/dist/sfx-kit/ooh.wav +0 -0
  52. package/dist/sfx-kit/page-turn.wav +0 -0
  53. package/dist/sfx-kit/paper-crumple.wav +0 -0
  54. package/dist/sfx-kit/pen-write.wav +0 -0
  55. package/dist/sfx-kit/phone-vibrate.wav +0 -0
  56. package/dist/sfx-kit/pop-clean.wav +0 -0
  57. package/dist/sfx-kit/pop.wav +0 -0
  58. package/dist/sfx-kit/punch.wav +0 -0
  59. package/dist/sfx-kit/record-scratch.wav +0 -0
  60. package/dist/sfx-kit/reverse-cymbal.wav +0 -0
  61. package/dist/sfx-kit/rimshot.wav +0 -0
  62. package/dist/sfx-kit/riser-short.wav +0 -0
  63. package/dist/sfx-kit/sad-trombone.wav +0 -0
  64. package/dist/sfx-kit/scroll.wav +0 -0
  65. package/dist/sfx-kit/slide-whistle.wav +0 -0
  66. package/dist/sfx-kit/snap.wav +0 -0
  67. package/dist/sfx-kit/sparkle.wav +0 -0
  68. package/dist/sfx-kit/splat.wav +0 -0
  69. package/dist/sfx-kit/squeak.wav +0 -0
  70. package/dist/sfx-kit/stamp.wav +0 -0
  71. package/dist/sfx-kit/stomp.wav +0 -0
  72. package/dist/sfx-kit/sub-drop.wav +0 -0
  73. package/dist/sfx-kit/success.wav +0 -0
  74. package/dist/sfx-kit/swipe.wav +0 -0
  75. package/dist/sfx-kit/swoosh-down.wav +0 -0
  76. package/dist/sfx-kit/swoosh-up.wav +0 -0
  77. package/dist/sfx-kit/tap.wav +0 -0
  78. package/dist/sfx-kit/tape-stop.wav +0 -0
  79. package/dist/sfx-kit/thud.wav +0 -0
  80. package/dist/sfx-kit/timer-end.wav +0 -0
  81. package/dist/sfx-kit/toggle.wav +0 -0
  82. package/dist/sfx-kit/typing-mobile.wav +0 -0
  83. package/dist/sfx-kit/typing-slow.wav +0 -0
  84. package/dist/sfx-kit/typing.wav +0 -0
  85. package/dist/sfx-kit/whoosh-fast.wav +0 -0
  86. package/dist/sfx-kit/whoosh-heavy.wav +0 -0
  87. package/dist/sfx-kit/whoosh-soft.wav +0 -0
  88. package/dist/sfx-kit/wow.wav +0 -0
  89. package/dist/sfx-kit/wrong.wav +0 -0
  90. package/dist/sfx-kit/zipper.wav +0 -0
  91. package/dist/sfx-kit/zoom-in.wav +0 -0
  92. package/package.json +32 -4
@@ -0,0 +1,227 @@
1
+ # Copyright 2024-2025 The Alibaba Wan Team Authors. All rights reserved.
2
+ # Modified by Ignix (2026-10-05) for Ignix Creator: file renamed, unchanged. Apache-2.0 (see LICENSE-WAN.txt).
3
+ import os
4
+ import cv2
5
+ import math
6
+ import random
7
+ import numpy as np
8
+
9
+ def get_mask_boxes(mask):
10
+ """
11
+
12
+ Args:
13
+ mask: [h, w]
14
+ Returns:
15
+
16
+ """
17
+ y_coords, x_coords = np.nonzero(mask)
18
+ x_min = x_coords.min()
19
+ x_max = x_coords.max()
20
+ y_min = y_coords.min()
21
+ y_max = y_coords.max()
22
+ bbox = np.array([x_min, y_min, x_max, y_max]).astype(np.int32)
23
+ return bbox
24
+
25
+
26
+ def get_aug_mask(body_mask, w_len=10, h_len=20):
27
+ body_bbox = get_mask_boxes(body_mask)
28
+
29
+ bbox_wh = body_bbox[2:4] - body_bbox[0:2]
30
+ w_slice = np.int32(bbox_wh[0] / w_len)
31
+ h_slice = np.int32(bbox_wh[1] / h_len)
32
+
33
+ for each_w in range(body_bbox[0], body_bbox[2], w_slice):
34
+ w_start = min(each_w, body_bbox[2])
35
+ w_end = min((each_w + w_slice), body_bbox[2])
36
+ # print(w_start, w_end)
37
+ for each_h in range(body_bbox[1], body_bbox[3], h_slice):
38
+ h_start = min(each_h, body_bbox[3])
39
+ h_end = min((each_h + h_slice), body_bbox[3])
40
+ if body_mask[h_start:h_end, w_start:w_end].sum() > 0:
41
+ body_mask[h_start:h_end, w_start:w_end] = 1
42
+
43
+ return body_mask
44
+
45
+ def get_mask_body_img(img_copy, hand_mask, k=7, iterations=1):
46
+ kernel = np.ones((k, k), np.uint8)
47
+ dilation = cv2.dilate(hand_mask, kernel, iterations=iterations)
48
+ mask_hand_img = img_copy * (1 - dilation[:, :, None])
49
+
50
+ return mask_hand_img, dilation
51
+
52
+
53
+ def get_face_bboxes(kp2ds, scale, image_shape, ratio_aug):
54
+ h, w = image_shape
55
+ kp2ds_face = kp2ds.copy()[23:91, :2]
56
+
57
+ min_x, min_y = np.min(kp2ds_face, axis=0)
58
+ max_x, max_y = np.max(kp2ds_face, axis=0)
59
+
60
+
61
+ initial_width = max_x - min_x
62
+ initial_height = max_y - min_y
63
+
64
+ initial_area = initial_width * initial_height
65
+
66
+ expanded_area = initial_area * scale
67
+
68
+ new_width = np.sqrt(expanded_area * (initial_width / initial_height))
69
+ new_height = np.sqrt(expanded_area * (initial_height / initial_width))
70
+
71
+ delta_width = (new_width - initial_width) / 2
72
+ delta_height = (new_height - initial_height) / 4
73
+
74
+ if ratio_aug:
75
+ if random.random() > 0.5:
76
+ delta_width += random.uniform(0, initial_width // 10)
77
+ else:
78
+ delta_height += random.uniform(0, initial_height // 10)
79
+
80
+ expanded_min_x = max(min_x - delta_width, 0)
81
+ expanded_max_x = min(max_x + delta_width, w)
82
+ expanded_min_y = max(min_y - 3 * delta_height, 0)
83
+ expanded_max_y = min(max_y + delta_height, h)
84
+
85
+ return [int(expanded_min_x), int(expanded_max_x), int(expanded_min_y), int(expanded_max_y)]
86
+
87
+
88
+ def calculate_new_size(orig_w, orig_h, target_area, divisor=64):
89
+
90
+ target_ratio = orig_w / orig_h
91
+
92
+ def check_valid(w, h):
93
+
94
+ if w <= 0 or h <= 0:
95
+ return False
96
+ return (w * h <= target_area and
97
+ w % divisor == 0 and
98
+ h % divisor == 0)
99
+
100
+ def get_ratio_diff(w, h):
101
+
102
+ return abs(w / h - target_ratio)
103
+
104
+ def round_to_64(value, round_up=False, divisor=64):
105
+
106
+ if round_up:
107
+ return divisor * ((value + (divisor - 1)) // divisor)
108
+ return divisor * (value // divisor)
109
+
110
+ possible_sizes = []
111
+
112
+ max_area_h = int(np.sqrt(target_area / target_ratio))
113
+ max_area_w = int(max_area_h * target_ratio)
114
+
115
+ max_h = round_to_64(max_area_h, round_up=True, divisor=divisor)
116
+ max_w = round_to_64(max_area_w, round_up=True, divisor=divisor)
117
+
118
+ for h in range(divisor, max_h + divisor, divisor):
119
+ ideal_w = h * target_ratio
120
+
121
+ w_down = round_to_64(ideal_w)
122
+ w_up = round_to_64(ideal_w, round_up=True)
123
+
124
+ for w in [w_down, w_up]:
125
+ if check_valid(w, h, divisor):
126
+ possible_sizes.append((w, h, get_ratio_diff(w, h)))
127
+
128
+ if not possible_sizes:
129
+ raise ValueError("Can not find suitable size")
130
+
131
+ possible_sizes.sort(key=lambda x: (-x[0] * x[1], x[2]))
132
+
133
+ best_w, best_h, _ = possible_sizes[0]
134
+ return int(best_w), int(best_h)
135
+
136
+
137
+ def resize_by_area(image, target_area, keep_aspect_ratio=True, divisor=64, padding_color=(0, 0, 0)):
138
+ h, w = image.shape[:2]
139
+ try:
140
+ new_w, new_h = calculate_new_size(w, h, target_area, divisor)
141
+ except:
142
+ aspect_ratio = w / h
143
+
144
+ if keep_aspect_ratio:
145
+ new_h = math.sqrt(target_area / aspect_ratio)
146
+ new_w = target_area / new_h
147
+ else:
148
+ new_w = new_h = math.sqrt(target_area)
149
+
150
+ new_w, new_h = int((new_w // divisor) * divisor), int((new_h // divisor) * divisor)
151
+
152
+ interpolation = cv2.INTER_AREA if (new_w * new_h < w * h) else cv2.INTER_LINEAR
153
+
154
+ resized_image = padding_resize(image, height=new_h, width=new_w, padding_color=padding_color,
155
+ interpolation=interpolation)
156
+ return resized_image
157
+
158
+
159
+ def padding_resize(img_ori, height=512, width=512, padding_color=(0, 0, 0), interpolation=cv2.INTER_LINEAR):
160
+ ori_height = img_ori.shape[0]
161
+ ori_width = img_ori.shape[1]
162
+ channel = img_ori.shape[2]
163
+
164
+ img_pad = np.zeros((height, width, channel))
165
+ if channel == 1:
166
+ img_pad[:, :, 0] = padding_color[0]
167
+ else:
168
+ img_pad[:, :, 0] = padding_color[0]
169
+ img_pad[:, :, 1] = padding_color[1]
170
+ img_pad[:, :, 2] = padding_color[2]
171
+
172
+ if (ori_height / ori_width) > (height / width):
173
+ new_width = int(height / ori_height * ori_width)
174
+ img = cv2.resize(img_ori, (new_width, height), interpolation=interpolation)
175
+ padding = int((width - new_width) / 2)
176
+ if len(img.shape) == 2:
177
+ img = img[:, :, np.newaxis]
178
+ img_pad[:, padding: padding + new_width, :] = img
179
+ else:
180
+ new_height = int(width / ori_width * ori_height)
181
+ img = cv2.resize(img_ori, (width, new_height), interpolation=interpolation)
182
+ padding = int((height - new_height) / 2)
183
+ if len(img.shape) == 2:
184
+ img = img[:, :, np.newaxis]
185
+ img_pad[padding: padding + new_height, :, :] = img
186
+
187
+ img_pad = np.uint8(img_pad)
188
+
189
+ return img_pad
190
+
191
+
192
+ def get_frame_indices(frame_num, video_fps, clip_length, train_fps):
193
+
194
+ start_frame = 0
195
+ times = np.arange(0, clip_length) / train_fps
196
+ frame_indices = start_frame + np.round(times * video_fps).astype(int)
197
+ frame_indices = np.clip(frame_indices, 0, frame_num - 1)
198
+
199
+ return frame_indices.tolist()
200
+
201
+
202
+ def get_face_bboxes(kp2ds, scale, image_shape):
203
+ h, w = image_shape
204
+ kp2ds_face = kp2ds.copy()[1:] * (w, h)
205
+
206
+ min_x, min_y = np.min(kp2ds_face, axis=0)
207
+ max_x, max_y = np.max(kp2ds_face, axis=0)
208
+
209
+ initial_width = max_x - min_x
210
+ initial_height = max_y - min_y
211
+
212
+ initial_area = initial_width * initial_height
213
+
214
+ expanded_area = initial_area * scale
215
+
216
+ new_width = np.sqrt(expanded_area * (initial_width / initial_height))
217
+ new_height = np.sqrt(expanded_area * (initial_height / initial_width))
218
+
219
+ delta_width = (new_width - initial_width) / 2
220
+ delta_height = (new_height - initial_height) / 4
221
+
222
+ expanded_min_x = max(min_x - delta_width, 0)
223
+ expanded_max_x = min(max_x + delta_width, w)
224
+ expanded_min_y = max(min_y - 3 * delta_height, 0)
225
+ expanded_max_y = min(max_y + delta_height, h)
226
+
227
+ return [int(expanded_min_x), int(expanded_max_x), int(expanded_min_y), int(expanded_max_y)]
@@ -0,0 +1,94 @@
1
+ {
2
+ "1": {
3
+ "class_type": "UNETLoader",
4
+ "inputs": {
5
+ "unet_name": "Wan2_1-I2V-14B-480p_fp8_e4m3fn_scaled_KJ.safetensors",
6
+ "weight_dtype": "default"
7
+ }
8
+ },
9
+ "2": {
10
+ "class_type": "LoraLoaderModelOnly",
11
+ "inputs": {
12
+ "model": ["1", 0],
13
+ "lora_name": "lightx2v_I2V_14B_480p_cfg_step_distill_rank64_bf16.safetensors",
14
+ "strength_model": 1
15
+ }
16
+ },
17
+ "3": {
18
+ "class_type": "CLIPLoader",
19
+ "inputs": {
20
+ "clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
21
+ "type": "wan",
22
+ "device": "default"
23
+ }
24
+ },
25
+ "4": { "class_type": "VAELoader", "inputs": { "vae_name": "Wan2_1_VAE_bf16.safetensors" } },
26
+ "5": {
27
+ "class_type": "ModelPatchLoader",
28
+ "inputs": { "name": "wan2.1_infiniteTalk_single_fp16.safetensors" }
29
+ },
30
+ "6": {
31
+ "class_type": "AudioEncoderLoader",
32
+ "inputs": { "audio_encoder_name": "wav2vec2-chinese-base_fp16.safetensors" }
33
+ },
34
+ "7": { "class_type": "LoadImage", "inputs": { "image": "{{image}}" } },
35
+ "8": { "class_type": "LoadAudio", "inputs": { "audio": "{{audio}}" } },
36
+ "9": {
37
+ "class_type": "AudioEncoderEncode",
38
+ "inputs": { "audio_encoder": ["6", 0], "audio": ["8", 0] }
39
+ },
40
+ "10": { "class_type": "CLIPTextEncode", "inputs": { "clip": ["3", 0], "text": "{{prompt}}" } },
41
+ "11": { "class_type": "ConditioningZeroOut", "inputs": { "conditioning": ["10", 0] } },
42
+ "12": {
43
+ "class_type": "WanInfiniteTalkToVideo",
44
+ "inputs": {
45
+ "mode": "single_speaker",
46
+ "model": ["2", 0],
47
+ "model_patch": ["5", 0],
48
+ "positive": ["10", 0],
49
+ "negative": ["11", 0],
50
+ "vae": ["4", 0],
51
+ "width": "{{width}}",
52
+ "height": "{{height}}",
53
+ "length": "{{frames}}",
54
+ "start_image": ["7", 0],
55
+ "audio_encoder_output_1": ["9", 0],
56
+ "motion_frame_count": 9,
57
+ "audio_scale": 1
58
+ }
59
+ },
60
+ "13": { "class_type": "KSamplerSelect", "inputs": { "sampler_name": "euler" } },
61
+ "14": {
62
+ "class_type": "CFGGuider",
63
+ "inputs": { "model": ["12", 0], "positive": ["12", 1], "negative": ["12", 2], "cfg": 1 }
64
+ },
65
+ "15": {
66
+ "class_type": "BasicScheduler",
67
+ "inputs": { "model": ["12", 0], "scheduler": "normal", "steps": 6, "denoise": 1 }
68
+ },
69
+ "16": { "class_type": "RandomNoise", "inputs": { "noise_seed": "{{seed}}" } },
70
+ "17": {
71
+ "class_type": "SamplerCustomAdvanced",
72
+ "inputs": {
73
+ "noise": ["16", 0],
74
+ "guider": ["14", 0],
75
+ "sampler": ["13", 0],
76
+ "sigmas": ["15", 0],
77
+ "latent_image": ["12", 3]
78
+ }
79
+ },
80
+ "18": { "class_type": "VAEDecode", "inputs": { "samples": ["17", 0], "vae": ["4", 0] } },
81
+ "19": {
82
+ "class_type": "CreateVideo",
83
+ "inputs": { "images": ["18", 0], "fps": 25, "audio": ["8", 0] }
84
+ },
85
+ "20": {
86
+ "class_type": "SaveVideo",
87
+ "inputs": {
88
+ "video": ["19", 0],
89
+ "filename_prefix": "creator/out",
90
+ "format": "auto",
91
+ "codec": "auto"
92
+ }
93
+ }
94
+ }
@@ -0,0 +1,112 @@
1
+ {
2
+ "1": {
3
+ "class_type": "UNETLoader",
4
+ "inputs": {
5
+ "unet_name": "wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors",
6
+ "weight_dtype": "default"
7
+ }
8
+ },
9
+ "2": {
10
+ "class_type": "UNETLoader",
11
+ "inputs": {
12
+ "unet_name": "wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors",
13
+ "weight_dtype": "default"
14
+ }
15
+ },
16
+ "3": {
17
+ "class_type": "LoraLoaderModelOnly",
18
+ "inputs": {
19
+ "model": ["1", 0],
20
+ "lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors",
21
+ "strength_model": 1
22
+ }
23
+ },
24
+ "4": {
25
+ "class_type": "LoraLoaderModelOnly",
26
+ "inputs": {
27
+ "model": ["2", 0],
28
+ "lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors",
29
+ "strength_model": 1
30
+ }
31
+ },
32
+ "5": { "class_type": "ModelSamplingSD3", "inputs": { "model": ["3", 0], "shift": 5 } },
33
+ "6": { "class_type": "ModelSamplingSD3", "inputs": { "model": ["4", 0], "shift": 5 } },
34
+ "7": {
35
+ "class_type": "CLIPLoader",
36
+ "inputs": {
37
+ "clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
38
+ "type": "wan",
39
+ "device": "default"
40
+ }
41
+ },
42
+ "8": { "class_type": "CLIPTextEncode", "inputs": { "clip": ["7", 0], "text": "{{prompt}}" } },
43
+ "9": {
44
+ "class_type": "CLIPTextEncode",
45
+ "inputs": {
46
+ "clip": ["7", 0],
47
+ "text": "static, frozen, blurry, low quality, jpeg artifacts, distorted, deformed hands, extra fingers, warped face, flicker, jitter, camera shake, new people entering, hands entering the frame, new objects appearing, text, subtitles, watermark, logo"
48
+ }
49
+ },
50
+ "10": { "class_type": "VAELoader", "inputs": { "vae_name": "Wan2_1_VAE_bf16.safetensors" } },
51
+ "11": { "class_type": "LoadImage", "inputs": { "image": "{{image}}" } },
52
+ "12": {
53
+ "class_type": "WanImageToVideo",
54
+ "inputs": {
55
+ "positive": ["8", 0],
56
+ "negative": ["9", 0],
57
+ "vae": ["10", 0],
58
+ "width": "{{width}}",
59
+ "height": "{{height}}",
60
+ "length": "{{frames}}",
61
+ "batch_size": 1,
62
+ "start_image": ["11", 0]
63
+ }
64
+ },
65
+ "13": {
66
+ "class_type": "KSamplerAdvanced",
67
+ "inputs": {
68
+ "model": ["5", 0],
69
+ "add_noise": "enable",
70
+ "noise_seed": "{{seed}}",
71
+ "steps": 4,
72
+ "cfg": 1,
73
+ "sampler_name": "euler",
74
+ "scheduler": "simple",
75
+ "positive": ["12", 0],
76
+ "negative": ["12", 1],
77
+ "latent_image": ["12", 2],
78
+ "start_at_step": 0,
79
+ "end_at_step": 2,
80
+ "return_with_leftover_noise": "enable"
81
+ }
82
+ },
83
+ "14": {
84
+ "class_type": "KSamplerAdvanced",
85
+ "inputs": {
86
+ "model": ["6", 0],
87
+ "add_noise": "disable",
88
+ "noise_seed": 0,
89
+ "steps": 4,
90
+ "cfg": 1,
91
+ "sampler_name": "euler",
92
+ "scheduler": "simple",
93
+ "positive": ["12", 0],
94
+ "negative": ["12", 1],
95
+ "latent_image": ["13", 0],
96
+ "start_at_step": 2,
97
+ "end_at_step": 10000,
98
+ "return_with_leftover_noise": "disable"
99
+ }
100
+ },
101
+ "15": { "class_type": "VAEDecode", "inputs": { "samples": ["14", 0], "vae": ["10", 0] } },
102
+ "16": { "class_type": "CreateVideo", "inputs": { "images": ["15", 0], "fps": 24 } },
103
+ "17": {
104
+ "class_type": "SaveVideo",
105
+ "inputs": {
106
+ "video": ["16", 0],
107
+ "filename_prefix": "creator/out",
108
+ "format": "auto",
109
+ "codec": "auto"
110
+ }
111
+ }
112
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "1": {
3
+ "class_type": "UNETLoader",
4
+ "inputs": { "unet_name": "wan2.2_ti2v_5B_fp16.safetensors", "weight_dtype": "default" }
5
+ },
6
+ "2": {
7
+ "class_type": "CLIPLoader",
8
+ "inputs": {
9
+ "clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
10
+ "type": "wan",
11
+ "device": "default"
12
+ }
13
+ },
14
+ "3": { "class_type": "VAELoader", "inputs": { "vae_name": "wan2.2_vae.safetensors" } },
15
+ "4": { "class_type": "ModelSamplingSD3", "inputs": { "model": ["1", 0], "shift": 8 } },
16
+ "5": { "class_type": "CLIPTextEncode", "inputs": { "clip": ["2", 0], "text": "{{prompt}}" } },
17
+ "6": {
18
+ "class_type": "CLIPTextEncode",
19
+ "inputs": {
20
+ "clip": ["2", 0],
21
+ "text": "static, frozen, blurry, low quality, jpeg artifacts, distorted, deformed hands, extra fingers, warped face, flicker, jitter, camera shake, new people entering, hands entering the frame, new objects appearing, text, subtitles, watermark, logo"
22
+ }
23
+ },
24
+ "7": { "class_type": "LoadImage", "inputs": { "image": "{{image}}" } },
25
+ "8": {
26
+ "class_type": "Wan22ImageToVideoLatent",
27
+ "inputs": {
28
+ "vae": ["3", 0],
29
+ "width": "{{width}}",
30
+ "height": "{{height}}",
31
+ "length": "{{frames}}",
32
+ "batch_size": 1,
33
+ "start_image": ["7", 0]
34
+ }
35
+ },
36
+ "9": {
37
+ "class_type": "KSampler",
38
+ "inputs": {
39
+ "model": ["4", 0],
40
+ "positive": ["5", 0],
41
+ "negative": ["6", 0],
42
+ "latent_image": ["8", 0],
43
+ "seed": "{{seed}}",
44
+ "steps": 20,
45
+ "cfg": 5,
46
+ "sampler_name": "uni_pc",
47
+ "scheduler": "simple",
48
+ "denoise": 1
49
+ }
50
+ },
51
+ "10": { "class_type": "VAEDecode", "inputs": { "samples": ["9", 0], "vae": ["3", 0] } },
52
+ "11": { "class_type": "CreateVideo", "inputs": { "images": ["10", 0], "fps": 24 } },
53
+ "12": {
54
+ "class_type": "SaveVideo",
55
+ "inputs": {
56
+ "video": ["11", 0],
57
+ "filename_prefix": "creator/out",
58
+ "format": "auto",
59
+ "codec": "auto"
60
+ }
61
+ }
62
+ }