Spaces:
Sleeping
Sleeping
File size: 3,239 Bytes
43fcbe8 40236ce 8337d0b c9d2e08 dd712f9 40236ce 720c3d5 40236ce 8337d0b 40236ce 8337d0b 43fcbe8 40236ce 720c3d5 40236ce 8337d0b 40236ce 8337d0b 40236ce 8337d0b 40236ce 8337d0b 40236ce 8337d0b 40236ce 8337d0b fa201eb 40236ce 720c3d5 c9d2e08 40236ce d7f3a60 720c3d5 40236ce 8337d0b 40236ce 8337d0b 9e5ee0a 40236ce 8337d0b 720c3d5 40236ce 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 83 84 |
import os
import asyncio
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 (obtener voces sincrónicamente)
VOICES = asyncio.run(edge_tts.list_voices())
PEXELS_API_KEY = os.getenv("PEXELS_API_KEY") # Configura esto en Hugging Face
# 2. GENERADOR DE GUIÓN CON IA
def generar_guion(prompt):
generator = pipeline("text-generation", model="facebook/mbart-large-50")
return generator(
f"Redacta un guion corto sobre '{prompt}' (4 puntos clave):",
max_length=200,
num_return_sequences=1
)[0]['generated_text']
# 3. FUNCIÓN PRINCIPAL (sincronizada para Gradio)
def crear_video(prompt, script_personalizado, voz_seleccionada, musica=None):
try:
# A. Generar guión
guion = script_personalizado if script_personalizado else generar_guion(prompt)
# B. Generar voz (usando subprocess para evitar async)
os.system(f'edge-tts --voice "{voz_seleccionada}" --text "{guion}" --write-media "voz.mp3"')
# C. Buscar videos en Pexels
headers = {"Authorization": PEXELS_API_KEY}
query = prompt[:50].replace(" ", "+")
videos = requests.get(
f"https://api.pexels.com/videos/search?query={query}&per_page=2",
headers=headers
).json().get("videos", [])
# D. Procesar música
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 video final
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
with gr.Blocks(title="Generador de Videos PRO") as app:
gr.Markdown("# 🎥 GENERADOR DE VIDEOS AUTOMÁTICO")
with gr.Row():
with gr.Column():
prompt = gr.Textbox(label="📌 Tema principal", placeholder="Ej: 'Inteligencia Artificial en 2024'")
script = gr.TextArea(label="📝 Guion personalizado (opcional)", lines=5)
voz = gr.Dropdown(
label="🗣️ Selecciona voz",
choices=[v["Name"] for v in VOICES],
value="es-MX-DaliaNeural"
)
musica = gr.File(label="🎵 Música de fondo (opcional)", file_types=[".mp3", ".wav"])
btn = gr.Button("🚀 GENERAR VIDEO", variant="primary")
with gr.Column():
output = gr.Video(label="🎬 VIDEO RESULTANTE", autoplay=True)
btn.click(
fn=crear_video,
inputs=[prompt, script, voz, musica],
outputs=output
)
app.launch() |