File size: 3,239 Bytes
43fcbe8
40236ce
8337d0b
 
 
 
 
c9d2e08
dd712f9
40236ce
 
 
720c3d5
40236ce
8337d0b
 
 
40236ce
8337d0b
 
 
43fcbe8
40236ce
 
720c3d5
40236ce
8337d0b
 
40236ce
 
8337d0b
40236ce
8337d0b
40236ce
8337d0b
 
 
 
 
40236ce
8337d0b
 
 
 
 
 
 
40236ce
8337d0b
 
 
 
fa201eb
 
 
40236ce
720c3d5
c9d2e08
40236ce
 
 
d7f3a60
 
720c3d5
40236ce
 
8337d0b
40236ce
 
8337d0b
9e5ee0a
40236ce
 
8337d0b
720c3d5
40236ce
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
83
84
import os
import asyncio
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 (obtener voces sincrónicamente)
VOICES = asyncio.run(edge_tts.list_voices())
PEXELS_API_KEY = os.getenv("PEXELS_API_KEY")  # Configura esto en Hugging Face

# 2. GENERADOR DE GUIÓN CON IA
def generar_guion(prompt):
    generator = pipeline("text-generation", model="facebook/mbart-large-50")
    return generator(
        f"Redacta un guion corto sobre '{prompt}' (4 puntos clave):",
        max_length=200,
        num_return_sequences=1
    )[0]['generated_text']

# 3. FUNCIÓN PRINCIPAL (sincronizada para Gradio)
def crear_video(prompt, script_personalizado, voz_seleccionada, musica=None):
    try:
        # A. Generar guión
        guion = script_personalizado if script_personalizado else generar_guion(prompt)
        
        # B. Generar voz (usando subprocess para evitar async)
        os.system(f'edge-tts --voice "{voz_seleccionada}" --text "{guion}" --write-media "voz.mp3"')
        
        # C. Buscar videos en Pexels
        headers = {"Authorization": PEXELS_API_KEY}
        query = prompt[:50].replace(" ", "+")
        videos = requests.get(
            f"https://api.pexels.com/videos/search?query={query}&per_page=2",
            headers=headers
        ).json().get("videos", [])
        
        # D. Procesar música
        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 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: {str(e)}")
        return None

# 4. INTERFAZ GRADIO
with gr.Blocks(title="Generador de Videos PRO") as app:
    gr.Markdown("# 🎥 GENERADOR DE VIDEOS AUTOMÁTICO")
    
    with gr.Row():
        with gr.Column():
            prompt = gr.Textbox(label="📌 Tema principal", placeholder="Ej: 'Inteligencia Artificial en 2024'")
            script = gr.TextArea(label="📝 Guion personalizado (opcional)", lines=5)
            voz = gr.Dropdown(
                label="🗣️ Selecciona voz",
                choices=[v["Name"] for v in VOICES],
                value="es-MX-DaliaNeural"
            )
            musica = gr.File(label="🎵 Música de fondo (opcional)", file_types=[".mp3", ".wav"])
            btn = gr.Button("🚀 GENERAR VIDEO", variant="primary")
        
        with gr.Column():
            output = gr.Video(label="🎬 VIDEO RESULTANTE", autoplay=True)

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

app.launch()