Spaces:
Running
Running
File size: 3,201 Bytes
43fcbe8 8337d0b c9d2e08 dd712f9 8337d0b 720c3d5 8337d0b 43fcbe8 8337d0b 720c3d5 8337d0b fa201eb 8337d0b 720c3d5 c9d2e08 8337d0b d7f3a60 720c3d5 8337d0b 9e5ee0a 8337d0b 9e5ee0a 8337d0b 720c3d5 8337d0b 9e5ee0a d7f3a60 8337d0b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
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() |