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)