Spaces:
Running
Running
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.
|