gnosticdev commited on
Commit
1672ed1
·
verified ·
1 Parent(s): 19224f2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -24
app.py CHANGED
@@ -5,12 +5,26 @@ from moviepy.editor import *
5
  import requests
6
  from datetime import datetime
7
 
8
- # Configuración inicial
9
- PEXELS_API_KEY = os.getenv("PEXELS_API_KEY") # Configurar en variables de entorno
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  def generar_video(prompt, voz_seleccionada, musica=None):
12
  try:
13
- # 1. Generar archivo de voz usando edge-tts
14
  voz_archivo = "voz.mp3"
15
  subprocess.run([
16
  'edge-tts',
@@ -19,7 +33,7 @@ def generar_video(prompt, voz_seleccionada, musica=None):
19
  '--write-media', voz_archivo
20
  ], check=True)
21
 
22
- # 2. Buscar videos en Pexels
23
  headers = {"Authorization": PEXELS_API_KEY}
24
  response = requests.get(
25
  f"https://api.pexels.com/videos/search?query={prompt[:50]}&per_page=2",
@@ -28,7 +42,7 @@ def generar_video(prompt, voz_seleccionada, musica=None):
28
  )
29
  videos = response.json().get("videos", [])
30
 
31
- # 3. Procesar audio
32
  audio = AudioFileClip(voz_archivo)
33
  if musica:
34
  musica_clip = AudioFileClip(musica.name)
@@ -36,7 +50,7 @@ def generar_video(prompt, voz_seleccionada, musica=None):
36
  musica_clip = musica_clip.loop(duration=audio.duration)
37
  audio = CompositeAudioClip([audio, musica_clip.volumex(0.3)])
38
 
39
- # 4. Crear video final
40
  clips = [VideoFileClip(v["video_files"][0]["link"]).subclip(0, 5) for v in videos[:2]]
41
  final_clip = concatenate_videoclips(clips).set_audio(audio)
42
  output_path = f"video_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"
@@ -44,31 +58,22 @@ def generar_video(prompt, voz_seleccionada, musica=None):
44
 
45
  return output_path
46
  except Exception as e:
47
- print(f"Error al generar video: {str(e)}")
48
  return None
49
 
50
- # Obtener lista de voces
51
- def obtener_voces():
52
- try:
53
- result = subprocess.run(['edge-tts', '--list-voices'],
54
- capture_output=True, text=True, check=True)
55
- return [line.split(' ')[0] for line in result.stdout.split('\n') if line]
56
- except:
57
- return ["es-MX-DaliaNeural", "es-ES-ElviraNeural"] # Fallback
58
-
59
- # Interfaz Gradio
60
  with gr.Blocks() 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 del video")
66
- voz = gr.Dropdown(label="Selección de voz", choices=obtener_voces())
67
  musica = gr.File(label="Música de fondo (opcional)", file_types=[".mp3"])
68
- btn = gr.Button("Generar Video")
69
 
70
  with gr.Column():
71
- output = gr.Video(label="Resultado")
72
 
73
  btn.click(
74
  fn=generar_video,
@@ -76,5 +81,4 @@ with gr.Blocks() as app:
76
  outputs=output
77
  )
78
 
79
- if __name__ == "__main__":
80
- app.launch(server_name="0.0.0.0", server_port=7860)
 
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
  '--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
  )
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
  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"
 
58
 
59
  return output_path
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
  outputs=output
82
  )
83
 
84
+ app.launch(server_name="0.0.0.0", server_port=7860)