INVIDEO_BASIC / app.py
gnosticdev's picture
Update app.py
40236ce verified
raw
history blame
3.24 kB
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()