Generación de vídeo y audio
Libre WebUI 0.18.0 amplía la generación más allá de las imágenes: los plugins pueden declarar capacidades de vídeo y audio, y todo lo generado —imágenes, vídeos, voz y sonido— llega a una galería multimedia por usuario.
La generación está disponible para todos los usuarios autenticados. La galería está estrictamente aislada por usuario: cada lectura, obtención de contenido y eliminación se limita a la cuenta conectada.
Bloques de capacidades del plugin
Una definición declara cada capacidad multimedia como un bloque independiente:
"capabilities": {
"image": { "endpoint": "...", "model_map": ["..."], "config": { ... } },
"tts": { "endpoint": "...", "model_map": ["..."], "config": { ... } },
"audio": { "endpoint": "...", "model_map": ["..."], "config": { ... } },
"video": { "endpoint": "...", "model_map": ["..."], "config": { ... } }
}
Cada bloque tiene un endpoint, una lista de respaldo model_map, un
models_endpoint opcional para exploración en directo y un objeto config con
opciones específicas: tamaños y relaciones de aspecto para imágenes, voces y
formatos para voz, y resoluciones, relaciones y duraciones para vídeo. Un proveedor
de vídeo también puede declarar cancel_endpoint por ID de prompt y cancel_method;
Libre no deduce que admita cancelación a partir de un endpoint de generación normal.
Existen dos capacidades de audio, ambas guardadas como audio en la galería:
ttses voz: el texto se lee con una voz elegida.audioes sonido: un modelo genera contenido sonoro a partir de un prompt.
OpenRouter (plugins/openrouter.json) es actualmente el único plugin integrado que
declara bloques video y audio. Cuando existe un models_endpoint, la lista se
actualiza durante el ciclo normal de exploración (consulta
Variables de entorno para la duración); model_map
permanece como respaldo.
Generar medios
Abre Imagine (/gallery). La cabecera ofrece Generar para imágenes (si la
generación está habilitada en Configuración), además de paneles de Vídeo y
Audio.
La generación de voz y sonido es síncrona: se ejecuta la solicitud, se guarda el resultado y la respuesta devuelve el elemento terminado. Cancelar aborta la solicitud del navegador y la solicitud saliente de Libre; un resultado cancelado no se guarda. La generación de imágenes sigue el mismo contrato al desconectarse.
Para un flujo de ComfyUI aceptado, Libre envía la cancelación del trabajo por ID de
prompt y la eliminación de la cola por ese ID, y espera hasta tres segundos al
desmontaje antes de liberar la solicitud. Nunca llama a la interrupción sin ámbito
de ComfyUI, que podría detener el flujo de otro usuario. Las versiones actuales
exponen /api/jobs/:promptId/cancel para un flujo en ejecución. En una versión
antigua, Libre aún puede quitar el elemento pendiente exacto, pero no detener de
forma segura un flujo ya iniciado; actualiza ComfyUI para el contrato completo.
Los plugins TTS también pueden declarar clonación de voz. Para esos modelos, el panel Audio muestra la subida de audio de referencia y, cuando el proveedor lo exige, un campo de transcripción exacta. Libre WebUI valida el tipo y los límites del manifiesto, mantiene la subida en memoria y solo la remite al proveedor seleccionado. Únicamente la voz generada se guarda en la galería.
Un clon puede guardarse como una voz reutilizable y con nombre para el mismo plugin y modelo. Guardarlo exige otra confirmación de consentimiento. Libre WebUI cifra la referencia original y su transcripción en un perfil propiedad del usuario; no usa la voz generada como referencia. Los perfiles se seleccionan o eliminan permanentemente en Configuración → Texto a voz. El proveedor vuelve a recibir la referencia guardada cada vez que genera un lote. El perfil está vinculado al enrutamiento aprobado; si cambia la definición o el endpoint, vuelve a crearlo para consentir el nuevo destino. Usa solo grabaciones de personas que hayan consentido la clonación y cualquier almacenamiento solicitado.
Los perfiles de voz se omiten deliberadamente de la exportación general porque
contienen material biométrico original. Copia juntos la base cifrada y
ENCRYPTION_KEY si necesitas recuperación ante desastres; de lo contrario,
recréelos desde las grabaciones consentidas.
Ciclo de vida de un trabajo de vídeo
La generación de vídeo es asíncrona. Enviar un trabajo
(POST /api/media/video/generate) devuelve 202 con un registro, que pasa por
pending, in_progress y finalmente completed o failed.
- Tras la validación, el envío se separa de la respuesta del navegador. Libre conserva el ID del proveedor de inmediato después de aceptarlo aunque el panel o la conexión se cierre mientras responde.
GET /api/media/video/jobssolo enumera referencias guardadas del usuario autenticado; el panel solicita hasta 100 activas al abrirse. Un trabajo pendiente puede reabrirse tras navegar, actualizar o desconectarse.- Un trabajo duradero
media.video.resume.v1consulta al proveedor y descarga el resultado aunque el panel esté cerrado. El modo individual lo ejecuta en el worker integrado y el modo equipo, en el externo. Los arrendamientos, reintentos acotados, revalidación del actor y completado condicional permiten que otro worker recupere el trabajo tras morir un proceso sin duplicar filas ni referencias de blob. Los endpoints de reanudación yGETexistentes permanecen como límites de estado y compatibilidad; la interfaz puede seguir consultándolos. - Cerrar el panel o elegir Dejar de esperar solo aborta el transporte actual de estado o descarga. Cancelar trabajo en el proveedor solo aparece si el plugin declara expresamente un endpoint de cancelación por ID. Tras una cancelación confirmada, Libre elimina la referencia local.
- Al completarse, el backend descarga el vídeo (límite de 200 MB, sin seguir redirecciones HTTP) y lo guarda en la galería.
- El registro guarda plugin, modelo, opciones, estado y prompt (cifrado en reposo). Los registros completados y fallidos con más de 30 días se podan de forma oportunista; las referencias pendientes no caducan por esa limpieza.
- Los estados terminales notifican: un vídeo completado publica media-ready y un fallo del proveedor, media-failed. Ambos enlazan a la galería, se deduplican por trabajo y se entregan en la bandeja y los webhooks suscritos.
Edición y relleno de imágenes
Las imágenes de la galería obtienen Editar imagen cuando se configura un modelo
capaz. El editor pinta una máscara sobre la imagen: el modelo repinta las zonas
marcadas, mientras que un lienzo intacto edita toda la imagen; también admite
referencias adicionales para composición si el modelo acepta varias entradas. La
edición sigue el contrato multipart compatible con OpenAI: un plugin participa
declarando edit_endpoint en su capacidad de imagen y, opcionalmente,
supports_mask, max_reference_images, edit_mime_types y
max_edit_image_bytes (el manifiesto integrado de OpenAI los declara todos).
Cada entrada se valida antes de que salga un solo byte: MIME declarado, bytes mágicos detectados (PNG, JPEG o WebP) y límite de 10 MiB por imagen. Las máscaras deben ser PNG porque solo PNG conserva el canal alfa que marca las zonas. Los resultados vuelven a la galería con metadatos de procedencia: elemento original, número de referencias subidas y uso de máscara. Las ediciones se miden como las generaciones.
La galería unificada
La galería intercala todos los tipos por fecha, con filtros Todo, Imágenes,
Vídeos y Audio. Los vídeos y el audio se reproducen en línea, las imágenes se
abren en un visor y todo puede descargarse o eliminarse. Los administradores pueden
activar conservación automática con GALLERY_RETENTION_DAYS: el barrido programado
borra medios anteriores a la ventana mediante el mismo ciclo duradero que un borrado
manual. Sin definir (valor predeterminado), se conservan hasta que el propietario los
elimine.
El almacenamiento y la entrega son deliberadamente conservadores:
- Los medios se almacenan cifrados dentro de la base de la aplicación (bajo
DATA_DIR), no como archivos sueltos. Copia juntos la base yENCRYPTION_KEY. - Las respuestas de API nunca integran las cargas; los elementos hacen referencia a una URL de contenido individual.
- El contenido servido debe coincidir con una lista MIME por tipo y con el tipo
almacenado, se limita a 200 MB y se entrega con
X-Content-Type-Options: nosniffy unaContent-Security-Policyque lo aísla.
Los endpoints anteriores solo de imágenes y el panel de generación siguen funcionando sin cambios y escriben en la misma galería.
Límites de velocidad
La API multimedia se limita por cliente:
| Operación | Límite |
|---|---|
| Generación (vídeo, voz, sonido) | 10 solicitudes por minuto |
| Consulta de trabajos de vídeo | 60 solicitudes por minuto |
| Lista, contenido y eliminación de galería | 120 solicitudes por minuto |
La consulta de la interfaz cada 30 segundos queda holgadamente dentro del límite.
Medición y privacidad
Las llamadas multimedia se miden en el análisis de uso de los administradores como cualquier llamada saliente: plugin, modelo, estado, duración y unidades. Los prompts y el contenido nunca se escriben en los registros de uso. Los medios y el prompt del trabajo de vídeo solo existen en filas cifradas del usuario.
Como en el chat, el proveedor configurado recibe el prompt y devuelve el contenido; se aplican sus políticas de precios, conservación y contenido.