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()