Spaces:
Running
Running
File size: 3,055 Bytes
43fcbe8 19224f2 8337d0b c9d2e08 dd712f9 1672ed1 720c3d5 1672ed1 19224f2 c7b9a72 1672ed1 19224f2 8337d0b 1672ed1 8337d0b 19224f2 c7b9a72 19224f2 8337d0b 1672ed1 19224f2 8337d0b 1672ed1 8337d0b fa201eb 1672ed1 720c3d5 c9d2e08 1672ed1 518f669 1672ed1 d7f3a60 720c3d5 1672ed1 19224f2 1672ed1 8337d0b 720c3d5 1672ed1 8337d0b 19224f2 518f669 9e5ee0a d7f3a60 1672ed1 |
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 subprocess
import gradio as gr
from moviepy.editor import *
import requests
from datetime import datetime
# 1. Configuración inicial
PEXELS_API_KEY = os.getenv("PEXELS_API_KEY") # Configura esto en Hugging Face
# 2. Lista de voces CORRECTA (formato válido para edge-tts)
VOICES = [
"es-MX-DaliaNeural", # Mujer México
"es-ES-ElviraNeural", # Mujer España
"es-AR-ElenaNeural", # Mujer Argentina
"es-CO-SalomeNeural", # Mujer Colombia
"en-US-JennyNeural", # Mujer EE.UU. (inglés)
"fr-FR-DeniseNeural", # Mujer Francia (francés)
"de-DE-KatjaNeural", # Mujer Alemania (alemán)
"pt-BR-FranciscaNeural" # Mujer Brasil (portugués)
# ¡Añade más si necesitas!
]
# 3. Función principal (a prueba de errores)
def generar_video(prompt, voz_seleccionada, musica=None):
try:
# A. Generar voz
voz_archivo = "voz.mp3"
subprocess.run([
'edge-tts',
'--voice', voz_seleccionada,
'--text', prompt,
'--write-media', voz_archivo
], check=True)
# B. Buscar videos en Pexels
headers = {"Authorization": PEXELS_API_KEY}
response = requests.get(
f"https://api.pexels.com/videos/search?query={prompt[:50]}&per_page=2",
headers=headers,
timeout=15
)
videos = response.json().get("videos", [])
# C. Procesar música
audio = AudioFileClip(voz_archivo)
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)])
# D. Crear 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: {str(e)}")
return None
# 4. Interfaz Gradio (simple pero efectiva)
with gr.Blocks() as app:
gr.Markdown("# 🎬 GENERADOR DE VIDEOS (ESTABLE)")
with gr.Row():
with gr.Column():
prompt = gr.Textbox(label="Tema del video", placeholder="Ej: 'Lugares misteriosos de España'")
voz = gr.Dropdown(label="Selecciona voz", choices=VOICES, value="es-ES-ElviraNeural")
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=generar_video,
inputs=[prompt, voz, musica],
outputs=output
)
app.launch(server_name="0.0.0.0", server_port=7860) |