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:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user