diff --git a/movie_editor/frontend/engine_settings.js b/movie_editor/frontend/engine_settings.js index d251cd44..b529dede 100644 --- a/movie_editor/frontend/engine_settings.js +++ b/movie_editor/frontend/engine_settings.js @@ -229,7 +229,7 @@ { name: "anchor_shift", label: "Anchor shift (fake t2v)", kind: "bool", default: false, hint: "EXPERIMENTAL: keep the real, untouched i2v anchor — then delete it from the clip. The anchor is a pinned frame at position 0, so it holds character detail, style and composition better than anything that weakens it on the way in (ALG blurs it and loses detail; Best-FaceID tokens approximate it and lose some too), but it is also literally the first frame you see. This runs pass 1 down to the sigma below with the anchor pinned as normal, drops the first frames and slides everything left (clip length unchanged — no extra frames generated), then finishes the schedule with the pin gone. The result is an i2v generation that reads as t2v. Pass 2 re-enters through the model's own noise scaling, which is what keeps the shifted latent on-manifold. Skipped on continuation scenes and on scenes carrying guide frames or JoyAI audio memory, with the reason in the scene report. UNVALIDATED LIVE." }, { name: "anchor_shift_sigma", label: "Shift at sigma", kind: "float", default: 0.909, min: 0.05, max: 0.999, step: 0.001, dependsOn: "anchor_shift", - hint: "The knob this feature exists to let you tune. Pass 1 runs until the schedule first reaches this sigma, then the shift happens. 0.909 is where structure actually starts forming on the distilled schedule (1.0 and 0.975 are near-pure noise and carry almost no signal), so it's the earliest cut where the anchor has plausibly transferred anything — a starting guess, not a measured value. Higher = released sooner and cheaper, but the reference may never have landed. Lower = held longer, but more of pass 1's picture is thrown away by the slide and fewer steps remain to repair it." }, + hint: "The knob this feature exists to let you tune — in continue mode. (Rewind mode, i.e. any non-zero restart sigma below, runs pass 1 over the whole schedule and ignores this; the scene report says so.) Pass 1 runs until the schedule first reaches this sigma, then the shift happens. 0.909 is where structure actually starts forming on the distilled schedule (1.0 and 0.975 are near-pure noise and carry almost no signal), so it's the earliest cut where the anchor has plausibly transferred anything — a starting guess, not a measured value. Higher = released sooner and cheaper, but the reference may never have landed. Lower = held longer, but more of pass 1's picture is thrown away by the slide and fewer steps remain to repair it." }, { name: "anchor_shift_frames", label: "Frames to drop", kind: "int", default: 8, min: 8, max: 512, step: 8, dependsOn: "anchor_shift", hint: "How much of the front to drop at the shift, in real frames. 8 (one latent frame) removes just the anchor itself; more also removes the settling-in region where the shot is still visibly 'leaving' the reference still. Raise it if the opening still looks like it departed from a photo. The clip doesn't get shorter — whatever is dropped here is regrown at the end by pass 2." }, { name: "anchor_shift_restart_sigma", label: "Pass 2 restart sigma", kind: "float", default: 0.0, min: 0.0, max: 0.999, step: 0.001, dependsOn: "anchor_shift", diff --git a/samplers.py b/samplers.py index b795144c..8007c61b 100644 --- a/samplers.py +++ b/samplers.py @@ -2488,7 +2488,7 @@ class FunPackLTXAVSceneChainSampler: }), "anchor_shift_sigma": ("FLOAT", { "default": 0.909, "min": 0.05, "max": 0.999, "step": 0.001, - "tooltip": "Sigma at which pass 1 stops and the shift happens — the knob this whole feature exists to let you tune. Pass 1 runs until the schedule first reaches a sigma at or below this. 0.909 is the step where structure actually starts forming on the LTX distilled schedule (1.0 and 0.975 are the near-pure-noise plateau and carry almost no signal), so it is the earliest cut where the anchor has plausibly transferred anything — but it is a starting guess, not a measured value. Higher = anchor released sooner, cheaper, more likely the reference never really landed. Lower = anchor held longer, more of pass 1's picture is thrown away by the shift and fewer steps remain to repair it. If the schedule never reaches this sigma, the pass is skipped with a note.", + "tooltip": "Sigma at which pass 1 stops and the shift happens — the knob this whole feature exists to let you tune. ONLY used in continue mode (anchor_shift_restart_sigma=0); rewind mode runs pass 1 over the whole schedule and ignores this, which the scene report will tell you. Pass 1 runs until the schedule first reaches a sigma at or below this. 0.909 is the step where structure actually starts forming on the LTX distilled schedule (1.0 and 0.975 are the near-pure-noise plateau and carry almost no signal), so it is the earliest cut where the anchor has plausibly transferred anything — but it is a starting guess, not a measured value. Higher = anchor released sooner, cheaper, more likely the reference never really landed. Lower = anchor held longer, more of pass 1's picture is thrown away by the shift and fewer steps remain to repair it. If the schedule never reaches this sigma, the pass is skipped with a note.", }), "anchor_shift_frames": ("INT", { "default": 8, "min": 8, "max": 512, "step": 8, @@ -5507,6 +5507,15 @@ class FunPackLTXAVSceneChainSampler: f"dropped {_dropped} of {_pinned_n} pinned latent frames, " f"tail={anchor_shift_tail}" f"{', fresh audio' if anchor_shift_fresh_audio else ''})") + if not _resume: + # In rewind mode pass 1 runs the whole schedule, so anchor_shift_sigma + # never gets used. A knob that silently does nothing reads as broken — + # say so, and say what to set to make it matter again. + run_mechanisms.append( + f"anchor_shift NOTE: rewind mode ignores anchor_shift_sigma" + f"={anchor_shift_sigma:g} (pass 1 runs the full schedule so the " + f"re-noise has a clean latent). Set anchor_shift_restart_sigma=0 " + f"for continue mode, where the shift sigma is the cut point.") if _dropped < _pinned_n: # Part of the anchor survives the slide and stays visible in the clip — # the one outcome this feature exists to prevent, so name the fix.