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