Skip to content
このページは AI の支援により作成・翻訳されました。誤りがあれば、改善にご協力ください。 GitHub で編集

マルチモーダルコンテンツ処理

PRX はマルチモーダルコンテンツ -- 画像、音声、動画 -- をチャネルと LLM プロバイダー全体でサポートします。マルチモーダルサブシステムはコンテンツタイプ検出、フォーマットトランスコーディング、サイズ制限、チャネルとプロバイダー間の機能ネゴシエーションを処理します。

概要

ユーザーがチャネルを通じてメディア添付ファイル(写真、ボイスメッセージ、ドキュメント)を送信すると、マルチモーダルパイプラインは以下を実行します:

  1. マジックバイトとファイル拡張子を使用してコンテンツタイプを検出
  2. サイズとフォーマットの制約に対してコンテンツを検証
  3. ターゲットプロバイダーがソースフォーマットをサポートしていない場合、コンテンツをトランスコード
  4. 会話コンテキストの一部として LLM プロバイダーにコンテンツをディスパッチ
  5. プロバイダーが画像や音声を生成した場合、レスポンスのメディアを処理
Channel Input                    Provider Output
  │                                  │
  ▼                                  ▼
┌──────────────┐              ┌──────────────┐
│ Content Type │              │ Response     │
│ Detection    │              │ Media        │
└──────┬───────┘              └──────┬───────┘
       │                             │
       ▼                             ▼
┌──────────────┐              ┌──────────────┐
│ Validation   │              │ Transcoding  │
│ & Limits     │              │ (if needed)  │
└──────┬───────┘              └──────┬───────┘
       │                             │
       ▼                             ▼
┌──────────────┐              ┌──────────────┐
│ Transcoding  │              │ Channel      │
│ (if needed)  │              │ Delivery     │
└──────┬───────┘              └──────────────┘


┌──────────────┐
│ Provider     │
│ Dispatch     │
└──────────────┘

サポートされるコンテンツタイプ

画像

フォーマット検出方法プロバイダーへの送信プロバイダーからの受信
JPEGマジックバイト FF D8 FF可能可能
PNGマジックバイト 89 50 4E 47可能可能
GIFマジックバイト 47 49 46可能(最初のフレーム)不可
WebPRIFF ヘッダー + WEBP可能可能
BMPマジックバイト 42 4DPNG にトランスコード不可
TIFFマジックバイト 49 49 または 4D 4DPNG にトランスコード不可
SVGXML 検出PNG にラスタライズ不可

音声

フォーマット検出方法文字起こしプロバイダー入力
OGG/OpusOGG ヘッダー可能(STT 経由)文字起こしテキスト
MP3ID3/sync ヘッダー可能(STT 経由)文字起こしテキスト
WAVRIFF + WAVE可能(STT 経由)文字起こしテキスト
M4A/AACftyp ボックス可能(STT 経由)文字起こしテキスト
WebMEBML ヘッダー可能(STT 経由)文字起こしテキスト

動画

フォーマット検出方法処理
MP4ftyp ボックスキーフレーム + 音声トラック抽出
WebMEBML ヘッダーキーフレーム + 音声トラック抽出
MOVftyp ボックスキーフレーム + 音声トラック抽出

動画ファイルはキーフレーム画像と音声トラックに分解されます。キーフレームは画像として送信され、音声は文字起こしされます。

コンテンツタイプ検出

検出は 2 パスアプローチを使用します:

  1. マジックバイト -- ファイルの最初の 16 バイトを既知のシグネチャと照合
  2. ファイル拡張子 -- マジックバイトが決定的でない場合、ファイル拡張子をフォールバックとして使用
  3. MIME タイプヘッダー -- HTTP 経由で受信したコンテンツの場合、Content-Type ヘッダーを参照

検出結果によって、どの処理パイプラインがコンテンツを処理するかが決定されます。

設定

toml
[multimodal]
enabled = true

[multimodal.images]
max_size_bytes = 20_971_520      # 20 MB
max_resolution = "4096x4096"     # maximum width x height
auto_resize = true               # resize images exceeding max_resolution
resize_quality = 85              # JPEG quality for resized images (1-100)
strip_exif = true                # remove EXIF metadata for privacy

[multimodal.audio]
max_size_bytes = 26_214_400      # 25 MB
max_duration_secs = 300          # 5 minutes
stt_provider = "whisper"         # "whisper", "deepgram", or "provider" (use LLM provider's STT)
stt_model = "whisper-1"
stt_language = "auto"            # "auto" for language detection, or ISO 639-1 code

[multimodal.video]
max_size_bytes = 104_857_600     # 100 MB
max_duration_secs = 120          # 2 minutes
keyframe_interval_secs = 5       # extract one keyframe every 5 seconds
max_keyframes = 20               # maximum keyframes to extract
extract_audio = true             # transcribe audio track

設定リファレンス

画像

フィールドデフォルト説明
max_size_bytesu6420971520画像ファイルの最大サイズ(20 MB)
max_resolutionString"4096x4096"画像の最大解像度(幅x高さ)
auto_resizebooltrue超過サイズの画像を自動リサイズ
resize_qualityu885リサイズ画像の JPEG 品質(1--100)
strip_exifbooltrue画像から EXIF メタデータを除去

音声

フィールドデフォルト説明
max_size_bytesu6426214400音声ファイルの最大サイズ(25 MB)
max_duration_secsu64300音声の最大長(5 分)
stt_providerString"whisper"音声認識プロバイダー
stt_modelString"whisper-1"STT モデル名
stt_languageString"auto"文字起こしの言語ヒント

動画

フィールドデフォルト説明
max_size_bytesu64104857600動画ファイルの最大サイズ(100 MB)
max_duration_secsu64120動画の最大長(2 分)
keyframe_interval_secsu645キーフレーム抽出間隔(秒)
max_keyframesusize20抽出するキーフレームの最大数
extract_audiobooltrue動画の音声トラックを文字起こし

プロバイダー機能

すべての LLM プロバイダーが同じメディアタイプをサポートしているわけではありません。PRX は機能を自動的にネゴシエートします:

プロバイダー画像入力画像出力音声入力ネイティブマルチモーダル
Anthropic (Claude)対応非対応非対応(先に文字起こし)対応(ビジョン)
OpenAI (GPT-4o)対応対応(DALL-E)対応(Whisper)対応
Google (Gemini)対応対応(Imagen)対応対応
Ollama (LLaVA)対応非対応非対応対応(ビジョン)
AWS Bedrockモデル依存モデル依存非対応モデル依存

プロバイダーがメディアタイプをネイティブにサポートしていない場合、PRX はフォールバック処理を適用します:

  • 画像非対応 -- ビジョン対応モデルを使用して画像を説明し、その説明をテキストとして送信
  • 音声非対応 -- 設定された STT プロバイダーで音声を文字起こしし、トランスクリプトをテキストとして送信
  • 動画非対応 -- キーフレームと音声トランスクリプトを複合メッセージとして送信

チャネルメディア制限

各チャネルには独自のファイルサイズとフォーマット制限があります:

チャネル最大アップロード最大ダウンロードサポートフォーマット
Telegram50 MB20 MB画像、音声、動画、ドキュメント
Discord25 MB(無料)25 MB画像、音声、動画、ドキュメント
WhatsApp16 MB(メディア)16 MBJPEG、PNG、MP3、MP4、PDF
QQ20 MB20 MB画像、音声、ドキュメント
DingTalk20 MB20 MB画像、音声、ドキュメント
Lark25 MB25 MB画像、音声、動画、ドキュメント
Matrixホームサーバー依存ホームサーバー依存一般的なフォーマットすべて
Email25 MB(一般的)25 MBMIME 添付ファイルですべて対応
CLIファイルシステム制限ファイルシステム制限すべてのフォーマット

PRX はレスポンスの送信を試みる前にチャネルの制限を強制します。生成された画像やファイルがチャネルの制限を超える場合、圧縮されるかダウンロードリンクが代わりに提供されます。

トランスコーディングパイプライン

フォーマット変換が必要な場合、PRX は以下のトランスコーディングパイプラインを使用します:

  1. 画像トランスコーディング -- image クレートで処理(純粋な Rust、外部依存なし)
  2. 音声トランスコーディング -- FFmpeg がインストールされている場合はそれを使用、そうでなければ一般的なフォーマット用のネイティブデコーダーにフォールバック
  3. 動画キーフレーム抽出 -- FFmpeg が必要

FFmpeg 検出

PRX は起動時に FFmpeg を自動検出します:

bash
prx doctor multimodal

出力例:

Multimodal Support:
  Images: OK (native)
  Audio transcoding: OK (ffmpeg 6.1 detected)
  Video processing: OK (ffmpeg 6.1 detected)
  STT provider: OK (whisper-1 via OpenAI)

FFmpeg がインストールされていない場合、音声トランスコーディングと動画処理はネイティブサポートされるフォーマットに制限されます。

制限事項

  • 動画処理にはシステムに FFmpeg がインストールされている必要あり
  • 大きなメディアファイルは LLM トークン使用量を大幅に増加させる可能性あり(特に複数のキーフレーム)
  • 一部のプロバイダーはビジョン/マルチモーダル API コールに追加料金を課す場合あり
  • リアルタイム音声ストリーミング(ライブ音声会話)はまだサポートされていない
  • プロバイダーから生成された画像(DALL-E、Imagen)はプロバイダーのコンテンツポリシーに従う
  • SVG ラスタライズは基本的なレンダラーを使用。複雑な SVG は正確にレンダリングされない場合あり

関連ページ

Released under the Apache-2.0 License.