chore: deploy private lightloom build
Browse files- app.py +9 -7
- frontend/js/stage-scroll.js +1 -1
- scripts/shoot-mic-live.cjs +2 -2
app.py
CHANGED
|
@@ -145,7 +145,7 @@ def health() -> dict[str, Any]:
|
|
| 145 |
"privacy_mode": os.getenv("LIGHTLOOM_PRIVACY_MODE", "1") == "1",
|
| 146 |
"cpu_count": os.cpu_count(),
|
| 147 |
"director_backend": CONFIG.director_backend,
|
| 148 |
-
"build": "clean-scenes-
|
| 149 |
}
|
| 150 |
|
| 151 |
|
|
@@ -847,6 +847,7 @@ def scroll_session_frame(session: str, name: str):
|
|
| 847 |
# flowing in with low delay — no "record, stop, then render". ---
|
| 848 |
_SCROLL_ROOT = Path("/tmp/lightloom/scroll")
|
| 849 |
_LIVE_MAX = 24 # keep at most this many session dirs on disk; sweep the oldest
|
|
|
|
| 850 |
|
| 851 |
|
| 852 |
def _sweep_scroll_sessions(keep: int = _LIVE_MAX) -> None:
|
|
@@ -998,15 +999,16 @@ def _scroll_live_phrase(session: str, text: str, audio_b64: str, lang: str):
|
|
| 998 |
|
| 999 |
# overlap == seg means each strip carries the WHOLE previous strip as context (the max
|
| 1000 |
# available, since the stored strip is seg-wide); smoothness comes from the morph prompt.
|
| 1001 |
-
h, overlap, seg = 512,
|
| 1002 |
strips_per_phrase = 2 # fewer, wider strips per phrase
|
| 1003 |
-
# CLEAN per-strip outpaint
|
| 1004 |
-
# the
|
| 1005 |
-
#
|
| 1006 |
-
#
|
| 1007 |
try:
|
| 1008 |
for k in range(strips_per_phrase):
|
| 1009 |
-
|
|
|
|
| 1010 |
ctx = sec
|
| 1011 |
sec.save(out_dir / f"section-{g}.webp", "WEBP", quality=88)
|
| 1012 |
yield {
|
|
|
|
| 145 |
"privacy_mode": os.getenv("LIGHTLOOM_PRIVACY_MODE", "1") == "1",
|
| 146 |
"cpu_count": os.cpu_count(),
|
| 147 |
"director_backend": CONFIG.director_backend,
|
| 148 |
+
"build": "clean-scenes-3",
|
| 149 |
}
|
| 150 |
|
| 151 |
|
|
|
|
| 847 |
# flowing in with low delay — no "record, stop, then render". ---
|
| 848 |
_SCROLL_ROOT = Path("/tmp/lightloom/scroll")
|
| 849 |
_LIVE_MAX = 24 # keep at most this many session dirs on disk; sweep the oldest
|
| 850 |
+
_REANCHOR = 10 # repaint a fresh clean strip every N strips to reset autoregressive drift
|
| 851 |
|
| 852 |
|
| 853 |
def _sweep_scroll_sessions(keep: int = _LIVE_MAX) -> None:
|
|
|
|
| 999 |
|
| 1000 |
# overlap == seg means each strip carries the WHOLE previous strip as context (the max
|
| 1001 |
# available, since the stored strip is seg-wide); smoothness comes from the morph prompt.
|
| 1002 |
+
h, overlap, seg = 512, 256, 384 # wider strips, partial overlap -> propagates less drift
|
| 1003 |
strips_per_phrase = 2 # fewer, wider strips per phrase
|
| 1004 |
+
# CLEAN per-strip outpaint (no SLERP/SDEdit mushing — those degraded clarity). To stop
|
| 1005 |
+
# the long-session COLOR DRIFT of autoregressive outpainting, periodically RE-ANCHOR:
|
| 1006 |
+
# every _REANCHOR strips, repaint a FRESH clean strip from the prompt (ctx=None) so the
|
| 1007 |
+
# accumulated error resets; the organic feather + the stable session style hide the join.
|
| 1008 |
try:
|
| 1009 |
for k in range(strips_per_phrase):
|
| 1010 |
+
reanchor = g > 0 and g % _REANCHOR == 0
|
| 1011 |
+
sec = outpaint_right(pipe, None if reanchor else ctx, subject + style, seg_w=seg, height=h, overlap=overlap, steps=4, seed=200 + g * 3)
|
| 1012 |
ctx = sec
|
| 1013 |
sec.save(out_dir / f"section-{g}.webp", "WEBP", quality=88)
|
| 1014 |
yield {
|
frontend/js/stage-scroll.js
CHANGED
|
@@ -209,7 +209,7 @@ const Scroll = (() => {
|
|
| 209 |
mat.uniforms.uU0.value = scrollX / STRIP_W;
|
| 210 |
// 2.5D: a small depth wobble + a horizontal lean (near content leads the far)
|
| 211 |
mat.uniforms.uPar.value.set(rm ? 0 : 0.010 * Math.sin(t * 0.5), rm ? 0 : 0.006 * Math.sin(t * 0.37));
|
| 212 |
-
mat.uniforms.uLean.value = rm ? 0 : 0.
|
| 213 |
// focus = the section under the centre of the view -> caption
|
| 214 |
const centerX = scrollX + viewU * STRIP_W * 0.5;
|
| 215 |
let f = null;
|
|
|
|
| 209 |
mat.uniforms.uU0.value = scrollX / STRIP_W;
|
| 210 |
// 2.5D: a small depth wobble + a horizontal lean (near content leads the far)
|
| 211 |
mat.uniforms.uPar.value.set(rm ? 0 : 0.010 * Math.sin(t * 0.5), rm ? 0 : 0.006 * Math.sin(t * 0.37));
|
| 212 |
+
mat.uniforms.uLean.value = rm ? 0 : 0.011; // softer horizontal lean -> less seam offset between strips
|
| 213 |
// focus = the section under the centre of the view -> caption
|
| 214 |
const centerX = scrollX + viewU * STRIP_W * 0.5;
|
| 215 |
let f = null;
|
scripts/shoot-mic-live.cjs
CHANGED
|
@@ -72,8 +72,8 @@ const WAV = path.resolve(process.env.WAV || ".shots/narration.wav");
|
|
| 72 |
lastCount = st.count;
|
| 73 |
await page.screenshot({ path: shot("mic-live-" + Math.min(lastCount, 9) + ".png") });
|
| 74 |
}
|
| 75 |
-
if (i % 4 === 0) console.log("t=" + (i * 2 + 1) + "s", JSON.stringify({ count: st.count,
|
| 76 |
-
if (lastCount >= 15) break;
|
| 77 |
}
|
| 78 |
|
| 79 |
// stop narration
|
|
|
|
| 72 |
lastCount = st.count;
|
| 73 |
await page.screenshot({ path: shot("mic-live-" + Math.min(lastCount, 9) + ".png") });
|
| 74 |
}
|
| 75 |
+
if (i % 4 === 0) console.log("t=" + (i * 2 + 1) + "s", JSON.stringify({ count: st.count, sections: (st.sections||[]).length, pendingAhead: st.pendingAhead }));
|
| 76 |
+
if (lastCount >= (parseInt(process.env.TARGET || "15", 10))) break;
|
| 77 |
}
|
| 78 |
|
| 79 |
// stop narration
|