Fix: Resolve Unit Clash between TTS chunks and video frames in Sequential Batcher

- Introduce `global_step_by_chunk` ghost variable initialized to `False` in `loop.py`
- Set `loop.global_step_by_chunk = True` in `AutoLoopCalculatorTTS` to indicate chunk mode
- Reset `loop.global_step_by_chunk = False` in video calculators (`AutoLoopCalculator`, `AutoLoopCalculatorWan`, `AutoLoopCalculatorLTX`) to ensure state resets
- Update `SessionImageSender.send_image` timeline management to branch logic, using `is_chunk_mode` to calculate progress differently for text chunks versus video frames
This commit is contained in:
Meisoftcoltd
2026-05-13 22:34:58 +00:00
parent db22f2ea3f
commit 6cd32fcfe9
3 changed files with 24 additions and 8 deletions
+15 -8
View File
@@ -179,17 +179,24 @@ class SessionImageSender:
is_final_chunk = getattr(loop, 'global_is_final_chunk', False)
# 🚀 FIX: Compensar los frames destruidos por el VAE en el ciclo final
if is_final_chunk:
_log(f" -> 🏁 LOTE FINAL ABSOLUTO DETECTADO. Compensando mermas del VAE (Timeline forzado al 100%).")
loop.global_accumulated_frames = source_total
else:
loop.global_accumulated_frames += advanced_original_frames
is_chunk_mode = getattr(loop, 'global_step_by_chunk', False)
# 🚀 NUEVO: Detectar si es el ciclo final o un ciclo único
is_final_cycle = loop.global_accumulated_frames >= source_total
if is_chunk_mode:
# En modo TTS (Texto), el progreso se mide estrictamente en frases/chunks, no en frames de video.
is_final_cycle = is_final_chunk
_log(f" -> 🧩 Modo Texto activo: Progreso gestionado por frases ({loop.global_accumulated_frames} / {source_total}).")
else:
# Lógica original por frames de video
if is_final_chunk:
_log(f" -> 🏁 LOTE FINAL ABSOLUTO DETECTADO. Compensando mermas del VAE (Timeline forzado al 100%).")
loop.global_accumulated_frames = source_total
else:
loop.global_accumulated_frames += advanced_original_frames
is_final_cycle = loop.global_accumulated_frames >= source_total
_log(f" -> 📈 Timeline avanzado a {loop.global_accumulated_frames} / {source_total} frames")
_log(f" -> ✂️ Tensor truncado a {frames_accepted} frames válidos.")
_log(f" -> 📈 Timeline avanzado a {loop.global_accumulated_frames} / {source_total}")
last_frame = valid_images[-1:].clone().cpu()
global_session_image = last_frame
+3
View File
@@ -13,6 +13,7 @@ global_source_frame_count = 1
global_select_every_nth = 1
global_server_port = 8188 # 💡 NUEVO: Única fuente de la verdad para el puerto
global_ltx_mode = False
global_step_by_chunk = False
@register_node
class SequentialLoopStart:
@@ -98,6 +99,8 @@ class AutoLoopCalculatorLTX:
import math
from . import loop
loop.global_step_by_chunk = False
potential_effective_frames = source_frame_count // select_every_nth
if potential_effective_frames < 9:
+6
View File
@@ -488,6 +488,8 @@ class AutoLoopCalculator:
import math
from . import loop
loop.global_step_by_chunk = False
potential_effective_frames = source_frame_count // select_every_nth
safe_effective_frames = potential_effective_frames # Sin restricciones
@@ -596,6 +598,8 @@ class AutoLoopCalculatorTTS:
from . import loop
loop.global_step_by_chunk = True
# 1. Separar el texto según el modo elegido
if split_mode == "Frases (Puntos)":
# PASO A: Separación cruda respetando todos los signos
@@ -806,6 +810,8 @@ class AutoLoopCalculatorWan:
import math
from . import loop
loop.global_step_by_chunk = False
# --- MEISOFT PATCH: Sincronización Matemática (Hold Last Frame) ---
# 1. Redondear hacia ARRIBA a la regla 4n+1 (Acolchado WanVideo)
potential_effective_frames = source_frame_count // select_every_nth