prune failed churn-experiment hires modes (frozen/faint/converge); dropdown = subtle/medium/strong/spatial with tournament-informed tooltip
Browse files
nodes.py
CHANGED
|
@@ -1209,17 +1209,17 @@ class JoyEcho_Generate:
|
|
| 1209 |
}),
|
| 1210 |
"hires_denoise": (["subtle (1 step)", "medium (2 steps)",
|
| 1211 |
"strong (tenstrip 4-step)",
|
| 1212 |
-
"subtle (frozen noise, experimental)",
|
| 1213 |
-
"faint (1 step from 0.30)",
|
| 1214 |
-
"subtle-converge (3 shallow steps)",
|
| 1215 |
"spatial (LTX latent upsampler, no churn)"], {
|
| 1216 |
"default": "subtle (1 step)",
|
| 1217 |
-
"tooltip": "How
|
| 1218 |
-
"denoise
|
| 1219 |
-
"
|
| 1220 |
-
"
|
| 1221 |
-
"
|
| 1222 |
-
"
|
|
|
|
|
|
|
|
|
|
| 1223 |
}),
|
| 1224 |
},
|
| 1225 |
}
|
|
@@ -1966,16 +1966,10 @@ class JoyEcho_Generate:
|
|
| 1966 |
SIGMA_TAILS = {"subtle": [0.421875, 0.0], "medium": [0.725, 0.421875, 0.0],
|
| 1967 |
# tenstrip's published UPSCALE ladder (HF, ~Jul 1) -
|
| 1968 |
# purpose-built for a refine pass, unlike the generation
|
| 1969 |
-
# tails above.
|
| 1970 |
-
|
| 1971 |
-
#
|
| 1972 |
-
|
| 1973 |
-
# faint = less noise in, less residue out.
|
| 1974 |
-
# subtle-converge = extra steps confined to the shallow
|
| 1975 |
-
# range, with re-corruption REUSING the initial noise
|
| 1976 |
-
# field (randomness enters once; steps only converge).
|
| 1977 |
-
"faint": [0.30, 0.0],
|
| 1978 |
-
"subtle-converge": [0.421875, 0.28, 0.14, 0.0]}
|
| 1979 |
sigmas = SIGMA_TAILS.get(str(mode).split()[0].lower(), SIGMA_TAILS["subtle"])
|
| 1980 |
base_h, base_w = int(frames_list[0].shape[1]), int(frames_list[0].shape[2])
|
| 1981 |
th = max(32, int(round(base_h * factor / 32.0)) * 32)
|
|
@@ -2097,17 +2091,7 @@ class JoyEcho_Generate:
|
|
| 2097 |
# multiples of (WIN-OVL)=24 pixel frames = 3 latent frames,
|
| 2098 |
# so overlapping windows land on the same global indices.
|
| 2099 |
ls = min(int(round(s / 8.0)), shot_fields["v"][0].shape[1] - Fl)
|
| 2100 |
-
|
| 2101 |
-
# repeated for every VIDEO latent frame, so the single-step
|
| 2102 |
-
# residue becomes a static grain plate instead of per-frame
|
| 2103 |
-
# detail churn. Audio noise stays per-frame (refined audio
|
| 2104 |
-
# is discarded anyway).
|
| 2105 |
-
_frozen = "frozen" in str(mode).lower()
|
| 2106 |
-
if _frozen:
|
| 2107 |
-
nv = shot_fields["v"][0][:, :1].repeat(1, Fl, 1, 1, 1).to(
|
| 2108 |
-
device=device, dtype=_dt)
|
| 2109 |
-
else:
|
| 2110 |
-
nv = shot_fields["v"][0][:, ls:ls + Fl].to(device=device, dtype=_dt)
|
| 2111 |
na = shot_fields["a"][0][:, a0:a0 + Fa_w].to(device=device, dtype=_dt)
|
| 2112 |
s0 = torch.full((1, Fl), sigmas[0])
|
| 2113 |
sa0 = torch.full((1, Fa_w), sigmas[0])
|
|
@@ -2126,14 +2110,10 @@ class JoyEcho_Generate:
|
|
| 2126 |
if nxt > 0:
|
| 2127 |
# re-corruption noise from the step's shared field,
|
| 2128 |
# same global slice - never randn_like (that was
|
| 2129 |
-
# fresh unseeded noise per window per step in v1)
|
| 2130 |
-
|
| 2131 |
-
# randomness enters once, further steps only pull
|
| 2132 |
-
# structure toward a consistent answer.
|
| 2133 |
-
_ev = 0 if "converge" in str(mode).lower() else i_s + 1
|
| 2134 |
-
fnv = shot_fields["v"][_ev][:, ls:ls + Fl].to(
|
| 2135 |
device=device, dtype=_dt)
|
| 2136 |
-
fna = shot_fields["a"][
|
| 2137 |
device=device, dtype=_dt)
|
| 2138 |
nvs = nxt * torch.ones((1, Fl), device=device)
|
| 2139 |
nas = nxt * torch.ones((1, Fa_w), device=device)
|
|
|
|
| 1209 |
}),
|
| 1210 |
"hires_denoise": (["subtle (1 step)", "medium (2 steps)",
|
| 1211 |
"strong (tenstrip 4-step)",
|
|
|
|
|
|
|
|
|
|
| 1212 |
"spatial (LTX latent upsampler, no churn)"], {
|
| 1213 |
"default": "subtle (1 step)",
|
| 1214 |
+
"tooltip": "How the hires pass works. The three refine modes re-noise and "
|
| 1215 |
+
"re-denoise at target res - they SYNTHESIZE real detail but "
|
| 1216 |
+
"reshuffle fine texture slightly per frame (subtle = sigma 0.42 "
|
| 1217 |
+
"one step, most faithful; medium = 0.725 two steps; strong = "
|
| 1218 |
+
"tenstrip's 0.92/0.725/0.42 ladder, deepest). spatial = the LTX "
|
| 1219 |
+
"latent upsampler on the shot's own latents: deterministic, "
|
| 1220 |
+
"zero temporal churn, fixed 1.5x (hires_factor just enables "
|
| 1221 |
+
"it) - use heights whose /32 is EVEN (768, not 736) or it "
|
| 1222 |
+
"smears one edge.",
|
| 1223 |
}),
|
| 1224 |
},
|
| 1225 |
}
|
|
|
|
| 1966 |
SIGMA_TAILS = {"subtle": [0.421875, 0.0], "medium": [0.725, 0.421875, 0.0],
|
| 1967 |
# tenstrip's published UPSCALE ladder (HF, ~Jul 1) -
|
| 1968 |
# purpose-built for a refine pass, unlike the generation
|
| 1969 |
+
# tails above. (Shallower/frozen/reused-noise variants
|
| 1970 |
+
# were tested 2026-07-23 and removed: none reduced the
|
| 1971 |
+
# per-frame detail churn - see project notes.)
|
| 1972 |
+
"strong": [0.92, 0.725, 0.421875, 0.0]}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1973 |
sigmas = SIGMA_TAILS.get(str(mode).split()[0].lower(), SIGMA_TAILS["subtle"])
|
| 1974 |
base_h, base_w = int(frames_list[0].shape[1]), int(frames_list[0].shape[2])
|
| 1975 |
th = max(32, int(round(base_h * factor / 32.0)) * 32)
|
|
|
|
| 2091 |
# multiples of (WIN-OVL)=24 pixel frames = 3 latent frames,
|
| 2092 |
# so overlapping windows land on the same global indices.
|
| 2093 |
ls = min(int(round(s / 8.0)), shot_fields["v"][0].shape[1] - Fl)
|
| 2094 |
+
nv = shot_fields["v"][0][:, ls:ls + Fl].to(device=device, dtype=_dt)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2095 |
na = shot_fields["a"][0][:, a0:a0 + Fa_w].to(device=device, dtype=_dt)
|
| 2096 |
s0 = torch.full((1, Fl), sigmas[0])
|
| 2097 |
sa0 = torch.full((1, Fa_w), sigmas[0])
|
|
|
|
| 2110 |
if nxt > 0:
|
| 2111 |
# re-corruption noise from the step's shared field,
|
| 2112 |
# same global slice - never randn_like (that was
|
| 2113 |
+
# fresh unseeded noise per window per step in v1)
|
| 2114 |
+
fnv = shot_fields["v"][i_s + 1][:, ls:ls + Fl].to(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2115 |
device=device, dtype=_dt)
|
| 2116 |
+
fna = shot_fields["a"][i_s + 1][:, a0:a0 + Fa_w].to(
|
| 2117 |
device=device, dtype=_dt)
|
| 2118 |
nvs = nxt * torch.ones((1, Fl), device=device)
|
| 2119 |
nas = nxt * torch.ones((1, Fa_w), device=device)
|