Corregir problemas de generación de video - Corregido nombre del modelo AnimateDiff-Lightning-v1.0, evitado múltiples ejecuciones simultáneas, arreglado procesamiento de video con forma (batch, frames, height, width, channels)
Browse files
app.py
CHANGED
@@ -122,7 +122,7 @@ MODELS = {
|
|
122 |
},
|
123 |
"video": {
|
124 |
# ⚡ Modelos Rápidos (Optimizados para ZeroGPU)
|
125 |
-
"ByteDance/AnimateDiff-Lightning": "⚡ AnimateDiff Lightning (Más rápido)",
|
126 |
"cerspense/zeroscope_v2_576w": "⚡ Zeroscope v2 576w (Rápido)",
|
127 |
"damo-vilab/text-to-video-ms-1.7b": "⚡ Text-to-Video MS 1.7B (Rápido)",
|
128 |
|
@@ -150,6 +150,9 @@ MODELS = {
|
|
150 |
# Cache para los modelos
|
151 |
model_cache = {}
|
152 |
|
|
|
|
|
|
|
153 |
def load_text_model(model_name):
|
154 |
"""Cargar modelo de texto"""
|
155 |
if model_name not in model_cache:
|
@@ -546,7 +549,7 @@ def load_video_model(model_name):
|
|
546 |
|
547 |
# Modelos optimizados para velocidad
|
548 |
fast_models = [
|
549 |
-
"ByteDance/AnimateDiff-Lightning",
|
550 |
"cerspense/zeroscope_v2_576w",
|
551 |
"damo-vilab/text-to-video-ms-1.7b"
|
552 |
]
|
@@ -690,6 +693,15 @@ def load_video_model(model_name):
|
|
690 |
@spaces.GPU(compute_unit="gpu.t4.micro", timeout=60) # Timeout de 60 segundos para video
|
691 |
def generate_video(prompt, model_name, num_frames=16, num_inference_steps=20):
|
692 |
"""Generar video optimizado con ZeroGPU H200"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
693 |
try:
|
694 |
print(f"🎬 Iniciando generación de video...")
|
695 |
print(f"📝 Modelo: {model_name}")
|
@@ -811,9 +823,35 @@ def generate_video(prompt, model_name, num_frames=16, num_inference_steps=20):
|
|
811 |
return temp_path
|
812 |
|
813 |
elif len(video_frames.shape) == 5: # (batch, frames, height, width, channels)
|
814 |
-
# Tomar el primer batch
|
815 |
-
frames
|
816 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
817 |
else:
|
818 |
print(f"❌ Forma no reconocida: {video_frames.shape}")
|
819 |
return None
|
@@ -844,6 +882,11 @@ def generate_video(prompt, model_name, num_frames=16, num_inference_steps=20):
|
|
844 |
import traceback
|
845 |
traceback.print_exc()
|
846 |
raise Exception(f"Error generando video con {model_name}: {error_message}")
|
|
|
|
|
|
|
|
|
|
|
847 |
|
848 |
def generate_text(prompt, model_name, max_length=100):
|
849 |
"""Generar texto con el modelo seleccionado"""
|
@@ -1447,7 +1490,7 @@ with gr.Blocks(title="Modelos Libres de IA", theme=gr.themes.Soft()) as demo:
|
|
1447 |
with gr.Column():
|
1448 |
video_model = gr.Dropdown(
|
1449 |
choices=list(MODELS["video"].keys()),
|
1450 |
-
value="ByteDance/AnimateDiff-Lightning", # Modelo más rápido por defecto
|
1451 |
label="Modelo de Video",
|
1452 |
info="⚡ Modelos marcados son más rápidos"
|
1453 |
)
|
@@ -1483,8 +1526,8 @@ with gr.Blocks(title="Modelos Libres de IA", theme=gr.themes.Soft()) as demo:
|
|
1483 |
with gr.Column():
|
1484 |
# Información del modelo
|
1485 |
video_model_info = gr.Markdown(
|
1486 |
-
value="**Modelo:** ByteDance/AnimateDiff-Lightning\n\n"
|
1487 |
-
"⚡ AnimateDiff Lightning • Frames recomendados: 8-16 • "
|
1488 |
"Pasos recomendados: 10-20 • Velocidad: Muy rápida\n\n"
|
1489 |
"**Estado:** ✅ Disponible • **Optimizado para ZeroGPU**"
|
1490 |
)
|
@@ -1512,7 +1555,7 @@ with gr.Blocks(title="Modelos Libres de IA", theme=gr.themes.Soft()) as demo:
|
|
1512 |
# Función para actualizar info del modelo de video
|
1513 |
def update_video_model_info(model_name):
|
1514 |
model_descriptions = {
|
1515 |
-
"ByteDance/AnimateDiff-Lightning": "⚡ AnimateDiff Lightning • Frames recomendados: 8-16 • Pasos recomendados: 10-20 • Velocidad: Muy rápida",
|
1516 |
"cerspense/zeroscope_v2_576w": "⚡ Zeroscope v2 576w • Frames recomendados: 8-16 • Pasos recomendados: 10-20 • Velocidad: Rápida",
|
1517 |
"damo-vilab/text-to-video-ms-1.7b": "⚡ Text-to-Video MS 1.7B • Frames recomendados: 8-16 • Pasos recomendados: 10-20 • Velocidad: Rápida",
|
1518 |
"cerspense/zeroscope_v2_XL": "🎬 Zeroscope v2 XL • Frames recomendados: 12-24 • Pasos recomendados: 20-30 • Velocidad: Media",
|
|
|
122 |
},
|
123 |
"video": {
|
124 |
# ⚡ Modelos Rápidos (Optimizados para ZeroGPU)
|
125 |
+
"ByteDance/AnimateDiff-Lightning-v1.0": "⚡ AnimateDiff Lightning v1.0 (Más rápido)",
|
126 |
"cerspense/zeroscope_v2_576w": "⚡ Zeroscope v2 576w (Rápido)",
|
127 |
"damo-vilab/text-to-video-ms-1.7b": "⚡ Text-to-Video MS 1.7B (Rápido)",
|
128 |
|
|
|
150 |
# Cache para los modelos
|
151 |
model_cache = {}
|
152 |
|
153 |
+
# Variable para evitar múltiples ejecuciones simultáneas
|
154 |
+
video_generation_in_progress = False
|
155 |
+
|
156 |
def load_text_model(model_name):
|
157 |
"""Cargar modelo de texto"""
|
158 |
if model_name not in model_cache:
|
|
|
549 |
|
550 |
# Modelos optimizados para velocidad
|
551 |
fast_models = [
|
552 |
+
"ByteDance/AnimateDiff-Lightning-v1.0",
|
553 |
"cerspense/zeroscope_v2_576w",
|
554 |
"damo-vilab/text-to-video-ms-1.7b"
|
555 |
]
|
|
|
693 |
@spaces.GPU(compute_unit="gpu.t4.micro", timeout=60) # Timeout de 60 segundos para video
|
694 |
def generate_video(prompt, model_name, num_frames=16, num_inference_steps=20):
|
695 |
"""Generar video optimizado con ZeroGPU H200"""
|
696 |
+
global video_generation_in_progress
|
697 |
+
|
698 |
+
# Evitar múltiples ejecuciones simultáneas
|
699 |
+
if video_generation_in_progress:
|
700 |
+
print("⚠️ Ya hay una generación de video en progreso, esperando...")
|
701 |
+
return "⏳ Ya hay una generación de video en progreso. Espera a que termine."
|
702 |
+
|
703 |
+
video_generation_in_progress = True
|
704 |
+
|
705 |
try:
|
706 |
print(f"🎬 Iniciando generación de video...")
|
707 |
print(f"📝 Modelo: {model_name}")
|
|
|
823 |
return temp_path
|
824 |
|
825 |
elif len(video_frames.shape) == 5: # (batch, frames, height, width, channels)
|
826 |
+
# Tomar el primer batch y procesar correctamente
|
827 |
+
print("🔄 Procesando video con forma (batch, frames, height, width, channels)")
|
828 |
+
frames = video_frames[0] # Tomar el primer batch
|
829 |
+
|
830 |
+
# Convertir frames a formato de video
|
831 |
+
frames_list = []
|
832 |
+
for i in range(frames.shape[0]):
|
833 |
+
frame = frames[i]
|
834 |
+
# Asegurar que el frame esté en el rango correcto (0-255)
|
835 |
+
if frame.dtype == np.float32 or frame.dtype == np.float16:
|
836 |
+
frame = (frame * 255).astype(np.uint8)
|
837 |
+
frames_list.append(frame)
|
838 |
+
|
839 |
+
# Crear video a partir de frames
|
840 |
+
import imageio
|
841 |
+
import tempfile
|
842 |
+
import os
|
843 |
+
|
844 |
+
# Crear archivo temporal
|
845 |
+
with tempfile.NamedTemporaryFile(suffix='.mp4', delete=False) as tmp_file:
|
846 |
+
temp_path = tmp_file.name
|
847 |
+
|
848 |
+
# Guardar frames como video con FPS optimizado
|
849 |
+
fps = 8 if is_fast_model else 6
|
850 |
+
imageio.mimsave(temp_path, frames_list, fps=fps)
|
851 |
+
|
852 |
+
print(f"💾 Video guardado en: {temp_path}")
|
853 |
+
print(f"🎬 FPS del video: {fps}")
|
854 |
+
return temp_path
|
855 |
else:
|
856 |
print(f"❌ Forma no reconocida: {video_frames.shape}")
|
857 |
return None
|
|
|
882 |
import traceback
|
883 |
traceback.print_exc()
|
884 |
raise Exception(f"Error generando video con {model_name}: {error_message}")
|
885 |
+
|
886 |
+
finally:
|
887 |
+
# Siempre liberar la bandera al finalizar
|
888 |
+
video_generation_in_progress = False
|
889 |
+
print("✅ Generación de video completada, liberando recursos")
|
890 |
|
891 |
def generate_text(prompt, model_name, max_length=100):
|
892 |
"""Generar texto con el modelo seleccionado"""
|
|
|
1490 |
with gr.Column():
|
1491 |
video_model = gr.Dropdown(
|
1492 |
choices=list(MODELS["video"].keys()),
|
1493 |
+
value="ByteDance/AnimateDiff-Lightning-v1.0", # Modelo más rápido por defecto
|
1494 |
label="Modelo de Video",
|
1495 |
info="⚡ Modelos marcados son más rápidos"
|
1496 |
)
|
|
|
1526 |
with gr.Column():
|
1527 |
# Información del modelo
|
1528 |
video_model_info = gr.Markdown(
|
1529 |
+
value="**Modelo:** ByteDance/AnimateDiff-Lightning-v1.0\n\n"
|
1530 |
+
"⚡ AnimateDiff Lightning v1.0 • Frames recomendados: 8-16 • "
|
1531 |
"Pasos recomendados: 10-20 • Velocidad: Muy rápida\n\n"
|
1532 |
"**Estado:** ✅ Disponible • **Optimizado para ZeroGPU**"
|
1533 |
)
|
|
|
1555 |
# Función para actualizar info del modelo de video
|
1556 |
def update_video_model_info(model_name):
|
1557 |
model_descriptions = {
|
1558 |
+
"ByteDance/AnimateDiff-Lightning-v1.0": "⚡ AnimateDiff Lightning v1.0 • Frames recomendados: 8-16 • Pasos recomendados: 10-20 • Velocidad: Muy rápida",
|
1559 |
"cerspense/zeroscope_v2_576w": "⚡ Zeroscope v2 576w • Frames recomendados: 8-16 • Pasos recomendados: 10-20 • Velocidad: Rápida",
|
1560 |
"damo-vilab/text-to-video-ms-1.7b": "⚡ Text-to-Video MS 1.7B • Frames recomendados: 8-16 • Pasos recomendados: 10-20 • Velocidad: Rápida",
|
1561 |
"cerspense/zeroscope_v2_XL": "🎬 Zeroscope v2 XL • Frames recomendados: 12-24 • Pasos recomendados: 20-30 • Velocidad: Media",
|