File size: 3,811 Bytes
86b2ec3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
---
license: mit
tags:
  - active-speaker-detection
  - audio-visual
  - speaker-diarization
  - streaming
  - pytorch
  - pytorch-lightning
---

# CAST-ASD

Pretrained weights for **CAST-ASD: Causal Attention over Speakers and Time for Online Active Speaker Detection**.

Pratham Gupta, Haotian Qi, Tushar Sandhan, Gabriel Skantze

[Paper (arXiv:2610.14676)](https://arxiv.org/abs/2610.14676) · [Code](https://github.com/prathamg007/CAST-ASD) · [Project page and interactive demo](https://prathamg007.github.io/CAST-ASD/)

CAST-ASD decides, for every visible face in every video frame, whether that person is speaking, without reading any future frame. It adds one CAST block to a causal per-face backbone: a speaker pass attends across the faces present at the current frame, and a time pass attends causally over each face's own past. The block has 1.57M parameters, independent of the number of faces. On MSDWild it removes 32% of the competing-speaker false alarms of the causal per-face backbone it extends.

## Files

All four checkpoints are CAST ×1 (one block). Each needs its config, included here and in the code repository.

| File | Config | Seed | Validation mAP | Paper (mean of 3 seeds) |
|---|---|:---:|---|---|
| `weights/msdwild_cast.ckpt` | `configs/msdwild/cast.yaml` | 42 | few.val 97.01, many.val 90.66 | few.val 96.99, many.val 90.56 |
| `weights/msdwild_cast_offline.ckpt` | `configs/msdwild/cast_offline.yaml` | 1 | few.val 97.55, many.val 91.77 | few.val 97.51, many.val 91.70 |
| `weights/ava_cast.ckpt` | `configs/ava/cast.yaml` | 2 | official 91.21 | official 91.07 |
| `weights/ava_cast_offline.ckpt` | `configs/ava/cast_offline.yaml` | 1 | official 94.31 | official 94.20 |

- `msdwild_*` are trained on MSDWild (few-speaker training split); `ava_*` on AVA-ActiveSpeaker.
- `*_offline` checkpoints use the same architecture without the causal constraints and read the whole clip.
- Each model was trained with seeds 42, 1 and 2; the released file is the best of the three on the selection metric (few.val mAP on MSDWild, official mAP on AVA). The paper reports the mean over the three seeds.
- MSDWild checkpoints are from the final (12th) epoch; AVA checkpoints are the best epoch under early stopping.
- The frozen Mimi audio encoder is not stored in these files. It is downloaded from `kyutai/moshiko-pytorch-bf16` and merged in when a checkpoint loads. Optimizer state is stripped, so the files evaluate but cannot resume training.

## Usage

The checkpoints are PyTorch Lightning files for the code in the [GitHub repository](https://github.com/prathamg007/CAST-ASD).

```bash
git clone https://github.com/prathamg007/CAST-ASD.git
cd CAST-ASD
pip install -e ".[mimi]"
hf download prathamg007/CAST-ASD --include "weights/*" --local-dir .
python train.py --config configs/msdwild/cast.yaml --test --checkpoint weights/msdwild_cast.ckpt
```

Or fetch a single file from Python:

```python
from huggingface_hub import hf_hub_download

path = hf_hub_download("prathamg007/CAST-ASD", "weights/msdwild_cast.ckpt")
```

Data preparation for MSDWild and AVA-ActiveSpeaker is described in the code repository.

## License

MIT, the same as the code. The models were trained on AVA-ActiveSpeaker and MSDWild, so use them in line with those datasets' terms (MSDWild is distributed under its own license agreement).

## Citation

```bibtex
@misc{gupta2026castasd,
  title         = {{CAST-ASD}: Causal Attention over Speakers and Time for Online Active Speaker Detection},
  author        = {Gupta, Pratham and Qi, Haotian and Sandhan, Tushar and Skantze, Gabriel},
  year          = {2026},
  eprint        = {2610.14676},
  archivePrefix = {arXiv},
  primaryClass  = {cs.CV},
  doi           = {10.48550/arXiv.2610.14676},
  url           = {https://arxiv.org/abs/2610.14676}
}
```