Spaces:
Sleeping
Sleeping
| 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() |