4.3 KiB
<<<<<<< Updated upstream This model was released on 2025-04-17 and added to Hugging Face Transformers on 2025-12-16.
This model was published in HF papers on 2025-04-17 and contributed to Hugging Face Transformers on 2025-12-16.
Stashed changes
PE Audio Video
PE Audio Video is the joint audio–video branch of Meta's Perception Encoder family. It encodes audio and video streams together with a shared text tower, producing contrastive embeddings for every pairwise combination, audio-text, video-text, audio-video, and audio+text-video, from a single forward pass.
Internally the model aligns the video feature sequence to the audio's temporal resolution via nearest-neighbor interpolation, so clips with different frame rates from sample rates stay in lockstep. The text encoder weights are tied across the audio and video branches.
You can find all the official PE Audio Video checkpoints under the perception-encoder-audio-visual collection.
Quickstart
import torch
from datasets import load_dataset
from transformers import AutoProcessor, PeAudioVideoModel
from transformers.video_utils import load_video
processor = AutoProcessor.from_pretrained("facebook/pe-av-large")
model = PeAudioVideoModel.from_pretrained(
"facebook/pe-av-large",
device_map="auto",
)
ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
audio = ds[0]["audio"]["array"]
video, _ = load_video("https://huggingface.co/datasets/hf-internal-testing/fixtures_videos/resolve/main/tennis.mp4")
labels = ["a person playing tennis with background crowd", "a dog barking in a park"]
audio_inputs = processor.feature_extractor(audio, sampling_rate=48_000, return_tensors="pt").to(model.device)
video_inputs = processor.video_processor(video, num_frames=16, return_tensors="pt").to(model.device)
text_inputs = processor.tokenizer(labels, padding=True, return_tensors="pt").to(model.device)
inputs = {**audio_inputs, **video_inputs, **text_inputs}
with torch.no_grad():
outputs = model(**inputs)
print("audio-text:", outputs.logits_audio_text.sigmoid().tolist())
print("video-text:", outputs.logits_video_text.sigmoid().tolist())
print("audio-video:", outputs.logits_audio_video.sigmoid().tolist())
Usage tips and notes
- [
PeAudioVideoModel] requires at least two ofinput_ids,input_values,pixel_values_videos— if only two are provided it dispatches to the audio-only or video-only sub-model. Passing all three triggers the joint audio-video-text path and the full set of logit matrices in [PeAudioVideoOutput]. - Audio uses
padding_maskand video usespadding_mask_videossimultaneously. They are independent masks; do not conflate them withattention_mask, which is reserved for the text tower. - Audio–video alignment runs per-batch-element inside
_align_video_hidden_state, so batches with very different audio/video lengths iterate rather than vectorizing. Keep batch items roughly balanced for throughput. - The text tower's weights are tied across branches via
_tied_weights_keys— do not try to load separate text encoders for the audio and video halves.
PeAudioVideoConfig
autodoc PeAudioVideoConfig
PeAudioVideoEncoderConfig
autodoc PeAudioVideoEncoderConfig
PeAudioVideoProcessor
autodoc PeAudioVideoProcessor
PeAudioVideoEncoder
autodoc PeAudioVideoEncoder - forward
PeAudioVideoModel
autodoc PeAudioVideoModel - forward