gnosticdev commited on
Commit
19224f2
verified
1 Parent(s): 518f669

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +40 -49
app.py CHANGED
@@ -1,55 +1,42 @@
1
  import os
2
- import asyncio
3
- import edge_tts
4
  import gradio as gr
5
  from moviepy.editor import *
6
- from transformers import pipeline
7
  import requests
8
  from datetime import datetime
9
 
10
- # 1. Configuraci贸n inicial
11
- VOICES = asyncio.run(edge_tts.list_voices())
12
- PEXELS_API_KEY = os.getenv("PEXELS_API_KEY")
13
 
14
- # 2. Generador de gui贸n
15
- def generar_guion(prompt):
16
  try:
17
- generator = pipeline("text-generation", model="facebook/mbart-large-50")
18
- return generator(
19
- f"Genera un guion sobre '{prompt}':",
20
- max_length=200,
21
- num_return_sequences=1
22
- )[0]['generated_text']
23
- except:
24
- return prompt # Fallback
25
-
26
- # 3. Funci贸n principal (sincr贸nica)
27
- def crear_video(prompt, script_personalizado, voz_seleccionada, musica=None):
28
- try:
29
- # A. Generar contenido
30
- guion = script_personalizado if script_personalizado else generar_guion(prompt)
31
-
32
- # B. Generar voz (soluci贸n sincr贸nica)
33
- os.system(f'edge-tts --voice "{voz_seleccionada}" --text "{guion}" --write-media "voz.mp3"')
34
 
35
- # C. Buscar videos en Pexels
36
  headers = {"Authorization": PEXELS_API_KEY}
37
- query = prompt[:50].replace(" ", "+")
38
- videos = requests.get(
39
- f"https://api.pexels.com/videos/search?query={query}&per_page=2",
40
  headers=headers,
41
- timeout=10
42
- ).json().get("videos", [])
 
43
 
44
- # D. Procesar m煤sica
45
- audio = AudioFileClip("voz.mp3")
46
  if musica:
47
  musica_clip = AudioFileClip(musica.name)
48
  if musica_clip.duration < audio.duration:
49
  musica_clip = musica_clip.loop(duration=audio.duration)
50
  audio = CompositeAudioClip([audio, musica_clip.volumex(0.3)])
51
 
52
- # E. Renderizar video
53
  clips = [VideoFileClip(v["video_files"][0]["link"]).subclip(0, 5) for v in videos[:2]]
54
  final_clip = concatenate_videoclips(clips).set_audio(audio)
55
  output_path = f"video_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"
@@ -57,33 +44,37 @@ def crear_video(prompt, script_personalizado, voz_seleccionada, musica=None):
57
 
58
  return output_path
59
  except Exception as e:
60
- print(f"ERROR: {str(e)}")
61
  return None
62
 
63
- # 4. Interfaz Gradio (versi贸n estable)
 
 
 
 
 
 
 
 
 
64
  with gr.Blocks() as app:
65
- gr.Markdown("# 馃幀 GENERADOR DE VIDEOS")
66
 
67
  with gr.Row():
68
  with gr.Column():
69
  prompt = gr.Textbox(label="Tema del video")
70
- script = gr.TextArea(label="Guion personalizado (opcional)", lines=5)
71
- voz = gr.Dropdown(
72
- label="Selecciona voz",
73
- choices=[v["Name"] for v in VOICES],
74
- value="es-ES-ElviraNeural"
75
- )
76
- musica = gr.File(label="M煤sica (opcional)", file_types=[".mp3"])
77
- btn = gr.Button("Generar Video", variant="primary")
78
 
79
  with gr.Column():
80
  output = gr.Video(label="Resultado")
81
 
82
  btn.click(
83
- fn=crear_video,
84
- inputs=[prompt, script, voz, musica],
85
  outputs=output
86
  )
87
 
88
- # 5. Lanzamiento SIN par谩metros conflictivos
89
- app.launch(server_name="0.0.0.0", server_port=7860)
 
1
  import os
2
+ import subprocess
 
3
  import gradio as gr
4
  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',
17
+ '--voice', voz_seleccionada,
18
+ '--text', prompt,
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",
 
26
  headers=headers,
27
+ timeout=15
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)
35
  if musica_clip.duration < audio.duration:
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
 
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,
75
+ inputs=[prompt, voz, musica],
76
  outputs=output
77
  )
78
 
79
+ if __name__ == "__main__":
80
+ app.launch(server_name="0.0.0.0", server_port=7860)