gnosticdev commited on
Commit
07b3b3d
·
verified ·
1 Parent(s): 1672ed1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -25
app.py CHANGED
@@ -4,27 +4,33 @@ import gradio as gr
4
  from moviepy.editor import *
5
  import requests
6
  from datetime import datetime
 
7
 
8
- # 1. Configuración inicial
9
- PEXELS_API_KEY = os.getenv("PEXELS_API_KEY") # Configura esto en Hugging Face
10
 
11
- # 2. Lista de voces CORRECTA (formato válido para edge-tts)
12
  VOICES = [
13
- "es-MX-DaliaNeural", # Mujer México
14
- "es-ES-ElviraNeural", # Mujer España
15
- "es-AR-ElenaNeural", # Mujer Argentina
16
- "es-CO-SalomeNeural", # Mujer Colombia
17
- "en-US-JennyNeural", # Mujer EE.UU. (inglés)
18
- "fr-FR-DeniseNeural", # Mujer Francia (francés)
19
- "de-DE-KatjaNeural", # Mujer Alemania (alemán)
20
- "pt-BR-FranciscaNeural" # Mujer Brasil (portugués)
21
- # ¡Añade más si necesitas!
22
  ]
23
 
24
- # 3. Función principal (a prueba de errores)
 
 
 
 
 
 
 
 
 
 
 
25
  def generar_video(prompt, voz_seleccionada, musica=None):
26
  try:
27
- # A. Generar voz
28
  voz_archivo = "voz.mp3"
29
  subprocess.run([
30
  'edge-tts',
@@ -33,7 +39,7 @@ def generar_video(prompt, voz_seleccionada, musica=None):
33
  '--write-media', voz_archivo
34
  ], check=True)
35
 
36
- # B. Buscar videos en Pexels
37
  headers = {"Authorization": PEXELS_API_KEY}
38
  response = requests.get(
39
  f"https://api.pexels.com/videos/search?query={prompt[:50]}&per_page=2",
@@ -42,7 +48,19 @@ def generar_video(prompt, voz_seleccionada, musica=None):
42
  )
43
  videos = response.json().get("videos", [])
44
 
45
- # C. Procesar música
 
 
 
 
 
 
 
 
 
 
 
 
46
  audio = AudioFileClip(voz_archivo)
47
  if musica:
48
  musica_clip = AudioFileClip(musica.name)
@@ -50,8 +68,7 @@ def generar_video(prompt, voz_seleccionada, musica=None):
50
  musica_clip = musica_clip.loop(duration=audio.duration)
51
  audio = CompositeAudioClip([audio, musica_clip.volumex(0.3)])
52
 
53
- # D. Crear video
54
- clips = [VideoFileClip(v["video_files"][0]["link"]).subclip(0, 5) for v in videos[:2]]
55
  final_clip = concatenate_videoclips(clips).set_audio(audio)
56
  output_path = f"video_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"
57
  final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac", threads=2)
@@ -60,20 +77,24 @@ def generar_video(prompt, voz_seleccionada, musica=None):
60
  except Exception as e:
61
  print(f"ERROR: {str(e)}")
62
  return None
 
 
 
 
63
 
64
- # 4. Interfaz Gradio (simple pero efectiva)
65
  with gr.Blocks() as app:
66
- gr.Markdown("# 🎬 GENERADOR DE VIDEOS (ESTABLE)")
67
 
68
  with gr.Row():
69
  with gr.Column():
70
- prompt = gr.Textbox(label="Tema del video", placeholder="Ej: 'Lugares misteriosos de España'")
71
- voz = gr.Dropdown(label="Selecciona voz", choices=VOICES, value="es-ES-ElviraNeural")
72
  musica = gr.File(label="Música de fondo (opcional)", file_types=[".mp3"])
73
- btn = gr.Button("Generar Video", variant="primary")
74
 
75
  with gr.Column():
76
- output = gr.Video(label="Resultado", autoplay=True)
77
 
78
  btn.click(
79
  fn=generar_video,
@@ -81,4 +102,5 @@ with gr.Blocks() as app:
81
  outputs=output
82
  )
83
 
84
- app.launch(server_name="0.0.0.0", server_port=7860)
 
 
4
  from moviepy.editor import *
5
  import requests
6
  from datetime import datetime
7
+ import tempfile
8
 
9
+ # Configuración inicial
10
+ PEXELS_API_KEY = os.getenv("PEXELS_API_KEY") # Configurar en variables de entorno
11
 
12
+ # Lista de voces válidas
13
  VOICES = [
14
+ "es-MX-DaliaNeural", "es-ES-ElviraNeural",
15
+ "es-AR-ElenaNeural", "en-US-JennyNeural",
16
+ "fr-FR-DeniseNeural", "de-DE-KatjaNeural"
 
 
 
 
 
 
17
  ]
18
 
19
+ def descargar_video(url, output_path):
20
+ """Descarga un video y lo guarda localmente"""
21
+ try:
22
+ response = requests.get(url, stream=True, timeout=15)
23
+ with open(output_path, 'wb') as f:
24
+ for chunk in response.iter_content(chunk_size=1024*1024):
25
+ f.write(chunk)
26
+ return True
27
+ except Exception as e:
28
+ print(f"Error descargando video: {str(e)}")
29
+ return False
30
+
31
  def generar_video(prompt, voz_seleccionada, musica=None):
32
  try:
33
+ # 1. Generar voz
34
  voz_archivo = "voz.mp3"
35
  subprocess.run([
36
  'edge-tts',
 
39
  '--write-media', voz_archivo
40
  ], check=True)
41
 
42
+ # 2. Buscar videos en Pexels
43
  headers = {"Authorization": PEXELS_API_KEY}
44
  response = requests.get(
45
  f"https://api.pexels.com/videos/search?query={prompt[:50]}&per_page=2",
 
48
  )
49
  videos = response.json().get("videos", [])
50
 
51
+ # 3. Descargar y procesar videos
52
+ clips = []
53
+ for v in videos[:2]:
54
+ video_url = v["video_files"][0]["link"]
55
+ temp_video = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False)
56
+ if descargar_video(video_url, temp_video.name):
57
+ clip = VideoFileClip(temp_video.name).subclip(0, min(5, VideoFileClip(temp_video.name).duration))
58
+ clips.append(clip)
59
+
60
+ if not clips:
61
+ raise Exception("No se pudieron cargar videos válidos")
62
+
63
+ # 4. Procesar audio
64
  audio = AudioFileClip(voz_archivo)
65
  if musica:
66
  musica_clip = AudioFileClip(musica.name)
 
68
  musica_clip = musica_clip.loop(duration=audio.duration)
69
  audio = CompositeAudioClip([audio, musica_clip.volumex(0.3)])
70
 
71
+ # 5. Crear video final
 
72
  final_clip = concatenate_videoclips(clips).set_audio(audio)
73
  output_path = f"video_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"
74
  final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac", threads=2)
 
77
  except Exception as e:
78
  print(f"ERROR: {str(e)}")
79
  return None
80
+ finally:
81
+ # Limpieza
82
+ if os.path.exists(voz_archivo):
83
+ os.remove(voz_archivo)
84
 
85
+ # Interfaz Gradio
86
  with gr.Blocks() as app:
87
+ gr.Markdown("# 🎬 Generador de Videos Automático")
88
 
89
  with gr.Row():
90
  with gr.Column():
91
+ prompt = gr.Textbox(label="Tema del video")
92
+ voz = gr.Dropdown(label="Selección de voz", choices=VOICES, value="es-ES-ElviraNeural")
93
  musica = gr.File(label="Música de fondo (opcional)", file_types=[".mp3"])
94
+ btn = gr.Button("Generar Video")
95
 
96
  with gr.Column():
97
+ output = gr.Video(label="Resultado")
98
 
99
  btn.click(
100
  fn=generar_video,
 
102
  outputs=output
103
  )
104
 
105
+ if __name__ == "__main__":
106
+ app.launch(server_name="0.0.0.0", server_port=7860)