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)