Hoppa till huvudinnehåll

Video- och ljudgenerering

Libre WebUI 0.18.0 utökar generering bortom bilder. Leverantörsplugin kan deklarera video- och ljudfunktioner, och allt som genereras — bilder, video, tal och ljud — hamnar i ett mediegalleri per användare.

Mediegenerering är tillgänglig för alla autentiserade användare. Galleriet är strikt per användare: varje läsning, innehållshämtning och radering avgränsas till det inloggade kontot.

Pluginblock för funktioner

En plugindefinition deklarerar varje mediefunktion som ett eget block:

"capabilities": {
"image": { "endpoint": "...", "model_map": ["..."], "config": { ... } },
"tts": { "endpoint": "...", "model_map": ["..."], "config": { ... } },
"audio": { "endpoint": "...", "model_map": ["..."], "config": { ... } },
"video": { "endpoint": "...", "model_map": ["..."], "config": { ... } }
}

Varje block har en endpoint, en reservlista i model_map, en valfri models_endpoint för aktuell modellsökning och ett config-objekt med funktionsspecifika alternativ — storlekar och bildförhållanden för bilder, röster och format för tal samt upplösningar, bildförhållanden och längder för video. En videoleverantör kan även deklarera cancel_endpoint och cancel_method för prompt-ID. Libre antar inte att avbrytning stöds utifrån en vanlig genereringsslutpunkt.

Det finns två ljudfunktioner, och båda hamnar som ljud i galleriet:

  • tts är tal: text läses upp med en vald röst.
  • audio är ljud: en modell genererar ljudinnehåll från en prompt.

OpenRouter (plugins/openrouter.json) är för närvarande det enda medföljande pluginet som deklarerar blocken video och audio. När models_endpoint finns uppdateras modellistan enligt den normala sökcykeln (se Miljövariabler för inställningar av sökningens TTL). model_map förblir reservlösningen.

Generera media

Öppna Imagine (/gallery). Rubriken erbjuder Generate för bilder (när bildgenerering är aktiverad i Settings) samt panelerna Video och Audio.

Tal- och ljudgenerering är synkron. Förfrågan körs, resultatet sparas i galleriet och svaret returnerar den färdiga posten. Cancel avbryter webbläsarförfrågan och Libres utgående leverantörsförfrågan. Ett avbrutet resultat sparas inte. Bildgenerering följer samma kontrakt för avbrytning vid frånkoppling.

För ett godkänt ComfyUI-arbetsflöde skickar Libre både jobbavbrytningen med prompt-ID och en köborttagning med prompt-ID och väntar sedan upp till tre sekunder på avslutet innan förfrågan släpps. Den anropar aldrig ComfyUI:s oavgränsade avbrottsåtgärd, som kan stoppa en annan användares arbetsflöde. Aktuella ComfyUI-versioner exponerar /api/jobs/:promptId/cancel för ett arbetsflöde som körs. På en gammal version utan den åtgärden kan Libre fortfarande ta bort exakt den väntande köposten, men kan inte säkert stoppa ett arbetsflöde som redan körs. Uppgradera ComfyUI för hela avbrytningskontraktet.

TTS-plugin kan också deklarera röstkloning. För dessa modeller visar panelen Audio en uppladdning av referensljud och, när leverantören kräver det, ett fält för exakt transkript. Libre WebUI validerar filtyp och storleksgränser från manifestet, håller uppladdningen i minnet och vidarebefordrar den endast till vald leverantör. Endast det genererade talet placeras i galleriet.

En klon kan valfritt sparas som en återanvändbar namngiven röst för samma plugin och modell. Sparandet kräver en separat bekräftelse av lagringssamtycke. Libre WebUI krypterar originalreferensen och transkriptet i en användarägd röstprofil och använder inte genererat tal som referens. Sparade profiler kan väljas eller raderas permanent under Settings → Text-to-Speech. Den konfigurerade leverantören får den lagrade referensen igen varje gång en talbatch genereras. Profilen binds till leverantörens godkända dirigering. Om plugindefinitionen eller slutpunkten ändras ska profilen skapas om för att samtycka till den nya destinationen. Använd endast inspelningar från talare som samtyckt både till kloningen och eventuell lagring.

Röstprofiler utelämnas avsiktligt från Libre WebUI:s allmänna dataexport eftersom de innehåller biometriskt källmaterial. Säkerhetskopiera den krypterade programdatabasen och ENCRYPTION_KEY tillsammans för katastrofåterställning. Annars återskapar du profiler från de ursprungliga inspelningarna med samtycke.

Livscykel för videojobb

Videogenerering är asynkron. När ett jobb skickas in (POST /api/media/video/generate) returneras 202 med en jobbpost. Jobbet går genom pending, in_progress och slutligen completed eller failed.

  • Inskickningen kopplas loss från webbläsarsvaret efter validering. Libre sparar leverantörens jobb-ID omedelbart efter godkännande, även om panelen eller nätverksanslutningen stängs medan leverantören svarar.
  • GET /api/media/video/jobs listar endast den autentiserade användarens sparade jobbreferenser. Panelen begär upp till 100 aktiva jobbreferenser varje gång den öppnas. Ett väntande jobb kan därför öppnas igen efter navigering, uppdatering eller frånkoppling.
  • Ett beständigt jobb media.video.resume.v1 frågar leverantören och hämtar ett slutfört resultat även när panelen är stängd. Sololäge kör hanteraren i den inbäddade workern och teamläge kör den i den externa workern. Lås, begränsade återförsök, omvalidering av aktör och villkorat slutförande låter en annan worker återta jobbet efter att en process dör utan att skapa en duplicerad gallerirad eller blobreferens. Befintliga resume-/GET-slutpunkter förblir kompatibilitets- och statusgränser. Gränssnittet kan fortfarande fråga dem för visning.
  • Om panelen stängs eller Stop waiting väljs avbryts endast den aktuella status- eller hämtningstransporten. Åtgärden Cancel job på leverantörssidan visas bara när pluginet uttryckligen deklarerar en avbrytningsslutpunkt med jobb-ID. När leverantören bekräftar avbrytningen tar Libre bort den sparade lokala jobbreferensen.
  • Vid slutförande hämtar backend videon (högst 200 MB, HTTP-omdirigeringar följs inte) och sparar den i galleriet.
  • Jobbposten sparar plugin, modell, alternativ, status och prompt (krypterad vid lagring). Slutförda och misslyckade jobbposter som är äldre än 30 dagar rensas opportunistiskt. Väntande jobbreferenser löper inte ut genom denna rensning.
  • Slutstatusar aviserar: en slutförd video skapar aviseringen media-ready och ett leverantörsfel skapar media-failed. Båda länkar till galleriet, dedupliceras per jobb och levereras genom inkorgen i appen och alla prenumererande webhooks.

Bildredigering och inpainting

Galleribilder får åtgärden Edit image när en redigeringskapabel modell är konfigurerad. Redigeraren målar en mask direkt på bilden — målade områden målas om av modellen, medan en orörd arbetsyta redigerar hela bilden — och kan bifoga ytterligare referensbilder för komposition när modellen accepterar fler än en indata. Redigering använder det OpenAI-kompatibla multipartkontraktet för redigeringar. Ett plugin deltar genom att deklarera edit_endpoint i bildfunktionens config, plus valfria gränser för supports_mask, max_reference_images, edit_mime_types och max_edit_image_bytes (det medföljande OpenAI-manifestet deklarerar dem alla).

Varje indata valideras innan några byte lämnar processen: deklarerad MIME, identifierade magiska byte (PNG, JPEG eller WebP) och ett tak på 10 MiB per bild. Masker måste vara PNG, eftersom endast PNG har alfakanalen som markerar områden som ska målas om. Resultat sparas tillbaka i galleriet med ursprungsmetadata som registrerar källposten i galleriet, antalet uppladdade referensbilder och om en mask användes. Redigeringar mäts exakt som genereringar.

Det gemensamma galleriet

Galleriet listar alla medietyper blandade efter skapandetid, med filterknappar för All, Images, Videos och Audio. Video och ljud spelas upp direkt, bilder öppnas i ljuslådan och varje post kan hämtas eller raderas. Administratörer kan välja automatisk lagringstid med GALLERY_RETENTION_DAYS. Schemaläggarens rensningskörning tar bort media som är äldre än fönstret genom samma beständiga raderingslivscykel som en manuell radering. Om värdet inte anges (standard) behålls media tills ägaren raderar dem.

Lagring och leverans är avsiktligt försiktiga:

  • Media lagras krypterat i programdatabasen (under DATA_DIR), inte som lösa filer på disk. Säkerhetskopiera databasen och ENCRYPTION_KEY tillsammans, som för all krypterad data.
  • API-svar bäddar aldrig in mediedata. Poster refererar i stället till en innehålls-URL per post.
  • Levererat innehåll måste matcha en MIME-tillåtelselista per typ och den lagrade typen, begränsas till 200 MB och levereras med X-Content-Type-Options: nosniff samt en Content-Security-Policy som sandlådar svaret.

De tidigare slutpunkterna enbart för bilder och panelen för bildgenerering fortsätter fungera oförändrade. De skriver till samma galleri.

Hastighetsgränser

Medie-API:et hastighetsbegränsas per klient:

ÅtgärdGräns
Generering (video, tal, ljud)10 förfrågningar per minut
Frågor om videojobbsstatus60 förfrågningar per minut
Gallerilista, innehåll och raderingar120 förfrågningar per minut

Gränssnittets 30-sekundersintervall ligger väl inom frågebudgeten.

Mätning och integritet

Mediegenereringsanrop mäts i administratörens användningsanalys som alla andra utgående leverantörsanrop: plugin, modell, status, varaktighet och enhetsantal. Promptar och genererat innehåll skrivs aldrig till användningsposterna. Själva genererade media och videojobbets prompt finns endast i användarens egna krypterade rader.

Precis som med chatt får den konfigurerade leverantören prompten och returnerar innehållet. Leverantörens priser, lagrings- och innehållspolicyer gäller.

Relaterad dokumentation