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