gnosticdev commited on
Commit
40236ce
·
verified ·
1 Parent(s): 65c7878

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -24
app.py CHANGED
@@ -1,4 +1,5 @@
1
  import os
 
2
  import edge_tts
3
  import gradio as gr
4
  from moviepy.editor import *
@@ -6,36 +7,37 @@ from transformers import pipeline
6
  import requests
7
  from datetime import datetime
8
 
9
- # 1. Configuración inicial
10
- PEXELS_API_KEY = os.getenv("PEXELS_API_KEY") # ¡Añade tu API Key en Hugging Face!
 
11
 
12
- # 2. Generar guion con IA (si no se proporciona uno manual)
13
  def generar_guion(prompt):
14
  generator = pipeline("text-generation", model="facebook/mbart-large-50")
15
  return generator(
16
- f"Genera un guion para video sobre '{prompt}' (4 puntos breves):",
17
  max_length=200,
18
  num_return_sequences=1
19
  )[0]['generated_text']
20
 
21
- # 3. Función principal para crear el video
22
- def crear_video(prompt, script_personalizado, voz, musica=None):
23
  try:
24
- # A. Usar guion personalizado o generar uno automático
25
  guion = script_personalizado if script_personalizado else generar_guion(prompt)
26
 
27
- # B. Generar voz (Edge-TTS)
28
- edge_tts.Communicate(guion, voice=voz).save("voz.mp3")
29
 
30
- # C. Buscar videos en Pexels (relacionados con el guion)
31
  headers = {"Authorization": PEXELS_API_KEY}
32
- query = guion[:50].replace(" ", "+") # Usar las primeras 50 palabras
33
  videos = requests.get(
34
  f"https://api.pexels.com/videos/search?query={query}&per_page=2",
35
  headers=headers
36
  ).json().get("videos", [])
37
 
38
- # D. Procesar música (hacer loop si es necesario)
39
  audio = AudioFileClip("voz.mp3")
40
  if musica:
41
  musica_clip = AudioFileClip(musica.name)
@@ -43,7 +45,7 @@ def crear_video(prompt, script_personalizado, voz, musica=None):
43
  musica_clip = musica_clip.loop(duration=audio.duration)
44
  audio = CompositeAudioClip([audio, musica_clip.volumex(0.3)])
45
 
46
- # E. Crear y exportar el video
47
  clips = [VideoFileClip(v["video_files"][0]["link"]).subclip(0, 5) for v in videos[:2]]
48
  final_clip = concatenate_videoclips(clips).set_audio(audio)
49
  output_path = f"video_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"
@@ -51,27 +53,27 @@ def crear_video(prompt, script_personalizado, voz, musica=None):
51
 
52
  return output_path
53
  except Exception as e:
54
- print(f"❌ Error: {e}")
55
  return None
56
 
57
- # 4. Interfaz de usuario (Gradio)
58
- with gr.Blocks(title="Generador de Videos") as app:
59
- gr.Markdown("# 🎥 Generador Automático de Videos")
60
 
61
  with gr.Row():
62
  with gr.Column():
63
- prompt = gr.Textbox(label="Tema del video", placeholder="Ej: 'Tecnología en 2024'")
64
- script = gr.TextArea(label="Guion personalizado (opcional)", lines=5)
65
  voz = gr.Dropdown(
66
- label="Selecciona una voz",
67
- choices=[v["Name"] for v in edge_tts.list_voices()],
68
  value="es-MX-DaliaNeural"
69
  )
70
- musica = gr.File(label="Música de fondo (opcional)", file_types=[".mp3"])
71
- btn = gr.Button("Generar Video", variant="primary")
72
 
73
  with gr.Column():
74
- output = gr.Video(label="Resultado", autoplay=True)
75
 
76
  btn.click(
77
  fn=crear_video,
 
1
  import os
2
+ import asyncio
3
  import edge_tts
4
  import gradio as gr
5
  from moviepy.editor import *
 
7
  import requests
8
  from datetime import datetime
9
 
10
+ # 1. CONFIGURACIÓN INICIAL (obtener voces sincrónicamente)
11
+ VOICES = asyncio.run(edge_tts.list_voices())
12
+ PEXELS_API_KEY = os.getenv("PEXELS_API_KEY") # Configura esto en Hugging Face
13
 
14
+ # 2. GENERADOR DE GUIÓN CON IA
15
  def generar_guion(prompt):
16
  generator = pipeline("text-generation", model="facebook/mbart-large-50")
17
  return generator(
18
+ f"Redacta un guion corto sobre '{prompt}' (4 puntos clave):",
19
  max_length=200,
20
  num_return_sequences=1
21
  )[0]['generated_text']
22
 
23
+ # 3. FUNCIÓN PRINCIPAL (sincronizada para Gradio)
24
+ def crear_video(prompt, script_personalizado, voz_seleccionada, musica=None):
25
  try:
26
+ # A. Generar guión
27
  guion = script_personalizado if script_personalizado else generar_guion(prompt)
28
 
29
+ # B. Generar voz (usando subprocess para evitar async)
30
+ os.system(f'edge-tts --voice "{voz_seleccionada}" --text "{guion}" --write-media "voz.mp3"')
31
 
32
+ # C. Buscar videos en Pexels
33
  headers = {"Authorization": PEXELS_API_KEY}
34
+ query = prompt[:50].replace(" ", "+")
35
  videos = requests.get(
36
  f"https://api.pexels.com/videos/search?query={query}&per_page=2",
37
  headers=headers
38
  ).json().get("videos", [])
39
 
40
+ # D. Procesar música
41
  audio = AudioFileClip("voz.mp3")
42
  if musica:
43
  musica_clip = AudioFileClip(musica.name)
 
45
  musica_clip = musica_clip.loop(duration=audio.duration)
46
  audio = CompositeAudioClip([audio, musica_clip.volumex(0.3)])
47
 
48
+ # E. Crear video final
49
  clips = [VideoFileClip(v["video_files"][0]["link"]).subclip(0, 5) for v in videos[:2]]
50
  final_clip = concatenate_videoclips(clips).set_audio(audio)
51
  output_path = f"video_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"
 
53
 
54
  return output_path
55
  except Exception as e:
56
+ print(f"ERROR: {str(e)}")
57
  return None
58
 
59
+ # 4. INTERFAZ GRADIO
60
+ with gr.Blocks(title="Generador de Videos PRO") as app:
61
+ gr.Markdown("# 🎥 GENERADOR DE VIDEOS AUTOMÁTICO")
62
 
63
  with gr.Row():
64
  with gr.Column():
65
+ prompt = gr.Textbox(label="📌 Tema principal", placeholder="Ej: 'Inteligencia Artificial en 2024'")
66
+ script = gr.TextArea(label="📝 Guion personalizado (opcional)", lines=5)
67
  voz = gr.Dropdown(
68
+ label="🗣️ Selecciona voz",
69
+ choices=[v["Name"] for v in VOICES],
70
  value="es-MX-DaliaNeural"
71
  )
72
+ musica = gr.File(label="🎵 Música de fondo (opcional)", file_types=[".mp3", ".wav"])
73
+ btn = gr.Button("🚀 GENERAR VIDEO", variant="primary")
74
 
75
  with gr.Column():
76
+ output = gr.Video(label="🎬 VIDEO RESULTANTE", autoplay=True)
77
 
78
  btn.click(
79
  fn=crear_video,