alt.freeweights.text / pe-av-small-16-frame
From: facebook <huggingface.co/facebook>Newsgroups: alt.freeweights.textSubject:

pe-av-small-16-frame

Date: 2026-11-15Commit: 9f888eeSigned: 2DC28CC7B26A283B ✓

Model with 847M parameters. Safetensors weights, 3.39 GB in all. Published by facebook under Apache-2.0.

847M params3.39GBpe-av-small-16-framesafetensorspermissive
FactsParams847MSize3.39 GBFormatssafetensorsTasknot taggedLicenseApache-2.0From sourcepermissive
$ fw get facebook/pe-av-small-16-frame
# manifest sha256 abd50b5e4153… · 3.39 GB · 10 files
$ fw verify ./pe-av-small-16-frame facebook/pe-av-small-16-frame
From sourceHosted (signed)facebook/pe-av-small-16-frameLast check: 2026-11-15 03:43 UTC

Get help: custom fine-tune or private deploy. We review your setup before we quote.

Works with

Runs with

Ranked by fit to this model (safetensors), then by GitHub stars.

Overview

Size
3.39 GB
Weights
3.39 GB (safetensors)
Parameters
847M
Formats
safetensors
Task
not tagged
License
Apache-2.0 (permissive)
Files
10, each with a sha256
Publisher
facebook
Added
2026-11-15
Section
alt.freeweights.text
Lineage

Original release from the publisher.

Where these bytes come from
Publisher at the pinned commit→You

Sources are tried in order. A file counts only when its size and sha256 match the manifest. Sources are checked when you ask for them, not on a timer.

Sources
BadgeHostLast checkResult
From sourcehuggingface.co2026-11-15 03:43 UTCpassed

Model card

From the publisher at commit 9f888ee. Shown as plain text with links; images open at the publisher.

Perception Encoder Audio-Visual (PE-AV)#

PE-AV is a state-of-the-art multimodal model that embeds audio, video, audio-video, and text into a joint embedding space. The model enables powerful cross-modal retrieval and understanding across audio, video, and text modalities.

Model Description#

PE-AV is trained using contrastive learning to align audio, video, and text representations in a shared embedding space. The model can encode:

  • Audio only: Extract audio embeddings from audio waveforms
  • Video only: Extract visual embeddings from video frames
  • Audio-Video: Extract joint audio-visual embeddings
  • Text: Extract text embeddings optimized for different modality pairs

Model Variants#

We release 6 model checkpoints with varying sizes and capabilities:

ModelAvg RetrievalVideo Frames used
pe-av-small-16-frame45.216 frames
pe-av-base-16-frame47.016 frames
pe-av-large-16-frame48.216 frames
pe-av-small48.1all frames
pe-av-base50.2all frames
pe-av-large51.6all frames

The -16-frame variants sample exactly 16 frames (evenly spaced apart) from each video, while the base variants support variable-length videos.

Quick Start#

The model is available in both transformers as well as perception_models libraries

perception_models Usage#

import torch
from core.audio_visual_encoder import PEAudioVisual, PEAudioVisualTransform

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# Load model and transform
model = PEAudioVisual.from_config("pe-av-large", pretrained=True).to(device)
transform = PEAudioVisualTransform.from_config("pe-av-large")

video_files = ["video1.mp4", "video2.mp4"]
descriptions = ["description1", "description2"]
audio_files = ["audio1.wav", "audio2.wav"]

# Process inputs and get embeddings
inputs = transform(videos=video_files, text=descriptions, audio=audio_files).to(device)

with torch.inference_mode(), torch.autocast(device.type, dtype=torch.bfloat16):
    outputs = model(**inputs)

# Access different embeddings
audio_embeds = outputs.audio_embeds  # Audio-only embeddings
visual_embeds = outputs.visual_embeds  # Video-only embeddings
audio_visual_embeds = outputs.audio_visual_embeds  # Joint audio-visual embeddings
audio_text_embeds = outputs.audio_text_embeds  # Text embeddings aligned to audio
visual_text_embeds = outputs.visual_text_embeds  # Text embeddings aligned to video
audio_visual_text_embeds = outputs.audio_visual_text_embeds  # Text embeddings aligned to audio-visual
audio_plus_text_embeds = outputs.audio_plus_text_embeds  # Joint audio and text embedding
visual_plus_text_embeds = outputs.visual_plus_text_embeds  # Joint video and text embedding

# Compute the dot product to get their similarities
audio_visual_similarity = audio_embeds @ visual_embeds.T
# When computing similarity against text embeddings, use the
# appropriate text embedding based on the other modality
audio_text_similarity = audio_embeds @ audio_text_embeds.T
video_text_similarity = visual_embeds @ visual_text_embeds.T

Note that you can omit any of the modalities, and use the same forward method. The corresponding embeddings in output will be None. For example:

inputs = transform(videos=video_files, text=descriptions).to(device)

with torch.inference_mode(), torch.autocast(device.type, dtype=torch.bfloat16):
    outputs = model(**inputs)

audio_embeds = outputs.audio_embeds  # None
visual_embeds = outputs.visual_embeds  # available
audio_visual_embeds = outputs.audio_visual_embeds # None
audio_visual_text_embeds = outputs.audio_visual_text_embeds # None
audio_text_embeds = outputs.audio_text_embeds  # None
visual_text_embeds = outputs.visual_text_embeds  # available
audio_plus_text_embeds = outputs.audio_plus_text_embeds  # None
visual_plus_text_embeds = outputs.visual_plus_text_embeds  # Available

We also provide methods for directly encoding an individual modality:

def encode_video_text(self, input_ids, attention_mask=None)
def encode_audio_text(self, input_ids, attention_mask=None)
def encode_audio_video_text(self, input_ids, attention_mask=None)
def encode_audio(self, input_values, padding_mask=None, input_features=None)
def encode_video(self, pixel_values_videos, padding_mask_videos=None, pe_features=None)
def encode_audio_video(
    self,
    input_values,
    pixel_values_videos,
    padding_mask=None,
    padding_mask_videos=None,
    pe_features=None,  # optionally re-use pre-computed PE features
    input_features=None,  # Optionally re-use pre-computed audio codec features
)
def encode_audio_plus_text(
    self,
    input_ids,
    input_values,
    attention_mask=None,
    padding_mask=None,
    input_features=None  # Optionally re-use pre-computed audio codec features
)
def encode_video_plus_text(
    self,
    input_ids,
    pixel_values_videos,
    attention_mask=None,
    padding_mask_videos=None,
    pe_features=None,  # optionally re-use pre-computed PE features
)

transformers Usage#

from transformers import PeAudioVideoModel, PeAudioVideoProcessor
import torch

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = PeAudioVideoModel.from_pretrained("facebook/pe-av-large")
processor = PeAudioVideoProcessor.from_pretrained("facebook/pe-av-large")

model = model.to(device)

video_files = ["video1.mp4", "video2.mp4"]
descriptions = ["description1", "description2"]
audio_files = ["audio1.wav", "audio2.wav"]

# Process inputs and get embeddings
inputs = processor(
    videos=video_files, text=descriptions, audio=audio_files, return_tensors="pt", padding=True
)

with torch.inference_mode(), torch.autocast(device.type, dtype=torch.bfloat16):
    outputs = model(**inputs.to(device), return_loss=True)

audio_embeds = outputs.audio_embeds  # Audio-only embeddings
video_embeds = outputs.video_embeds  # Video-only embeddings
audio_video_embeds = outputs.audio_video_embeds  # Joint audio-video embeddings
text_audio_video_embeds = outputs.audio_video_text_embeds  # Text embeddings aligned to audio-video
text_audio_embeds = outputs.text_audio_embeds  # Text embeddings aligned to audio
text_video_embeds = outputs.text_video_embeds  # Text embeddings aligned to video
audio_plus_text_embeds = outputs.audio_plus_text_embeds  # Joint audio and text embedding
video_plus_text_embeds = outputs.video_plus_text_embeds  # Joint video and text embedding

# For classification, you can use the logits_* fields of the output
audio_text_preds = outputs.logits_audio_text.sigmoid()

# The overall loss is also available in the output (requires passing return_loss=True)
loss = outputs.loss

We also provide methods for directly encoding an individual modality:

def get_text_audio_embeds(self, input_ids, attention_mask=None)

def get_text_video_embeds(self, input_ids, attention_mask=None)

def get_text_audio_video_embeds(self, input_ids, attention_mask=None)

def get_audio_embeds(self, input_values, padding_mask=None)

def get_video_embeds(self, pixel_values_videos, padding_mask_videos=None)

def get_audio_video_embeds(
    self,
    input_values: torch.Tensor,
    pixel_values_videos: torch.Tensor,
    padding_mask: Optional[torch.Tensor] = None,
    padding_mask_videos: Optional[torch.Tensor] = None,
    return_audio_embeds: bool = False,
    return_video_embeds: bool = False,
)

def get_audio_plus_text_embeds(
    self,
    input_ids: torch.Tensor,
    input_values: torch.Tensor,
    attention_mask: Optional[torch.Tensor] = None,
    padding_mask: Optional[torch.Tensor] = None,
)

def get_video_plus_text_embeds(
    self,
    input_ids: torch.Tensor,
    pixel_values_videos: torch.Tensor,
    attention_mask: Optional[torch.Tensor] = None,
    padding_mask_videos: Optional[torch.Tensor] = None,
)

Citation#

@misc{vyas2025pushingfrontieraudiovisualperception,
      title={Pushing the Frontier of Audiovisual Perception with Large-Scale Multimodal Correspondence Learning},
      author={Apoorv Vyas and Heng-Jui Chang and Cheng-Fu Yang and Po-Yao Huang and Luya Gao and Julius Richter and Sanyuan Chen and Matt Le and Piotr Dollár and Christoph Feichtenhofer and Ann Lee and Wei-Ning Hsu},
      year={2025},
      eprint={2512.19687},
      archivePrefix={arXiv},
      primaryClass={cs.SD},
      url={https://arxiv.org/abs/2512.19687},
}

License#

This model is released under the Apache 2.0 license.

Files

10 files · 3.39 GBWeights 3.39 GB (safetensors). Sizes and sha256 from the signed manifest.
Hide all 10 files with their sha256
FileSizesha256
.gitattributes1.52 KB11ad7efa24975ee4b0c3c3a38ed18737f0658a5f75a0a96787b576a78a023361
README.md9.00 KBb465568906d30738e305a5d2744f434c7c39baf374d908a65b37691f5a62484b
config.json31.5 KB8dfb0862358b3acb838b8ed18dd1d4001d8fa2867b7a07caa3cff61b55d30f38
model.safetensors3.39 GB5db3ff97be47b9e369df9f557b7daa11017dfcacc79087557b83ea4378d78c6a
preprocessor_config.json225 B0ee55f8b2de0849b9fdebdc96486fcbb12eafe8e63d688f3a307a24048d80efa
processor_config.json1.18 KB3d25157d83e232d43257022b50422c8b5075860476d6b5e3982817ca5e0ffa7b
special_tokens_map.json694 Bea97ecdbcc73713039d8d64dbb05e3689495c96657fbd9a18f5bed381be81049
tokenizer.json3.58 MB43e9ea931bb0f359d16d0e435c26abbebd9a42a7298270b8ab7e5c9fa1be1dcb
tokenizer_config.json434 Badec72131bbba5a043594c1e3bf5930608546e46a51432b2502b392ec280551b
video_preprocessor_config.json403 Bf384b06fb60860febadebeff6531129e1ec7acdeb3b78ad98b651211cb9765c4
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
9f888eea95 pinned now2026-11-15 03:43 UTC10 files · 3.39 GB

Use it

$ fw get facebook/pe-av-small-16-frame
# manifest sha256 abd50b5e4153… · 3.39 GB · 10 files
$ fw verify ./pe-av-small-16-frame facebook/pe-av-small-16-frame
fw.pyChecks the signature and every sha256, tries each source in order, resumes.
$ python3 fw.py get https://freeweights.allternit.com/manifests/facebook/pe-av-small-16-frame.json --dir ./pe-av-small-16-frame $ python3 fw.py verify ./pe-av-small-16-frame ./facebook__pe-av-small-16-frame.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download facebook/pe-av-small-16-frame --revision 9f888eea95c83622212bb742e91bf01d3b46fe96 --local-dir ./pe-av-small-16-frame

License

Name
Apache License 2.0
Id
Apache-2.0
Class
Permissive
Redistribution
yes
Listing
Hosted (signed)
Decided
License as declared by the publisher. No person read it. 2026-11-15
Text in
README.md
Text sha256
b465568906d30738e305a5d2744f434c7c39baf374d908a65b37691f5a62484b
Terms gate
No extra terms beyond the license.

Read the license text

Licenses are checked against the license table. A custom license passes only after a person reads it.

Provenance

From: facebook <huggingface.co/facebook>Newsgroups: alt.freeweights.textSubject: pe-av-small-16-frameDate: 2026-11-15Commit: 9f888eeSigned: 2DC28CC7B26A283B ✓
Upstream
facebook/pe-av-small-16-frame
Pinned commit
9f888eea95c83622212bb742e91bf01d3b46fe96
Manifest
pe-av-small-16-frame.json · .minisig
Manifest sha256
abd50b5e4153cc063ab2f14df2525ffe17e49d6ac19e9458ee8287a958fa68ac
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-15 03:43 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/facebook/pe-av-small-16-frame.json $ curl -O https://freeweights.allternit.com/manifests/facebook/pe-av-small-16-frame.json.minisig $ minisign -Vm pe-av-small-16-frame.json -P RWQ7KGqyx4zCLXtUFOqvfv8L3g+8fpKJ1FsuxPyOYMF+4KufbUxKq1Oq $ shasum -a 256 <file> # compare with the Files tab

A manifest whose signature fails must be rejected. A file whose size or sha256 does not match must be discarded. Verify a download

Model tree

No related models in this catalog.Nothing here lists this model as its parent, and it names no parent.
Get it
Download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download facebook/pe-av-small-16-frame
Open in Freeweights Studio

Pull, verify and run it in the Allternit app on Desktop, web or phone.

Signed manifest
minisign, key 2DC28CC7B26A283B. pe-av-small-16-frame.json. Provenance. Takedown history: none.
From: laion <huggingface.co/laion>Subject: a2-rl-e2egit_large-50-32B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_e2egit-large-15-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_e2egit-v2-10-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_pymethods2test-large-80-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_unitsyn-python-large-10-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_mix_h2_language_proportional-65-8B