Geração de vídeo e áudio
O Libre WebUI 0.18.0 amplia a geração para além das imagens: plugins de provedores podem declarar recursos de vídeo e áudio, e tudo o que é gerado — imagens, vídeos, fala e som — chega a uma única galeria de mídia por usuário.
A geração de mídia está disponível para todos os usuários autenticados. A galeria é estritamente individual: toda leitura, busca de conteúdo e exclusão é limitada à conta conectada.
Blocos de recursos dos plugins
Uma definição de plugin declara cada recurso de mídia em seu próprio bloco:
"capabilities": {
"image": { "endpoint": "...", "model_map": ["..."], "config": { ... } },
"tts": { "endpoint": "...", "model_map": ["..."], "config": { ... } },
"audio": { "endpoint": "...", "model_map": ["..."], "config": { ... } },
"video": { "endpoint": "...", "model_map": ["..."], "config": { ... } }
}
Todo bloco tem um endpoint, uma lista alternativa model_map, um models_endpoint opcional para descoberta de modelos ao vivo e um objeto config com opções específicas do recurso — tamanhos e proporções para imagens; vozes e formatos para fala; resoluções, proporções e durações para vídeo. Um provedor de vídeo também pode declarar cancel_endpoint por ID de prompt e um cancel_method; o Libre não deduz o suporte a cancelamento a partir de um endpoint comum de geração.
Há dois recursos de áudio, e ambos chegam à galeria como áudio:
ttsé fala: o texto é lido em voz alta na voz selecionada.audioé som: um modelo gera conteúdo de áudio a partir de um prompt.
O OpenRouter (plugins/openrouter.json) é atualmente o único plugin integrado que declara blocos video e audio. Quando há um models_endpoint, a lista de modelos é atualizada no ciclo normal de descoberta (consulte Variáveis de ambiente para ver as configurações de TTL da descoberta); o model_map permanece como alternativa.
Gerar mídia
Abra Imagine (/gallery). O cabeçalho oferece Gerar para imagens (quando a geração de imagens está habilitada em Configurações), além dos painéis Vídeo e Áudio.
A geração de fala e som é síncrona: a solicitação é executada, o resultado é salvo na galeria e a resposta devolve o item concluído. Cancelar interrompe a solicitação do navegador e a solicitação do Libre ao provedor; um resultado cancelado não é salvo. A geração de imagens segue o mesmo contrato de cancelamento por desconexão.
Para um fluxo de trabalho aceito do ComfyUI, o Libre envia tanto a operação de cancelamento da tarefa por ID do prompt quanto a exclusão da fila por ID do prompt e espera até três segundos por esse encerramento antes de liberar a solicitação. Ele nunca chama a operação de interrupção sem escopo do ComfyUI, que poderia interromper o fluxo de outro usuário. As versões atuais do ComfyUI expõem /api/jobs/:promptId/cancel para um fluxo em execução. Em uma versão antiga sem essa operação, o Libre ainda pode remover da fila o item pendente exato, mas não pode interromper com segurança um fluxo já em execução; atualize o ComfyUI para ter o contrato completo de cancelamento.
Plugins TTS também podem declarar clonagem de voz. Para esses modelos, o painel Áudio mostra o upload de um áudio de referência e, quando o provedor exige, um campo de transcrição exata. O Libre WebUI valida os limites de tipo e tamanho de arquivo definidos no manifesto, mantém o upload na memória e o encaminha somente ao provedor selecionado. Apenas a fala gerada é colocada na galeria.
Opcionalmente, um clone pode ser salvo como uma voz nomeada e reutilizável para o mesmo plugin e modelo. Salvar exige uma confirmação separada de consentimento para armazenamento. O Libre WebUI criptografa a referência original e a transcrição em um perfil de voz pertencente ao usuário; ele não usa a fala gerada como referência. Perfis salvos podem ser selecionados ou excluídos permanentemente em Configurações → Conversão de texto em fala. O provedor configurado recebe novamente a referência armazenada sempre que gera um lote de fala. O perfil é vinculado ao roteamento aprovado daquele provedor; se a definição ou o endpoint do plugin mudar, recrie o perfil para consentir com o novo destino. Use somente gravações de pessoas que consentiram tanto com a solicitação de clonagem quanto com qualquer armazenamento solicitado.
Os perfis de voz são intencionalmente omitidos da exportação geral de dados do Libre WebUI porque contêm material biométrico de origem. Faça backup conjunto do banco de dados criptografado do aplicativo e de ENCRYPTION_KEY se precisar de recuperação de desastres; caso contrário, recrie os perfis a partir das gravações originais autorizadas.
Ciclo de vida das tarefas de vídeo
A geração de vídeo é assíncrona. O envio de uma tarefa (POST /api/media/video/generate) devolve 202 com um registro da tarefa, que passa por pending, in_progress e, por fim, completed ou failed.
- O envio é desacoplado da resposta do navegador após a validação. O Libre persiste o ID da tarefa no provedor imediatamente após a aceitação, mesmo que o painel ou a conexão de rede seja fechado enquanto o provedor responde.
GET /api/media/video/jobslista somente os identificadores salvos do usuário autenticado; o painel solicita até 100 identificadores ativos sempre que é aberto. Portanto, uma tarefa pendente pode ser reaberta depois de navegar para outra página, atualizar ou perder a conexão.- Uma tarefa persistente
media.video.resume.v1consulta o provedor e baixa o resultado concluído mesmo quando o painel está fechado. O modo individual executa esse manipulador no worker integrado; o modo de equipe o executa no worker externo. Locações, novas tentativas limitadas, revalidação do ator e conclusão condicional permitem que outro worker recupere a tarefa depois que um processo é encerrado, sem criar uma linha duplicada na galeria nem uma referência duplicada ao blob. Os endpoints existentes de retomada/GET continuam servindo como limites de compatibilidade e status; a interface ainda pode consultá-los para exibição. - Fechar o painel ou escolher Parar de esperar interrompe somente o transporte atual de status ou download. Uma ação Cancelar tarefa no provedor aparece apenas quando o plugin declara explicitamente um endpoint de cancelamento por ID da tarefa. Após a confirmação do cancelamento no provedor, o Libre remove o identificador local salvo.
- Após a conclusão, o backend baixa o vídeo (limite de 200 MB, sem seguir redirecionamentos HTTP) e o salva na galeria.
- O registro da tarefa armazena o plugin, o modelo, as opções, o status e o prompt (criptografado em repouso). Registros de tarefas concluídas ou com falha com mais de 30 dias são removidos de forma oportunista; identificadores pendentes não expiram nessa limpeza.
- Estados finais geram notificações: um vídeo concluído publica uma notificação media-ready, e uma falha do provedor publica media-failed; ambas levam à galeria, são desduplicadas por tarefa e entregues pela caixa de entrada do aplicativo e pelos webhooks inscritos.
Edição e inpainting de imagens
Imagens da galeria recebem uma ação Editar imagem quando há um modelo de edição configurado. O editor pinta uma máscara diretamente sobre a imagem — as regiões pintadas são refeitas pelo modelo; uma tela sem alterações edita a imagem inteira — e pode anexar imagens de referência adicionais para composição quando o modelo aceita mais de uma entrada. A edição usa o contrato de edição multipart compatível com OpenAI: um plugin participa declarando edit_endpoint na configuração do recurso de imagem, junto com limites opcionais supports_mask, max_reference_images, edit_mime_types e max_edit_image_bytes (o manifesto OpenAI integrado declara todos eles).
Todas as entradas são validadas antes que qualquer byte saia do processo: MIME declarado, magic bytes detectados (PNG, JPEG ou WebP) e limite de 10 MiB por imagem; máscaras devem ser PNG, pois somente esse formato preserva o canal alfa que indica as regiões a refazer. Os resultados são salvos novamente na galeria com metadados de procedência que registram o item de origem da galeria, o número de imagens de referência enviadas e se uma máscara foi usada. As edições medem o uso exatamente como as gerações.
A galeria unificada
A galeria apresenta todos os tipos de mídia intercalados por data de criação, com filtros para Tudo, Imagens, Vídeos e Áudio. Vídeos e áudios são reproduzidos na própria página; imagens são abertas na mesa de luz; todos os itens podem ser baixados ou excluídos. Administradores podem optar pela retenção automática com GALLERY_RETENTION_DAYS: a varredura do agendador exclui mídias anteriores à janela pelo mesmo ciclo persistente de exclusão usado em uma exclusão manual. Não definir a variável (o padrão) mantém a mídia até que o proprietário a exclua.
O armazenamento e a entrega são deliberadamente conservadores:
- A mídia é armazenada criptografada dentro do banco de dados do aplicativo (em
DATA_DIR), não como arquivos soltos no disco. Faça backup do banco de dados e deENCRYPTION_KEYem conjunto, como acontece com todos os dados criptografados. - As respostas da API nunca incorporam cargas de mídia; os itens referenciam uma URL de conteúdo individual.
- O conteúdo servido deve corresponder à lista de tipos MIME permitidos para sua categoria e ao tipo armazenado, tem limite de 200 MB e é entregue com
X-Content-Type-Options: nosniffe umaContent-Security-Policyque isola a resposta em um sandbox.
Os endpoints anteriores exclusivos para imagens e o painel de geração de imagens continuam funcionando sem alterações; eles gravam na mesma galeria.
Limites de taxa
A API de mídia tem limite de taxa por cliente:
| Operação | Limite |
|---|---|
| Geração (vídeo, fala, som) | 10 solicitações por minuto |
| Consulta de tarefas de vídeo | 60 solicitações por minuto |
| Listagem, conteúdo e exclusões da galeria | 120 solicitações por minuto |
A consulta da interface a cada 30 segundos fica bem abaixo do limite previsto.
Medição e privacidade
As chamadas de geração de mídia são medidas na análise de uso administrativa, como todas as demais chamadas de saída a provedores: plugin, modelo, status, duração e contagens de unidades. Prompts e conteúdo gerado nunca são gravados nos registros de uso. A própria mídia gerada e o prompt da tarefa de vídeo existem somente nas linhas criptografadas do usuário.
Como no chat, o provedor configurado recebe o prompt e devolve o conteúdo — aplicam-se as políticas de preços, retenção e conteúdo do provedor.