Spaces:
Sleeping
Sleeping
File size: 2,815 Bytes
43fcbe8 19224f2 8337d0b c9d2e08 dd712f9 19224f2 720c3d5 19224f2 c7b9a72 19224f2 8337d0b 19224f2 8337d0b 19224f2 c7b9a72 19224f2 8337d0b 19224f2 8337d0b 19224f2 8337d0b fa201eb 19224f2 720c3d5 c9d2e08 19224f2 518f669 19224f2 d7f3a60 720c3d5 518f669 19224f2 8337d0b 720c3d5 518f669 8337d0b 19224f2 518f669 9e5ee0a d7f3a60 19224f2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
import os
import subprocess
import gradio as gr
from moviepy.editor import *
import requests
from datetime import datetime
# Configuración inicial
PEXELS_API_KEY = os.getenv("PEXELS_API_KEY") # Configurar en variables de entorno
def generar_video(prompt, voz_seleccionada, musica=None):
try:
# 1. Generar archivo de voz usando edge-tts
voz_archivo = "voz.mp3"
subprocess.run([
'edge-tts',
'--voice', voz_seleccionada,
'--text', prompt,
'--write-media', voz_archivo
], check=True)
# 2. Buscar videos en Pexels
headers = {"Authorization": PEXELS_API_KEY}
response = requests.get(
f"https://api.pexels.com/videos/search?query={prompt[:50]}&per_page=2",
headers=headers,
timeout=15
)
videos = response.json().get("videos", [])
# 3. Procesar audio
audio = AudioFileClip(voz_archivo)
if musica:
musica_clip = AudioFileClip(musica.name)
if musica_clip.duration < audio.duration:
musica_clip = musica_clip.loop(duration=audio.duration)
audio = CompositeAudioClip([audio, musica_clip.volumex(0.3)])
# 4. Crear video final
clips = [VideoFileClip(v["video_files"][0]["link"]).subclip(0, 5) for v in videos[:2]]
final_clip = concatenate_videoclips(clips).set_audio(audio)
output_path = f"video_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"
final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac", threads=2)
return output_path
except Exception as e:
print(f"Error al generar video: {str(e)}")
return None
# Obtener lista de voces
def obtener_voces():
try:
result = subprocess.run(['edge-tts', '--list-voices'],
capture_output=True, text=True, check=True)
return [line.split(' ')[0] for line in result.stdout.split('\n') if line]
except:
return ["es-MX-DaliaNeural", "es-ES-ElviraNeural"] # Fallback
# Interfaz Gradio
with gr.Blocks() as app:
gr.Markdown("# 🎥 Generador de Videos Automático")
with gr.Row():
with gr.Column():
prompt = gr.Textbox(label="Tema del video")
voz = gr.Dropdown(label="Selección de voz", choices=obtener_voces())
musica = gr.File(label="Música de fondo (opcional)", file_types=[".mp3"])
btn = gr.Button("Generar Video")
with gr.Column():
output = gr.Video(label="Resultado")
btn.click(
fn=generar_video,
inputs=[prompt, voz, musica],
outputs=output
)
if __name__ == "__main__":
app.launch(server_name="0.0.0.0", server_port=7860) |