File size: 3,201 Bytes
43fcbe8
8337d0b
 
 
 
 
c9d2e08
dd712f9
8337d0b
 
720c3d5
8337d0b
 
 
 
 
 
 
 
43fcbe8
8337d0b
 
720c3d5
8337d0b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fa201eb
 
 
8337d0b
720c3d5
c9d2e08
8337d0b
 
 
d7f3a60
 
720c3d5
8337d0b
 
 
9e5ee0a
8337d0b
 
9e5ee0a
8337d0b
 
 
720c3d5
8337d0b
 
 
 
 
 
9e5ee0a
d7f3a60
8337d0b
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
81
82
import os
import edge_tts
import gradio as gr
from moviepy.editor import *
from transformers import pipeline
import requests
from datetime import datetime

# 1. Configuración inicial
PEXELS_API_KEY = os.getenv("PEXELS_API_KEY")  # ¡Añade tu API Key en Hugging Face!

# 2. Generar guion con IA (si no se proporciona uno manual)
def generar_guion(prompt):
    generator = pipeline("text-generation", model="facebook/mbart-large-50")
    return generator(
        f"Genera un guion para video sobre '{prompt}' (4 puntos breves):",
        max_length=200,
        num_return_sequences=1
    )[0]['generated_text']

# 3. Función principal para crear el video
def crear_video(prompt, script_personalizado, voz, musica=None):
    try:
        # A. Usar guion personalizado o generar uno automático
        guion = script_personalizado if script_personalizado else generar_guion(prompt)
        
        # B. Generar voz (Edge-TTS)
        edge_tts.Communicate(guion, voice=voz).save("voz.mp3")
        
        # C. Buscar videos en Pexels (relacionados con el guion)
        headers = {"Authorization": PEXELS_API_KEY}
        query = guion[:50].replace(" ", "+")  # Usar las primeras 50 palabras
        videos = requests.get(
            f"https://api.pexels.com/videos/search?query={query}&per_page=2",
            headers=headers
        ).json().get("videos", [])
        
        # D. Procesar música (hacer loop si es necesario)
        audio = AudioFileClip("voz.mp3")
        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)])
        
        # E. Crear y exportar el video
        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: {e}")
        return None

# 4. Interfaz de usuario (Gradio)
with gr.Blocks(title="Generador de Videos") as app:
    gr.Markdown("# 🎥 Generador Automático de Videos")
    
    with gr.Row():
        with gr.Column():
            prompt = gr.Textbox(label="Tema del video", placeholder="Ej: 'Tecnología en 2024'")
            script = gr.TextArea(label="Guion personalizado (opcional)", lines=5)
            voz = gr.Dropdown(
                label="Selecciona una voz",
                choices=[v["Name"] for v in edge_tts.list_voices()],
                value="es-MX-DaliaNeural"
            )
            musica = gr.File(label="Música de fondo (opcional)", file_types=[".mp3"])
            btn = gr.Button("Generar Video", variant="primary")
        
        with gr.Column():
            output = gr.Video(label="Resultado", autoplay=True)

    btn.click(
        fn=crear_video,
        inputs=[prompt, script, voz, musica],
        outputs=output
    )

app.launch()