DAVE: audio-visual speech enhancement & target speaker extraction for real-world meetings — audio-only TIGER-M backbone (2.56M) + four-cue speaker attribution. ISCSLP 2026 AVSE Challenge: Track1 4th, Track2 3rd.
Python
7
12 commits
updated Aug 12, 2026
Official implementation of DAVE, our system for the ISCSLP 2026 Real-World AVSE Challenge — audio-visual speech enhancement and target speaker extraction on real-world meeting recordings. DAVE decouples audio reconstruction from visual speaker attribution: an audio-only separation backbone (TIGER-M, 2.56M) reconstructs two anonymous speech streams; a four-cue weighted-fusion module assigns speaker identities from face video; a selective enhancement chain (scene routing → GAN denoising → loudness normalization) finalizes output.
model/real_avse_tiger_m.ckpt, 2.56M parameters, md5 15800af8) · mirrored on Hugging FaceHighlights
pip install torch numpy soundfile, nothing else to download.index.html plays every
mixture/separation pair in the browser (serve it with GitHub Pages or any static
server; also mirrored on Hugging Face).Track 1 — 4th of 17 teams (top 5 shown):
| Rank | Team | SI-SDR↑ | PESQ↑ | STOI↑ | UTMOS↑ | DNSMOS-OVRL↑ | CER↓ | Spk-Sim↑ |
|---|---|---|---|---|---|---|---|---|
| 1 | audioman | 10.699 | 2.933 | 0.841 | 2.074 | 1.832 | 0.123 | 0.749 |
| 2 | AITD | 12.716 | 3.000 | 0.852 | 2.100 | 1.697 | 0.145 | 0.769 |
| 3 | twilight | 9.162 | 2.775 | 0.825 | 2.145 | 1.944 | 0.135 | 0.742 |
| 4 | DAVE (ours) | 10.232 | 2.717 | 0.817 | 2.765 | 2.022 | 0.171 | 0.726 |
| 5 | SUSTechAILab | 10.416 | 2.651 | 0.823 | 1.998 | 1.770 | 0.164 | 0.737 |
Track 2 — 3rd of 13 teams (top 5 shown):
| Rank | Team | SI-SDR↑ | PESQ↑ | STOI↑ | UTMOS↑ | DNSMOS-OVRL↑ | CER↓ | Spk-Sim↑ |
|---|---|---|---|---|---|---|---|---|
| 1 | AITD | 12.255 | 2.939 | 0.844 | 2.129 | 1.670 | 0.153 | 0.764 |
| 2 | audioman | 10.223 | 2.888 | 0.830 | 2.094 | 1.760 | 0.148 | 0.744 |
| 3 | DAVE (ours) | 8.933 | 2.615 | 0.788 | 2.766 | 2.012 | 0.220 | 0.707 |
| 4 | twilight | 7.047 | 2.561 | 0.776 | 2.170 | 1.896 | 0.220 | 0.712 |
| 5 | SUSTechAILab | 9.541 | 2.554 | 0.804 | 2.019 | 1.733 | 0.211 | 0.726 |

Mixed audio is separated by the audio-only TIGER-M backbone into two anonymous streams. In parallel, four cues extracted against the face tracks — voiceprint (×3.0), StableSyncNet (×1.5), SyncNet (×1.0), lip keypoints (×0.7) — are normalized and fused into one identity vote per scene. A selective enhancement chain (scene routing → MossFormerGAN denoising → loudness normalization) finalizes the no-reference partition.
DAVE/
├── inference.py # Self-contained separation CLI (torch only) — runnable
├── index.html # Listening page for the 20 sample pairs (GitHub Pages ready)
├── run_train.sh # Training launcher (final-stage configuration + curriculum notes)
├── src/
│ ├── models/ # Bundled TIGER-M backbone + WeSpeaker ResNet34 extractor
│ ├── train.py # Six-loss DDP trainer (model/PIT/speaker modules bundled)
│ └── synth/ # Training-data pipeline (mixtures + transcripts)
│ ├── synthesize.py # RIR-based two-speaker mixture synthesis
│ ├── synthesize_misp.py # real-acoustic mixtures from far-field MISP segments
│ ├── synthesize_pure.py # direct-sum mixtures with exact-zero residual
│ └── transcribe.py # Fun-ASR-Nano transcript labeling (CER-loss targets)
├── reference/ # Reference code (depends on challenge intermediates; not standalone)
│ ├── attribution/ # four-cue weighted-fusion speaker attribution
│ ├── enhance/ # scene routing + MossFormerGAN + loudness norm
│ └── evaluation/ # seven-metric evaluation (evaluation-aligned engines)
├── model/real_avse_tiger_m.ckpt # TIGER-M weights (2.56M)
├── samples/ # 20 playable example pairs (mix/s1/s2, EchoSet, Apache-2.0)
├── assets/ # Framework figure
├── configs/paths.example.yaml
├── manifests/ # Synthesis recipe manifests (no copyrighted audio)
├── requirements.txt · DATA_LICENSE.md · LICENSE · NOTICE
Runnable out of the box: inference.py (+ src/models/). Runnable after
preparing data and assets (synthesized corpus, WeSpeaker checkpoint, Fun-ASR teacher —
see DATA_LICENSE.md): src/synth/ and src/train.py via
run_train.sh; no external separation repository is required. Reference only
(depend on challenge intermediates): everything under reference/.
Separation is self-contained — the TIGER-M model is bundled under src/models/,
so only torch, numpy, soundfile are needed (no external repo to clone):
pip install torch numpy soundfile
# Separate one mixture (or a directory of mixtures) into two streams:
python inference.py --mixture samples/echoset_01/mix.wav --out output
python inference.py --mixture path/to/dir --out output --device cuda
Output: output/<name>/s1.wav, s2.wav (16 kHz mono). The backbone is audio-only;
speaker attribution (from video) and the enhancement chain are separate stages under
reference/attribution/ and reference/enhance/.
Tested with Python 3.11 and PyTorch 2.x; inference runs on CPU or a single GPU.
20 example pairs live under samples/. GitHub itself does not play audio inline, so a
ready-made listening page is included: index.html plays every
mixture/separation pair in the browser.
main, root) and the
page is served at https://<org>.github.io/DAVE/;python -m http.server in the repo root, then open
http://localhost:8000/;A full training pair additionally carries s1.txt / s2.txt (Fun-ASR-Nano
transcriptions used by the CER loss).
bash run_train.sh — the final-stage configuration (native torch DDP, 7×A800, per-GPU
batch 1); the curriculum stages are documented inside the script. The separation
backbone, the PIT loss, and the WeSpeaker speaker extractor are bundled under
src/models/, so no external separation repository is needed. External requirements:
the synthesized corpus (src/synth/), the WeSpeaker cnceleb-resnet34-LM checkpoint
(SPK_CKPT), and the Fun-ASR-Nano teacher (auto-downloaded, or set ASR_MODEL to a
local directory). Data-list paths inside src/train.py are placeholders
(/path/to/...); configure them for your environment. Weights resume from
RESUME_CKPT; save interval via SAVE_EVERY.
A six-term loss, introduced as a curriculum (one term at a time, verified for no-regression before its weight is raised):
L = LSI-SDR + λcer·LCER + λspk·Lspk + λutmos·LUTMOS + λstoi·LSTOI + λpesq·LPESQ
| Term | Weight (final) | Signal | Notes |
|---|---|---|---|
| SI-SDR (scale-invariant) | 1.0 | separation fidelity | PIT negative SI-SDR, aligned with the official evaluation |
| CER | 3.0 | recognition | frozen Fun-ASR-Nano teacher, teacher-forced CE |
| Speaker | 5.0 | voice fidelity | 1 − cos, WeSpeaker ResNet34 (frozen) |
| UTMOS | 1.0 | naturalness | differentiable critic replicating the official UTMOS predictor, clamped |
| STOI | 5.0 | intelligibility | differentiable; Pearson correlation 1.00 with the official metric |
| PESQ | 1.0 | perceptual quality | differentiable P.862; correlation 0.92 with the official metric |
Weights above are the final (rebalanced) configuration; earlier curriculum stages use smaller weights. Perceptual losses apply only to clean-reference samples.
reference/evaluation/ reproduces our seven-metric development-set measurement in two
stages: bare_sep.py separates a fixed 200-scene sample with each checkpoint, and
bare_judge.py scores the outputs with evaluation-aligned engines (SI-SDR / PESQ /
STOI via torchmetrics; UTMOS / DNSMOS / ASR-CER / speaker cosine via the challenge
Baseline's metric tracker). Both scripts depend on the challenge Baseline and the
development data — see reference/README.md.
The separation model is trained on synthetic two-speaker mixtures (each pair = five
files: mix.wav, s1.wav, s2.wav, s1.txt, s2.txt, 16 kHz mono).
The training pool combines four subsets, three of which are reproducible with the
scripts under src/synth/: RIR-simulated mixtures (synthesize.py), real-acoustic
mixtures built from far-field MISP segments (synthesize_misp.py), and direct-sum
mixtures with exact-zero residual (synthesize_pure.py). The fourth subset (a protocol
anchor built from official challenge dev data) is intentionally not included; the
pipeline runs without it. Transcripts for the CER loss are produced by transcribe.py
(Fun-ASR-Nano) over the synthesized pair directories.
DAVE-Corpus (open subset) — 12,000 clean-provenance pairs — is released on
Hugging Face (CC BY-SA 4.0):
8,000 RIR-simulated + 4,000 direct-sum pairs built exclusively from AliMeeting /
AISHELL-4 speech and MUSAN noise with the pipeline in src/synth/.
The remaining subsets of the paper's training pool are not redistributable — they
draw on MISP (non-commercial agreement) and official challenge dev data
(challenge terms). For those, this repository releases the synthesis scripts, the
per-pair manifests, and 20 example pairs (samples/, Apache-2.0 EchoSet subset);
rebuild them by downloading the source corpora under their own licenses and running the
synthesis. Full per-source license table and download guide:
DATA_LICENSE.md.
num_sources=2 is fixed);
inference.py rejects other sample rates.inference.py outputs two anonymous streams — the s1/s2 order is
arbitrary. Assigning streams to on-screen speakers requires face video and the
attribution stage (reference/attribution/).| Cue | Model | Reference |
|---|---|---|
| Voiceprint (×3.0) | WeSpeaker ResNet34 (CN-Celeb) | Wang et al., ICASSP 2023 |
| Audio-visual match (×1.5) | StableSyncNet (LatentSync) | Li et al., arXiv:2412.09262, 2024 |
| Lip-sync (×1.0) | SyncNet | Chung & Zisserman, ACCV 2016 Workshops |
| Lip keypoints (×0.7) | FAN landmarks | Bulat & Tzimiropoulos, ICCV 2017 |
@misc{zhou2026dave,
title = {{DAVE}: A Decoupled Audio-Visual Enhancement Framework for Real-World Speech Separation},
author = {Zhou, Wei and Ning, Wanyi and Guo, Yinshang and Fang, Qianxiao and Qian, Haitao and Li, Yingpeng},
year = {2026},
eprint = {2608.09288},
archivePrefix = {arXiv},
primaryClass = {cs.SD}
}
Built on TIGER and the challenge baseline. Source-data attribution in DATA_LICENSE.md. Code and weights are Apache-2.0.
Questions and issues are welcome via GitHub Issues;
for other inquiries contact [email protected].
DAVE: audio-visual speech enhancement & target speaker extraction for real-world meetings — audio-only TIGER-M backbone (2.56M) + four-cue speaker attribution. ISCSLP 2026 AVSE Challenge: Track1 4th, Track2 3rd.
Python
7
12 commits
updated Aug 12, 2026
Official implementation of DAVE, our system for the ISCSLP 2026 Real-World AVSE Challenge — audio-visual speech enhancement and target speaker extraction on real-world meeting recordings. DAVE decouples audio reconstruction from visual speaker attribution: an audio-only separation backbone (TIGER-M, 2.56M) reconstructs two anonymous speech streams; a four-cue weighted-fusion module assigns speaker identities from face video; a selective enhancement chain (scene routing → GAN denoising → loudness normalization) finalizes output.
model/real_avse_tiger_m.ckpt, 2.56M parameters, md5 15800af8) · mirrored on Hugging FaceHighlights
pip install torch numpy soundfile, nothing else to download.index.html plays every
mixture/separation pair in the browser (serve it with GitHub Pages or any static
server; also mirrored on Hugging Face).Track 1 — 4th of 17 teams (top 5 shown):
| Rank | Team | SI-SDR↑ | PESQ↑ | STOI↑ | UTMOS↑ | DNSMOS-OVRL↑ | CER↓ | Spk-Sim↑ |
|---|---|---|---|---|---|---|---|---|
| 1 | audioman | 10.699 | 2.933 | 0.841 | 2.074 | 1.832 | 0.123 | 0.749 |
| 2 | AITD | 12.716 | 3.000 | 0.852 | 2.100 | 1.697 | 0.145 | 0.769 |
| 3 | twilight | 9.162 | 2.775 | 0.825 | 2.145 | 1.944 | 0.135 | 0.742 |
| 4 | DAVE (ours) | 10.232 | 2.717 | 0.817 | 2.765 | 2.022 | 0.171 | 0.726 |
| 5 | SUSTechAILab | 10.416 | 2.651 | 0.823 | 1.998 | 1.770 | 0.164 | 0.737 |
Track 2 — 3rd of 13 teams (top 5 shown):
| Rank | Team | SI-SDR↑ | PESQ↑ | STOI↑ | UTMOS↑ | DNSMOS-OVRL↑ | CER↓ | Spk-Sim↑ |
|---|---|---|---|---|---|---|---|---|
| 1 | AITD | 12.255 | 2.939 | 0.844 | 2.129 | 1.670 | 0.153 | 0.764 |
| 2 | audioman | 10.223 | 2.888 | 0.830 | 2.094 | 1.760 | 0.148 | 0.744 |
| 3 | DAVE (ours) | 8.933 | 2.615 | 0.788 | 2.766 | 2.012 | 0.220 | 0.707 |
| 4 | twilight | 7.047 | 2.561 | 0.776 | 2.170 | 1.896 | 0.220 | 0.712 |
| 5 | SUSTechAILab | 9.541 | 2.554 | 0.804 | 2.019 | 1.733 | 0.211 | 0.726 |

Mixed audio is separated by the audio-only TIGER-M backbone into two anonymous streams. In parallel, four cues extracted against the face tracks — voiceprint (×3.0), StableSyncNet (×1.5), SyncNet (×1.0), lip keypoints (×0.7) — are normalized and fused into one identity vote per scene. A selective enhancement chain (scene routing → MossFormerGAN denoising → loudness normalization) finalizes the no-reference partition.
DAVE/
├── inference.py # Self-contained separation CLI (torch only) — runnable
├── index.html # Listening page for the 20 sample pairs (GitHub Pages ready)
├── run_train.sh # Training launcher (final-stage configuration + curriculum notes)
├── src/
│ ├── models/ # Bundled TIGER-M backbone + WeSpeaker ResNet34 extractor
│ ├── train.py # Six-loss DDP trainer (model/PIT/speaker modules bundled)
│ └── synth/ # Training-data pipeline (mixtures + transcripts)
│ ├── synthesize.py # RIR-based two-speaker mixture synthesis
│ ├── synthesize_misp.py # real-acoustic mixtures from far-field MISP segments
│ ├── synthesize_pure.py # direct-sum mixtures with exact-zero residual
│ └── transcribe.py # Fun-ASR-Nano transcript labeling (CER-loss targets)
├── reference/ # Reference code (depends on challenge intermediates; not standalone)
│ ├── attribution/ # four-cue weighted-fusion speaker attribution
│ ├── enhance/ # scene routing + MossFormerGAN + loudness norm
│ └── evaluation/ # seven-metric evaluation (evaluation-aligned engines)
├── model/real_avse_tiger_m.ckpt # TIGER-M weights (2.56M)
├── samples/ # 20 playable example pairs (mix/s1/s2, EchoSet, Apache-2.0)
├── assets/ # Framework figure
├── configs/paths.example.yaml
├── manifests/ # Synthesis recipe manifests (no copyrighted audio)
├── requirements.txt · DATA_LICENSE.md · LICENSE · NOTICE
Runnable out of the box: inference.py (+ src/models/). Runnable after
preparing data and assets (synthesized corpus, WeSpeaker checkpoint, Fun-ASR teacher —
see DATA_LICENSE.md): src/synth/ and src/train.py via
run_train.sh; no external separation repository is required. Reference only
(depend on challenge intermediates): everything under reference/.
Separation is self-contained — the TIGER-M model is bundled under src/models/,
so only torch, numpy, soundfile are needed (no external repo to clone):
pip install torch numpy soundfile
# Separate one mixture (or a directory of mixtures) into two streams:
python inference.py --mixture samples/echoset_01/mix.wav --out output
python inference.py --mixture path/to/dir --out output --device cuda
Output: output/<name>/s1.wav, s2.wav (16 kHz mono). The backbone is audio-only;
speaker attribution (from video) and the enhancement chain are separate stages under
reference/attribution/ and reference/enhance/.
Tested with Python 3.11 and PyTorch 2.x; inference runs on CPU or a single GPU.
20 example pairs live under samples/. GitHub itself does not play audio inline, so a
ready-made listening page is included: index.html plays every
mixture/separation pair in the browser.
main, root) and the
page is served at https://<org>.github.io/DAVE/;python -m http.server in the repo root, then open
http://localhost:8000/;A full training pair additionally carries s1.txt / s2.txt (Fun-ASR-Nano
transcriptions used by the CER loss).
bash run_train.sh — the final-stage configuration (native torch DDP, 7×A800, per-GPU
batch 1); the curriculum stages are documented inside the script. The separation
backbone, the PIT loss, and the WeSpeaker speaker extractor are bundled under
src/models/, so no external separation repository is needed. External requirements:
the synthesized corpus (src/synth/), the WeSpeaker cnceleb-resnet34-LM checkpoint
(SPK_CKPT), and the Fun-ASR-Nano teacher (auto-downloaded, or set ASR_MODEL to a
local directory). Data-list paths inside src/train.py are placeholders
(/path/to/...); configure them for your environment. Weights resume from
RESUME_CKPT; save interval via SAVE_EVERY.
A six-term loss, introduced as a curriculum (one term at a time, verified for no-regression before its weight is raised):
L = LSI-SDR + λcer·LCER + λspk·Lspk + λutmos·LUTMOS + λstoi·LSTOI + λpesq·LPESQ
| Term | Weight (final) | Signal | Notes |
|---|---|---|---|
| SI-SDR (scale-invariant) | 1.0 | separation fidelity | PIT negative SI-SDR, aligned with the official evaluation |
| CER | 3.0 | recognition | frozen Fun-ASR-Nano teacher, teacher-forced CE |
| Speaker | 5.0 | voice fidelity | 1 − cos, WeSpeaker ResNet34 (frozen) |
| UTMOS | 1.0 | naturalness | differentiable critic replicating the official UTMOS predictor, clamped |
| STOI | 5.0 | intelligibility | differentiable; Pearson correlation 1.00 with the official metric |
| PESQ | 1.0 | perceptual quality | differentiable P.862; correlation 0.92 with the official metric |
Weights above are the final (rebalanced) configuration; earlier curriculum stages use smaller weights. Perceptual losses apply only to clean-reference samples.
reference/evaluation/ reproduces our seven-metric development-set measurement in two
stages: bare_sep.py separates a fixed 200-scene sample with each checkpoint, and
bare_judge.py scores the outputs with evaluation-aligned engines (SI-SDR / PESQ /
STOI via torchmetrics; UTMOS / DNSMOS / ASR-CER / speaker cosine via the challenge
Baseline's metric tracker). Both scripts depend on the challenge Baseline and the
development data — see reference/README.md.
The separation model is trained on synthetic two-speaker mixtures (each pair = five
files: mix.wav, s1.wav, s2.wav, s1.txt, s2.txt, 16 kHz mono).
The training pool combines four subsets, three of which are reproducible with the
scripts under src/synth/: RIR-simulated mixtures (synthesize.py), real-acoustic
mixtures built from far-field MISP segments (synthesize_misp.py), and direct-sum
mixtures with exact-zero residual (synthesize_pure.py). The fourth subset (a protocol
anchor built from official challenge dev data) is intentionally not included; the
pipeline runs without it. Transcripts for the CER loss are produced by transcribe.py
(Fun-ASR-Nano) over the synthesized pair directories.
DAVE-Corpus (open subset) — 12,000 clean-provenance pairs — is released on
Hugging Face (CC BY-SA 4.0):
8,000 RIR-simulated + 4,000 direct-sum pairs built exclusively from AliMeeting /
AISHELL-4 speech and MUSAN noise with the pipeline in src/synth/.
The remaining subsets of the paper's training pool are not redistributable — they
draw on MISP (non-commercial agreement) and official challenge dev data
(challenge terms). For those, this repository releases the synthesis scripts, the
per-pair manifests, and 20 example pairs (samples/, Apache-2.0 EchoSet subset);
rebuild them by downloading the source corpora under their own licenses and running the
synthesis. Full per-source license table and download guide:
DATA_LICENSE.md.
num_sources=2 is fixed);
inference.py rejects other sample rates.inference.py outputs two anonymous streams — the s1/s2 order is
arbitrary. Assigning streams to on-screen speakers requires face video and the
attribution stage (reference/attribution/).| Cue | Model | Reference |
|---|---|---|
| Voiceprint (×3.0) | WeSpeaker ResNet34 (CN-Celeb) | Wang et al., ICASSP 2023 |
| Audio-visual match (×1.5) | StableSyncNet (LatentSync) | Li et al., arXiv:2412.09262, 2024 |
| Lip-sync (×1.0) | SyncNet | Chung & Zisserman, ACCV 2016 Workshops |
| Lip keypoints (×0.7) | FAN landmarks | Bulat & Tzimiropoulos, ICCV 2017 |
@misc{zhou2026dave,
title = {{DAVE}: A Decoupled Audio-Visual Enhancement Framework for Real-World Speech Separation},
author = {Zhou, Wei and Ning, Wanyi and Guo, Yinshang and Fang, Qianxiao and Qian, Haitao and Li, Yingpeng},
year = {2026},
eprint = {2608.09288},
archivePrefix = {arXiv},
primaryClass = {cs.SD}
}
Built on TIGER and the challenge baseline. Source-data attribution in DATA_LICENSE.md. Code and weights are Apache-2.0.
Questions and issues are welcome via GitHub Issues;
for other inquiries contact [email protected].