File size: 3,055 Bytes
43fcbe8
19224f2
8337d0b
 
 
c9d2e08
dd712f9
1672ed1
 
720c3d5
1672ed1
 
 
 
 
 
 
 
 
 
 
 
 
 
19224f2
c7b9a72
1672ed1
19224f2
 
 
 
 
 
 
8337d0b
1672ed1
8337d0b
19224f2
 
c7b9a72
19224f2
 
 
8337d0b
1672ed1
19224f2
8337d0b
 
 
 
 
 
1672ed1
8337d0b
 
 
 
fa201eb
 
 
1672ed1
720c3d5
c9d2e08
1672ed1
518f669
1672ed1
d7f3a60
 
720c3d5
1672ed1
 
19224f2
1672ed1
8337d0b
720c3d5
1672ed1
8337d0b
 
19224f2
 
518f669
9e5ee0a
d7f3a60
1672ed1
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 subprocess
import gradio as gr
from moviepy.editor import *
import requests
from datetime import datetime

# 1. Configuración inicial
PEXELS_API_KEY = os.getenv("PEXELS_API_KEY")  # Configura esto en Hugging Face

# 2. Lista de voces CORRECTA (formato válido para edge-tts)
VOICES = [
    "es-MX-DaliaNeural",    # Mujer México
    "es-ES-ElviraNeural",   # Mujer España
    "es-AR-ElenaNeural",    # Mujer Argentina
    "es-CO-SalomeNeural",   # Mujer Colombia
    "en-US-JennyNeural",    # Mujer EE.UU. (inglés)
    "fr-FR-DeniseNeural",   # Mujer Francia (francés)
    "de-DE-KatjaNeural",    # Mujer Alemania (alemán)
    "pt-BR-FranciscaNeural" # Mujer Brasil (portugués)
    # ¡Añade más si necesitas!
]

# 3. Función principal (a prueba de errores)
def generar_video(prompt, voz_seleccionada, musica=None):
    try:
        # A. Generar voz
        voz_archivo = "voz.mp3"
        subprocess.run([
            'edge-tts',
            '--voice', voz_seleccionada,
            '--text', prompt,
            '--write-media', voz_archivo
        ], check=True)
        
        # B. 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", [])
        
        # C. Procesar música
        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)])
        
        # D. Crear 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: {str(e)}")
        return None

# 4. Interfaz Gradio (simple pero efectiva)
with gr.Blocks() as app:
    gr.Markdown("# 🎬 GENERADOR DE VIDEOS (ESTABLE)")
    
    with gr.Row():
        with gr.Column():
            prompt = gr.Textbox(label="Tema del video", placeholder="Ej: 'Lugares misteriosos de España'")
            voz = gr.Dropdown(label="Selecciona voz", choices=VOICES, value="es-ES-ElviraNeural")
            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=generar_video,
        inputs=[prompt, voz, musica],
        outputs=output
    )

app.launch(server_name="0.0.0.0", server_port=7860)