Spaces:
Sleeping
Sleeping
File size: 3,483 Bytes
43fcbe8 40236ce 8337d0b c9d2e08 dd712f9 c7b9a72 40236ce c7b9a72 720c3d5 c7b9a72 8337d0b c7b9a72 43fcbe8 c7b9a72 40236ce 720c3d5 40236ce 8337d0b c7b9a72 40236ce 8337d0b c7b9a72 8337d0b 40236ce c7b9a72 8337d0b c7b9a72 8337d0b c7b9a72 8337d0b c7b9a72 8337d0b fa201eb c7b9a72 720c3d5 c9d2e08 c7b9a72 d7f3a60 720c3d5 c7b9a72 8337d0b c7b9a72 40236ce c7b9a72 9e5ee0a c7b9a72 8337d0b 720c3d5 c7b9a72 8337d0b c7b9a72 9e5ee0a d7f3a60 c7b9a72 |
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 85 86 87 88 89 90 91 92 |
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 (SIN ASYNCIO en callbacks)
VOICES = asyncio.run(edge_tts.list_voices())
PEXELS_API_KEY = os.getenv("PEXELS_API_KEY")
# 2. Generador de gui贸n (sincr贸nico)
def generar_guion(prompt):
try:
generator = pipeline("text-generation", model="facebook/mbart-large-50")
return generator(
f"Genera un guion sobre '{prompt}' (4 puntos breves):",
max_length=200,
num_return_sequences=1
)[0]['generated_text']
except Exception as e:
print(f"Error en generaci贸n: {e}")
return prompt # Fallback al texto original
# 3. Funci贸n principal (sincr贸nica)
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 (soluci贸n sincr贸nica)
os.system(f'edge-tts --voice "{voz_seleccionada}" --text "{guion}" --write-media "voz.mp3"')
# C. Descargar videos
headers = {"Authorization": PEXELS_API_KEY}
query = prompt[:50].replace(" ", "+")
response = requests.get(
f"https://api.pexels.com/videos/search?query={query}&per_page=2",
headers=headers,
timeout=10
)
videos = response.json().get("videos", [])
# D. Procesar audio
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. Renderizar 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 CR脥TICO: {e}")
return None
# 4. Interfaz (con queue enabled=False)
with gr.Blocks(title="Generador de Videos", css="footer {visibility: hidden}") as app:
gr.Markdown("# 馃幀 GENERADOR DE VIDEOS (ESTABLE)")
with gr.Row():
with gr.Column():
prompt = gr.Textbox(label="Tema principal", placeholder="Ej: 'Tecnolog铆a en 2025'")
script = gr.TextArea(label="Guion personalizado (opcional)", lines=5)
voz = gr.Dropdown(
label="Selecciona voz",
choices=[v["Name"] for v in VOICES],
value="es-ES-ElviraNeural"
)
musica = gr.File(label="M煤sica (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,
api_name="generar" # Evita usar colas
)
# 5. Lanzamiento (sin colas)
app.launch(enable_queue=False) # 隆Clave para evitar el error! |