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