Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -811,7 +811,7 @@ def crear_video(prompt_type, input_text, musica_file=None):
|
|
811 |
logger.warning(f"No se pudo eliminar directorio temporal {temp_dir_intermediate}: {str(e)}")
|
812 |
|
813 |
def run_app(prompt_type, prompt_ia, prompt_manual, musica_file):
|
814 |
-
logger.info("="
|
815 |
logger.info("SOLICITUD RECIBIDA EN INTERFAZ")
|
816 |
|
817 |
input_text = prompt_ia if prompt_type == "Generar Guion con IA" else prompt_manual
|
@@ -856,43 +856,90 @@ def run_app(prompt_type, prompt_ia, prompt_manual, musica_file):
|
|
856 |
logger.info("Fin del handler run_app.")
|
857 |
return output_video, output_file, status_msg
|
858 |
|
859 |
-
|
860 |
-
|
861 |
-
|
862 |
-
|
863 |
-
|
864 |
-
|
865 |
-
|
866 |
-
|
867 |
-
|
868 |
-
|
869 |
-
|
870 |
-
|
871 |
-
|
872 |
-
|
873 |
-
|
874 |
-
|
875 |
-
|
876 |
-
|
877 |
-
|
878 |
-
|
879 |
-
|
880 |
-
|
881 |
-
|
882 |
-
|
883 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
884 |
|
|
|
885 |
prompt_type.change(
|
886 |
lambda x: (gr.update(visible=x == "Generar Guion con IA"),
|
887 |
-
|
888 |
inputs=prompt_type,
|
889 |
outputs=[ia_guion_column, manual_guion_column]
|
890 |
)
|
891 |
|
892 |
generate_btn.click(
|
893 |
lambda: (
|
894 |
-
None,
|
895 |
-
None,
|
896 |
gr.update(value="⏳ Procesando... Esto puede tomar varios minutos.", interactive=False),
|
897 |
gr.update(visible=True, value=0)
|
898 |
),
|
@@ -907,13 +954,52 @@ def run_app(prompt_type, prompt_ia, prompt_manual, musica_file):
|
|
907 |
outputs=[progress_bar]
|
908 |
)
|
909 |
|
|
|
910 |
gr.Markdown("### Instrucciones:")
|
911 |
gr.Markdown("""
|
912 |
1. **Clave API de Pexels:** Asegúrate de haber configurado la variable de entorno `PEXELS_API_KEY` con tu clave.
|
913 |
-
2. Para usar tu propio guion: Selecciona "Usar Mi Guion" y escribe tu texto completo
|
914 |
-
3. Para generar guion automático: Selecciona "Generar Guion con IA" y escribe un tema breve
|
915 |
-
4. Opcional: Sube un archivo de audio para música de fondo
|
916 |
-
5. Haz clic en "Generar Video" y espera el resultado (puede tardar varios minutos)
|
917 |
""")
|
918 |
gr.Markdown("---")
|
919 |
-
gr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
811 |
logger.warning(f"No se pudo eliminar directorio temporal {temp_dir_intermediate}: {str(e)}")
|
812 |
|
813 |
def run_app(prompt_type, prompt_ia, prompt_manual, musica_file):
|
814 |
+
logger.info("="*80)
|
815 |
logger.info("SOLICITUD RECIBIDA EN INTERFAZ")
|
816 |
|
817 |
input_text = prompt_ia if prompt_type == "Generar Guion con IA" else prompt_manual
|
|
|
856 |
logger.info("Fin del handler run_app.")
|
857 |
return output_video, output_file, status_msg
|
858 |
|
859 |
+
# AQUÍ COMIENZA LA PARTE DE LA INTERFAZ GRADIO
|
860 |
+
with gr.Blocks(title="Generador de Videos con IA", theme=gr.themes.Soft(), css="""
|
861 |
+
.gradio-container {max-width: 800px; margin: auto;}
|
862 |
+
h1 {text-align: center;}
|
863 |
+
.progress-bar {height: 20px!important;}
|
864 |
+
""") as app:
|
865 |
+
|
866 |
+
gr.Markdown("# 🎬 Generador Automático de Videos con IA")
|
867 |
+
gr.Markdown("Genera videos cortos a partir de un tema o guion, usando imágenes de archivo de Pexels y voz generada.")
|
868 |
+
|
869 |
+
with gr.Row():
|
870 |
+
with gr.Column():
|
871 |
+
prompt_type = gr.Radio(
|
872 |
+
["Generar Guion con IA", "Usar Mi Guion"],
|
873 |
+
label="Método de Entrada",
|
874 |
+
value="Generar Guion con IA"
|
875 |
+
)
|
876 |
+
|
877 |
+
with gr.Column(visible=True) as ia_guion_column:
|
878 |
+
prompt_ia = gr.Textbox(
|
879 |
+
label="Tema para IA",
|
880 |
+
lines=2,
|
881 |
+
placeholder="Ej: Un paisaje natural con montañas y ríos al amanecer, mostrando la belleza de la naturaleza...",
|
882 |
+
max_lines=4,
|
883 |
+
value=""
|
884 |
+
)
|
885 |
+
|
886 |
+
with gr.Column(visible=False) as manual_guion_column:
|
887 |
+
prompt_manual = gr.Textbox(
|
888 |
+
label="Tu Guion Completo",
|
889 |
+
lines=5,
|
890 |
+
placeholder="Ej: En este video exploraremos los misterios del océano. Veremos la vida marina fascinante y los arrecifes de coral vibrantes. ¡Acompáñamos en esta aventura subacuática!",
|
891 |
+
max_lines=10,
|
892 |
+
value=""
|
893 |
+
)
|
894 |
+
|
895 |
+
musica_input = gr.Audio(
|
896 |
+
label="Música de fondo (opcional)",
|
897 |
+
type="filepath",
|
898 |
+
interactive=True,
|
899 |
+
value=None
|
900 |
+
)
|
901 |
+
|
902 |
+
generate_btn = gr.Button("✨ Generar Video", variant="primary")
|
903 |
+
|
904 |
+
# COLUMNA DE SALIDA
|
905 |
+
with gr.Column():
|
906 |
+
video_output = gr.Video(
|
907 |
+
label="Previsualización del Video Generado",
|
908 |
+
interactive=False,
|
909 |
+
height=400
|
910 |
+
)
|
911 |
+
file_output = gr.File(
|
912 |
+
label="Descargar Archivo de Video",
|
913 |
+
interactive=False,
|
914 |
+
visible=False
|
915 |
+
)
|
916 |
+
status_output = gr.Textbox(
|
917 |
+
label="Estado",
|
918 |
+
interactive=False,
|
919 |
+
show_label=False,
|
920 |
+
placeholder="Esperando acción...",
|
921 |
+
value="Esperando entrada..."
|
922 |
+
)
|
923 |
+
progress_bar = gr.Slider(
|
924 |
+
visible=False,
|
925 |
+
interactive=False,
|
926 |
+
label="Progreso",
|
927 |
+
minimum=0,
|
928 |
+
maximum=100
|
929 |
+
)
|
930 |
|
931 |
+
# MANEJADORES DE EVENTOS
|
932 |
prompt_type.change(
|
933 |
lambda x: (gr.update(visible=x == "Generar Guion con IA"),
|
934 |
+
gr.update(visible=x == "Usar Mi Guion")),
|
935 |
inputs=prompt_type,
|
936 |
outputs=[ia_guion_column, manual_guion_column]
|
937 |
)
|
938 |
|
939 |
generate_btn.click(
|
940 |
lambda: (
|
941 |
+
None,
|
942 |
+
None,
|
943 |
gr.update(value="⏳ Procesando... Esto puede tomar varios minutos.", interactive=False),
|
944 |
gr.update(visible=True, value=0)
|
945 |
),
|
|
|
954 |
outputs=[progress_bar]
|
955 |
)
|
956 |
|
957 |
+
# INSTRUCCIONES
|
958 |
gr.Markdown("### Instrucciones:")
|
959 |
gr.Markdown("""
|
960 |
1. **Clave API de Pexels:** Asegúrate de haber configurado la variable de entorno `PEXELS_API_KEY` con tu clave.
|
961 |
+
2. Para usar tu propio guion: Selecciona "Usar Mi Guion" y escribe tu texto completo
|
962 |
+
3. Para generar guion automático: Selecciona "Generar Guion con IA" y escribe un tema breve
|
963 |
+
4. Opcional: Sube un archivo de audio para música de fondo
|
964 |
+
5. Haz clic en "Generar Video" y espera el resultado (puede tardar varios minutos)
|
965 |
""")
|
966 |
gr.Markdown("---")
|
967 |
+
gr.Markdown("Desarrollado con ❤️ usando Python, Gradio, MoviePy y modelos de IA")
|
968 |
+
|
969 |
+
# BLOQUE PRINCIPAL DE EJECUCIÓN
|
970 |
+
if __name__ == "__main__":
|
971 |
+
logger.info("Verificando dependencias críticas...")
|
972 |
+
try:
|
973 |
+
from moviepy.editor import ColorClip
|
974 |
+
try:
|
975 |
+
temp_clip = ColorClip((100,100), color=(255,0,0), duration=0.1)
|
976 |
+
temp_clip.close()
|
977 |
+
logger.info("Clips base de MoviePy (como ColorClip) creados y cerrados exitosamente. FFmpeg parece accesible.")
|
978 |
+
except Exception as e:
|
979 |
+
logger.critical(f"Fallo al crear clip base de MoviePy. A menudo indica problemas con FFmpeg/ImageMagick. Error: {e}", exc_info=True)
|
980 |
+
|
981 |
+
except Exception as e:
|
982 |
+
logger.critical(f"Fallo al importar MoviePy. Asegúrate de que está instalado. Error: {e}", exc_info=True)
|
983 |
+
|
984 |
+
logger.info("Iniciando aplicación Gradio...")
|
985 |
+
try:
|
986 |
+
app.queue(
|
987 |
+
concurrency_count=1,
|
988 |
+
max_size=3,
|
989 |
+
api_open=False
|
990 |
+
).launch(
|
991 |
+
debug=True,
|
992 |
+
share=True,
|
993 |
+
server_name="0.0.0.0",
|
994 |
+
server_port=7860,
|
995 |
+
show_error=True,
|
996 |
+
prevent_thread_lock=True,
|
997 |
+
enable_queue=True,
|
998 |
+
inline=False,
|
999 |
+
auth=None,
|
1000 |
+
auth_message=None,
|
1001 |
+
show_tips=False
|
1002 |
+
)
|
1003 |
+
except Exception as e:
|
1004 |
+
logger.critical(f"No se pudo iniciar la app: {str(e)}", exc_info=True)
|
1005 |
+
raise
|