メインコンテンツまでスキップ

動画と音声の生成

Libre WebUI 0.18.0 では、生成機能が画像以外にも拡張されました。プロバイダープラグインは動画と音声の機能を宣言でき、生成された画像、動画、読み上げ音声、サウンドはすべて、ユーザーごとの 1 つのメディアギャラリーへ保存されます。

メディア生成は、すべての認証済みユーザーが利用できます。ギャラリーは厳密にユーザーごとに分離され、読み取り、コンテンツ取得、削除はすべてサインイン中のアカウントに限定されます。

プラグインの機能ブロック

プラグイン定義では、メディア機能ごとに独立したブロックを宣言します。

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

各ブロックには、endpoint、フォールバック用の model_map リスト、ライブモデル検索用の任意の models_endpoint、機能固有のオプションを含む config オブジェクトがあります。オプションには、画像のサイズとアスペクト比、読み上げの音声と形式、動画の解像度、アスペクト比、長さなどがあります。動画プロバイダーは、プロンプト ID を指定する cancel_endpointcancel_method も宣言できます。Libre は、通常の生成エンドポイントがあるだけでは、キャンセル対応を推測しません。

音声機能は 2 種類あり、どちらもギャラリーに音声として保存されます。

  • tts は読み上げ音声です。選択した音声でテキストを読み上げます。
  • audio はサウンドです。モデルがプロンプトから音声コンテンツを生成します。

現在、videoaudio のブロックを宣言する同梱プラグインは OpenRouter(plugins/openrouter.json)だけです。models_endpoint がある場合、モデル一覧は通常の検索サイクルで更新されます(検索 TTL 設定は環境変数を参照)。model_map は引き続きフォールバックとして機能します。

メディアを生成する

Imagine/gallery)を開きます。ヘッダーには、画像生成が設定で有効な場合の生成に加え、動画音声のパネルがあります。

読み上げとサウンドの生成は同期処理です。リクエストを実行し、結果をギャラリーへ保存してから、完成した項目を応答として返します。キャンセルすると、ブラウザリクエストと Libre からプロバイダーへのリクエストが中止され、キャンセルされた結果は保存されません。画像生成も、接続切断時にキャンセルする同じコントラクトに従います。

受け付けられた ComfyUI ワークフローでは、Libre はプロンプト ID を指定したジョブキャンセル操作と、同じくプロンプト ID を指定したキュー削除の両方を送信し、リクエストを解放する前に最大 3 秒間、その後処理を待ちます。別のユーザーのワークフローを停止しかねない、ComfyUI の対象を指定しない interrupt 操作は決して呼び出しません。現在の ComfyUI リリースには、実行中のワークフロー用に /api/jobs/:promptId/cancel があります。その操作がない古いリリースでも、保留中キューから正確な項目を削除できますが、すでに実行中のワークフローを安全に停止することはできません。完全なキャンセルコントラクトを利用するには、ComfyUI をアップグレードしてください。

TTS プラグインでは、音声クローニングも宣言できます。対応モデルでは、音声パネルに参照音声のアップロード欄が表示され、プロバイダーが必要とする場合は、正確な文字起こし入力欄も表示されます。Libre WebUI はマニフェストにあるファイル種別とサイズの上限を検証し、アップロードをメモリ内に保持して、選択されたプロバイダーだけへ転送します。ギャラリーへ保存されるのは生成された音声だけです。

クローンは、同じプラグインとモデルで再利用できる名前付き音声として任意で保存できます。保存には、別途ストレージへの同意確認が必要です。Libre WebUI は元の参照音声と文字起こしを、ユーザー所有の音声プロファイルへ暗号化して保存します。生成された音声を参照用には使いません。保存したプロファイルは、設定 → 音声合成で選択または完全に削除できます。設定済みプロバイダーは、音声バッチを生成するたびに、保存された参照を再び受け取ります。プロファイルは、そのプロバイダーで承認されたルーティングに紐付けられます。プラグイン定義またはエンドポイントが変わった場合は、新しい送信先への同意としてプロファイルを作り直してください。クローニング要求と保存要求の両方に話者が同意した録音だけを使用してください。

音声プロファイルには生体情報の元データが含まれるため、Libre WebUI の一般的なデータエクスポートから意図的に除外されています。災害復旧が必要な場合は、暗号化されたアプリケーションデータベースと ENCRYPTION_KEY を一緒にバックアップしてください。それ以外の場合は、同意を得た元の録音からプロファイルを再作成します。

動画ジョブのライフサイクル

動画生成は非同期です。ジョブを送信すると(POST /api/media/video/generate)、ジョブレコードとともに 202 が返り、ジョブは pendingin_progress を経て、最終的に completed または failed へ移行します。

  • 検証後、送信処理はブラウザ応答から切り離されます。パネルやネットワーク接続が、プロバイダーの応答中に閉じられた場合でも、Libre は受付直後にプロバイダーのジョブ ID を永続化します。
  • GET /api/media/video/jobs が一覧表示するのは、認証済みユーザーに保存されたハンドルだけです。パネルを開くたびに、最大 100 件の有効なハンドルを取得します。そのため、保留中のジョブは画面移動、再読み込み、切断後にも再度開けます。
  • 永続ジョブ media.video.resume.v1 は、パネルが閉じていてもプロバイダーをポーリングし、完了した結果をダウンロードします。ソロモードでは組み込みワーカー、チームモードでは外部ワーカーがハンドラーを実行します。リース、回数制限付き再試行、実行者の再検証、条件付き完了により、プロセスが停止した後でも別のワーカーがジョブを引き継げます。ギャラリー行や Blob 参照の重複は生じません。既存の再開/GET エンドポイントは互換性と状態確認の境界として残り、UI は表示用に引き続きポーリングする場合があります。
  • パネルを閉じるか待機を停止を選んでも、中止されるのは現在の状態確認またはダウンロード通信だけです。プロバイダー側のジョブをキャンセル操作は、そのプラグインがジョブ ID 指定のキャンセルエンドポイントを明示的に宣言した場合だけ表示されます。プロバイダーでキャンセルが確認されると、Libre は保存済みのローカルハンドルを削除します。
  • 完了すると、バックエンドは動画をダウンロードし(上限 200 MB、HTTP リダイレクトには従いません)、ギャラリーへ保存します。
  • ジョブレコードには、プラグイン、モデル、オプション、状態、プロンプト(保存時に暗号化)が記録されます。完了または失敗から 30 日を過ぎたジョブレコードは適宜削除されます。保留中ハンドルはこのクリーンアップによって期限切れになりません。
  • 最終状態になると通知します。動画の完了では media-ready、プロバイダーの失敗では media-failed の通知が投稿されます。どちらもギャラリーへリンクし、ジョブごとに重複排除され、アプリ内受信トレイと購読中の Webhook へ配信されます。

画像編集とインペインティング

ギャラリーの画像では、編集対応モデルが設定されていると画像を編集操作を利用できます。エディターでは画像上へ直接マスクを描きます。塗った領域はモデルによって再描画され、何も塗らなければ画像全体が編集対象になります。モデルが複数入力に対応する場合は、合成用の追加参照画像も添付できます。編集には OpenAI 互換の multipart edits コントラクトを使います。プラグインは、画像機能の設定で edit_endpoint を宣言し、任意で supports_maskmax_reference_imagesedit_mime_typesmax_edit_image_bytes の上限を指定することで参加します(同梱の OpenAI マニフェストではすべて宣言されています)。

どのバイトもプロセスを出る前に、すべての入力を検証します。宣言された MIME、検出したマジックバイト(PNG、JPEG、WebP)、画像 1 枚あたり 10 MiB の上限を確認します。再描画領域を示すアルファチャンネルを持てるのは PNG だけなので、マスクは PNG でなければなりません。結果はギャラリーへ保存され、来歴メタデータとして元のギャラリー項目、アップロードした参照画像の数、マスク使用の有無を記録します。編集の使用量も生成とまったく同じように計測されます。

統合ギャラリー

ギャラリーでは、作成時刻順にすべてのメディア種別を混在表示し、すべて画像動画音声のフィルターピルを利用できます。動画と音声はインライン再生され、画像はライトボックスで開きます。どの項目もダウンロードまたは削除できます。管理者は GALLERY_RETENTION_DAYS で自動保持を任意に有効化できます。スケジューラーのスイープは、手動削除と同じ永続的な削除ライフサイクルを通じて、保持期間より古いメディアを削除します。未設定(デフォルト)の場合、所有者が削除するまでメディアを保持します。

保存と配信は、意図的に保守的な設計です。

  • メディアはディスク上の個別ファイルではなく、アプリケーションデータベース(DATA_DIR 配下)内に暗号化して保存されます。他のすべての暗号化データと同様に、データベースと ENCRYPTION_KEY を一緒にバックアップしてください。
  • API 応答へメディアペイロードを直接埋め込むことはありません。代わりに、各項目が固有のコンテンツ URL を参照します。
  • 配信するコンテンツは、メディア種別ごとの MIME 許可リストおよび保存された型と一致する必要があり、上限は 200 MB です。X-Content-Type-Options: nosniff と、応答をサンドボックス化する Content-Security-Policy を付けて配信されます。

従来の画像専用エンドポイントと画像生成パネルは、そのまま動作し続け、同じギャラリーへ書き込みます。

レート制限

メディア API には、クライアントごとのレート制限があります。

操作上限
生成(動画、読み上げ音声、サウンド)1 分あたり 10 リクエスト
動画ジョブのポーリング1 分あたり 60 リクエスト
ギャラリーの一覧表示、コンテンツ取得、削除1 分あたり 120 リクエスト

UI の 30 秒間隔のポーリングは、上限に十分収まります。

計測とプライバシー

メディア生成の呼び出しは、他の外向きプロバイダー呼び出しと同様に、管理者向けの使用状況分析で計測されます。記録するのはプラグイン、モデル、状態、所要時間、単位数です。プロンプトと生成コンテンツが使用状況レコードへ書き込まれることはありません。生成されたメディア自体と動画ジョブのプロンプトは、そのユーザー専用の暗号化行だけに存在します。

チャットと同様に、設定済みプロバイダーがプロンプトを受け取り、コンテンツを返します。プロバイダーの料金、保持、コンテンツポリシーが適用されます。

関連ドキュメント