Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -895,7 +895,7 @@ def run_app(prompt_type, prompt_ia, prompt_manual, musica_file):
|
|
895 |
|
896 |
|
897 |
# Interfaz de Gradio
|
898 |
-
with gr.Blocks(title="Generador de Videos con IA", theme=gr.themes.Soft(), css="""
|
899 |
.gradio-container {max-width: 800px; margin: auto;}
|
900 |
h1 {text-align: center;}
|
901 |
""") as app:
|
@@ -912,16 +912,18 @@ with gr.Blocks(title="Generador de Videos con IA", theme=gr.themes.Soft(), css="
|
|
912 |
)
|
913 |
|
914 |
# Contenedores para los campos de texto para controlar la visibilidad
|
915 |
-
#
|
916 |
with gr.Column(visible=True) as ia_guion_column:
|
917 |
prompt_ia = gr.Textbox(
|
918 |
label="Tema para IA",
|
919 |
lines=2,
|
920 |
-
placeholder="Ej: Un paisaje natural con montañas y ríos al amanecer
|
921 |
max_lines=4,
|
922 |
value=""
|
|
|
923 |
)
|
924 |
|
|
|
925 |
with gr.Column(visible=False) as manual_guion_column:
|
926 |
prompt_manual = gr.Textbox(
|
927 |
label="Tu Guion Completo",
|
@@ -929,6 +931,7 @@ with gr.Blocks(title="Generador de Videos con IA", theme=gr.themes.Soft(), css="
|
|
929 |
placeholder="Ej: En este video exploraremos los misterios del océano. Veremos la vida marina fascinante y los arrecifes de coral vibrantes. ¡Acompáñanos en esta aventura subacuática!",
|
930 |
max_lines=10,
|
931 |
value=""
|
|
|
932 |
)
|
933 |
|
934 |
musica_input = gr.Audio(
|
@@ -936,8 +939,20 @@ with gr.Blocks(title="Generador de Videos con IA", theme=gr.themes.Soft(), css="
|
|
936 |
type="filepath",
|
937 |
interactive=True,
|
938 |
value=None
|
|
|
939 |
)
|
940 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
941 |
generate_btn = gr.Button("✨ Generar Video", variant="primary")
|
942 |
|
943 |
with gr.Column():
|
@@ -945,11 +960,12 @@ with gr.Blocks(title="Generador de Videos con IA", theme=gr.themes.Soft(), css="
|
|
945 |
label="Previsualización del Video Generado",
|
946 |
interactive=False,
|
947 |
height=400
|
|
|
948 |
)
|
949 |
file_output = gr.File(
|
950 |
label="Descargar Archivo de Video",
|
951 |
interactive=False,
|
952 |
-
visible=False #
|
953 |
)
|
954 |
status_output = gr.Textbox(
|
955 |
label="Estado",
|
@@ -957,44 +973,39 @@ with gr.Blocks(title="Generador de Videos con IA", theme=gr.themes.Soft(), css="
|
|
957 |
show_label=False,
|
958 |
placeholder="Esperando acción...",
|
959 |
value="Esperando entrada..."
|
|
|
960 |
)
|
961 |
|
962 |
# Evento para mostrar/ocultar los campos de texto según el tipo de prompt
|
963 |
-
# Apuntar a los componentes Column padre para controlar la visibilidad
|
964 |
prompt_type.change(
|
965 |
lambda x: (gr.update(visible=x == "Generar Guion con IA"),
|
966 |
gr.update(visible=x == "Usar Mi Guion")),
|
967 |
inputs=prompt_type,
|
968 |
-
#
|
969 |
outputs=[ia_guion_column, manual_guion_column]
|
970 |
)
|
971 |
|
972 |
# Evento click del botón de generar video
|
973 |
generate_btn.click(
|
974 |
-
# Acción 1 (síncrona): Resetear salidas y establecer estado
|
975 |
-
# Retorna None para los 3 outputs iniciales
|
976 |
lambda: (None, None, gr.update(value="⏳ Procesando... Esto puede tomar varios minutos.", interactive=False)),
|
977 |
outputs=[video_output, file_output, status_output],
|
978 |
-
queue=True, # Usar la cola de Gradio
|
979 |
).then(
|
980 |
-
# Acción 2 (asíncrona): Llamar a la función principal
|
981 |
run_app,
|
982 |
-
# PASAR TODOS LOS INPUTS
|
983 |
-
|
984 |
-
|
|
|
985 |
outputs=[video_output, file_output, status_output]
|
986 |
).then(
|
987 |
-
# Acción 3 (síncrona): Hacer visible el enlace de descarga
|
988 |
-
# Esta función recibe las salidas de la Acción 2 (video_path, file_path, status_msg)
|
989 |
-
# Solo necesitamos video_path o file_path para decidir si mostrar el enlace
|
990 |
lambda video_path, file_path, status_msg: gr.update(visible=file_path is not None),
|
991 |
-
# Inputs son las salidas de la función .then() anterior
|
992 |
inputs=[video_output, file_output, status_output],
|
993 |
-
# Actualizamos la visibilidad del componente file_output
|
994 |
outputs=[file_output]
|
995 |
)
|
996 |
|
997 |
-
|
998 |
gr.Markdown("### Instrucciones:")
|
999 |
gr.Markdown("""
|
1000 |
1. **Clave API de Pexels:** Asegúrate de haber configurado la variable de entorno `PEXELS_API_KEY` con tu clave.
|
|
|
895 |
|
896 |
|
897 |
# Interfaz de Gradio
|
898 |
+
with gr.Blocks(title="Generador de Videos con IA", theme=gr.themes.Soft(), css="""
|
899 |
.gradio-container {max-width: 800px; margin: auto;}
|
900 |
h1 {text-align: center;}
|
901 |
""") as app:
|
|
|
912 |
)
|
913 |
|
914 |
# Contenedores para los campos de texto para controlar la visibilidad
|
915 |
+
# visible=True/False está aquí en la COLUMNA
|
916 |
with gr.Column(visible=True) as ia_guion_column:
|
917 |
prompt_ia = gr.Textbox(
|
918 |
label="Tema para IA",
|
919 |
lines=2,
|
920 |
+
placeholder="Ej: Un paisaje natural con montañas y ríos al amanecer...",
|
921 |
max_lines=4,
|
922 |
value=""
|
923 |
+
# visible=... <--- NO DEBE ESTAR AQUÍ
|
924 |
)
|
925 |
|
926 |
+
# visible=True/False está aquí en la COLUMNA
|
927 |
with gr.Column(visible=False) as manual_guion_column:
|
928 |
prompt_manual = gr.Textbox(
|
929 |
label="Tu Guion Completo",
|
|
|
931 |
placeholder="Ej: En este video exploraremos los misterios del océano. Veremos la vida marina fascinante y los arrecifes de coral vibrantes. ¡Acompáñanos en esta aventura subacuática!",
|
932 |
max_lines=10,
|
933 |
value=""
|
934 |
+
# visible=... <--- NO DEBE ESTAR AQUÍ
|
935 |
)
|
936 |
|
937 |
musica_input = gr.Audio(
|
|
|
939 |
type="filepath",
|
940 |
interactive=True,
|
941 |
value=None
|
942 |
+
# visible=... <--- NO DEBE ESTAR AQUÍ
|
943 |
)
|
944 |
|
945 |
+
# --- COMPONENTE: Selección de Voz ---
|
946 |
+
voice_dropdown = gr.Dropdown(
|
947 |
+
label="Seleccionar Voz para Guion",
|
948 |
+
choices=AVAILABLE_VOICES,
|
949 |
+
value=DEFAULT_VOICE,
|
950 |
+
interactive=True
|
951 |
+
# visible=... <--- NO DEBE ESTAR AQUÍ
|
952 |
+
)
|
953 |
+
# --- FIN COMPONENTE ---
|
954 |
+
|
955 |
+
|
956 |
generate_btn = gr.Button("✨ Generar Video", variant="primary")
|
957 |
|
958 |
with gr.Column():
|
|
|
960 |
label="Previsualización del Video Generado",
|
961 |
interactive=False,
|
962 |
height=400
|
963 |
+
# visible=... <--- NO DEBE ESTAR AQUÍ
|
964 |
)
|
965 |
file_output = gr.File(
|
966 |
label="Descargar Archivo de Video",
|
967 |
interactive=False,
|
968 |
+
visible=False # <-- ESTA BIEN AQUÍ porque su visibilidad se controla solo por el lambda posterior
|
969 |
)
|
970 |
status_output = gr.Textbox(
|
971 |
label="Estado",
|
|
|
973 |
show_label=False,
|
974 |
placeholder="Esperando acción...",
|
975 |
value="Esperando entrada..."
|
976 |
+
# visible=... <--- NO DEBE ESTAR AQUÍ
|
977 |
)
|
978 |
|
979 |
# Evento para mostrar/ocultar los campos de texto según el tipo de prompt
|
|
|
980 |
prompt_type.change(
|
981 |
lambda x: (gr.update(visible=x == "Generar Guion con IA"),
|
982 |
gr.update(visible=x == "Usar Mi Guion")),
|
983 |
inputs=prompt_type,
|
984 |
+
# APUNTAR A LAS COLUMNAS, esto está correcto
|
985 |
outputs=[ia_guion_column, manual_guion_column]
|
986 |
)
|
987 |
|
988 |
# Evento click del botón de generar video
|
989 |
generate_btn.click(
|
990 |
+
# Acción 1 (síncrona): Resetear salidas y establecer estado
|
|
|
991 |
lambda: (None, None, gr.update(value="⏳ Procesando... Esto puede tomar varios minutos.", interactive=False)),
|
992 |
outputs=[video_output, file_output, status_output],
|
993 |
+
queue=True, # Usar la cola de Gradio
|
994 |
).then(
|
995 |
+
# Acción 2 (asíncrona): Llamar a la función principal
|
996 |
run_app,
|
997 |
+
# PASAR TODOS LOS INPUTS RELEVANTES a run_app
|
998 |
+
# Esto parece que ahora sí debería coincidir con la definición de run_app con 5 argumentos
|
999 |
+
inputs=[prompt_type, prompt_ia, prompt_manual, musica_input, voice_dropdown],
|
1000 |
+
# run_app retornará los 3 outputs esperados
|
1001 |
outputs=[video_output, file_output, status_output]
|
1002 |
).then(
|
1003 |
+
# Acción 3 (síncrona): Hacer visible el enlace de descarga
|
|
|
|
|
1004 |
lambda video_path, file_path, status_msg: gr.update(visible=file_path is not None),
|
|
|
1005 |
inputs=[video_output, file_output, status_output],
|
|
|
1006 |
outputs=[file_output]
|
1007 |
)
|
1008 |
|
|
|
1009 |
gr.Markdown("### Instrucciones:")
|
1010 |
gr.Markdown("""
|
1011 |
1. **Clave API de Pexels:** Asegúrate de haber configurado la variable de entorno `PEXELS_API_KEY` con tu clave.
|