Instructions to use Lightricks/LTX-2-Marking with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- AudioSeal
How to use Lightricks/LTX-2-Marking with AudioSeal:
# Watermark Generator from audioseal import AudioSeal model = AudioSeal.load_generator("Lightricks/LTX-2-Marking") # pass a tensor (tensor_wav) of shape (batch, channels, samples) and a sample rate wav, sr = tensor_wav, 16000 watermark = model.get_watermark(wav, sr) watermarked_audio = wav + watermark# Watermark Detector from audioseal import AudioSeal detector = AudioSeal.load_detector("Lightricks/LTX-2-Marking") result, message = detector.detect_watermark(watermarked_audio, sr) - Notebooks
- Google Colab
- Kaggle
LTX-2 Marking Pack (VideoSeal / AudioSeal)
Weights and configs for the opt-in, post-hoc invisible marking used by LTX-2: PixelSeal (VideoSeal family) for video frames and AudioSeal for stereo PCM.
This repository contains weights only. The code that loads, embeds, and detects lives in the public LTX-2 repository under packages/ltx-pipelines/src/ltx_pipelines/marking. Full documentation is in packages/ltx-pipelines/docs/marking.md.
The marks are not cryptographic signatures. They are a robust, invisible signal that a clip was produced by an LTX-2 pipeline with marking enabled. Absence of a detected mark does not prove a clip was not generated.
Files
The LTX-2 loader (create_markers) requires all five model files to be present in one directory.
| File | Description | SHA-256 |
|---|---|---|
pixelseal.pth |
PixelSeal embedder + extractor weights (model state only) | 97cff15f75515259b49a2cffc8fcd600c287cafe3f29c1d5c6ef9c81b492c088 |
pixelseal.yaml |
PixelSeal model card (architecture, 256-bit payload, 256 px processing size) | 96c4a448f7d81810780e5bde5a51b039db544b7ec2baf65a605302c1b17362c9 |
videoseal_attenuation.yaml |
JND attenuation channel map referenced by the card | e0d71354f8945cf600bd4ebd5e2641a9c879e017548dd6cc8a6de10239d7e821 |
audioseal_generator.pth |
AudioSeal 16-bit generator (embed) | 7a845b5fbe9364a63a3909d8ab3fe064d13a76ae4c2e983573e08c69b7b51748 |
audioseal_detector.pth |
AudioSeal 16-bit detector | 8a78e8a83584113523e161fc599fcab10fd0e94c04d2eb9d2fa1e9ec91ab69d9 |
LICENSE-videoseal, LICENSE-audioseal |
Upstream MIT licenses |
.pth files are PyTorch pickles. Verify the checksums after download and load them only from this repository:
sha256sum pixelseal.pth pixelseal.yaml videoseal_attenuation.yaml audioseal_generator.pth audioseal_detector.pth
Usage
Install
Clone LTX-2 and install the marking extras:
uv sync --extra videoseal --extra audioseal
# or
pip install 'ltx-pipelines[videoseal,audioseal]'
Download the pack
The LTX-2 library never downloads weights itself. Fetch this repository to a local directory:
hf download Lightricks/LTX-2-Marking --local-dir path/to/marking
Mark during generation
Video-generation and editing CLIs, HDR IC-LoRA, and text-to-audio accept --marker-root-path. Omit the flag to leave pixels and PCM unchanged.
python -m ltx_pipelines.distilled \
... \
--marker-root-path path/to/marking \
--output-path out.mp4
Pipeline-specific behavior:
- HDR: video marking is skipped; audio is still marked.
- Audio-to-video: only the video is marked, because the source audio is passed through.
- Text-to-audio: only the audio marker is used.
Detect
import torch
from ltx_pipelines.marking import create_markers, detect_audio_mark, detect_video_mark
video_marker, audio_marker = create_markers("path/to/marking", torch.device("cuda"))
print(detect_video_mark(video_marker, "out.mp4"))
print(detect_audio_mark(audio_marker, "out.mp4"))
Each call returns MarkDetectResult(detected, bit_accuracy, p_value, payload). bit_accuracy and p_value come from a binomial test of the decoded bits against the payload, which is fixed in the LTX-2 code (not in these weights). detected is each marker's own decision:
- Video: every 8th decoded frame is resized to 256Γ256 and run through the extractor; bit logits are averaged over the sampled frames.
detectedislog10(p_value) < -6. - Audio: the full track is scanned, with each stereo channel processed as its own mono signal.
detectedmeans at least half of the samples have a watermark probability above 0.5.
Detection runs on CPU or GPU. A GPU is much faster: on one B200, video detect takes about 15β30 ms per 5β10 s clip at up to 4K, versus 0.6β3 s on CPU. Both figures exclude file decoding.
Scope and limitations
- Video marking targets SDR H.264 output; HDR output is not video-marked.
- AudioSeal runs at the native 24/48 kHz rate and does not resample.
- These are Meta's general-purpose models. Anyone holding the weights and the LTX-2 code can run detection, and a determined adversary may be able to weaken or remove the mark.
Provenance
pixelseal.pthis Meta's public PixelSeal checkpoint (facebookresearch/videoseal), repacked to themodelstate dict only. The optimizer, discriminator, EMA, and scheduler state were dropped; the model tensors are unchanged.pixelseal.yamlis the PixelSeal card fromvideosealcommit870ca7f.videoseal_attenuation.yamlis thejnd_1_1entry of that repo'sconfigs/attenuation.yaml, which the pip package does not ship.audioseal_generator.pthandaudioseal_detector.pthare the unmodified 16-bit base models from facebook/audioseal.
License
All weights and configs are released by Meta Platforms, Inc. under the MIT License; see LICENSE-videoseal and LICENSE-audioseal. The LTX-2 code is licensed separately; see the LTX-2 repository.
Citation
@article{fernandez2024video,
title = {Video Seal: Open and Efficient Video Watermarking},
author = {Fernandez, Pierre and Elsahar, Hady and Yalniz, I. Zeki and Mourachko, Alexandre},
journal = {arXiv preprint arXiv:2412.09492},
year = {2024}
}
@inproceedings{sanroman2024proactive,
title = {Proactive Detection of Voice Cloning with Localized Watermarking},
author = {San Roman, Robin and Fernandez, Pierre and Elsahar, Hady and D{\'e}fossez, Alexandre and Furon, Teddy and Tran, Tuan},
booktitle = {International Conference on Machine Learning (ICML)},
year = {2024}
}