gnosticdev commited on
Commit
96a2f23
·
verified ·
1 Parent(s): 4a872de

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +120 -34
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("=" * 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,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
- with gr.Column():
860
- video_output = gr.Video(
861
- label="Previsualización del Video Generado",
862
- interactive=False,
863
- height=400
864
- )
865
- file_output = gr.File(
866
- label="Descargar Archivo de Video",
867
- interactive=False,
868
- visible=False
869
- )
870
- status_output = gr.Textbox(
871
- label="Estado",
872
- interactive=False,
873
- show_label=False,
874
- placeholder="Esperando acción...",
875
- value="Esperando entrada..."
876
- )
877
- progress_bar = gr.Slider(
878
- visible=False,
879
- interactive=False,
880
- label="Progreso",
881
- minimum=0,
882
- maximum=100
883
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
884
 
 
885
  prompt_type.change(
886
  lambda x: (gr.update(visible=x == "Generar Guion con IA"),
887
- gr.update(visible=x == "Usar Mi Guion")),
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