Skip to main content

SepRQ

Université de Toulon · LIS · CNRS · ILLS · pyannoteAI

📄 Paper  ·  🌐 Website  ·  🤗 Hugging Face  ·  💻 GitHub

🗣️ This framework is intended to provide an easy, ready-to-use and strong SepRQ feature extractor for 🍸 cocktail-party 🍸 and multi-talker conversational scenarios 🔀 👥, while also facilitating the use of other feature extractors from the literature. We also release a BEST-RQ model trained at 50 Hz as a valuable contribution to the community.

SepRQ features are pulled from 🤗 SevKod/SepRQ; a call returns the 12 Conformer layer features usable for training or cocktail-party representation analysis. Requires PyTorch and upstream speechbrain>=1.0.3; runs on CPU or GPU.


👉 Please visit https://sevkod.github.io/SepRQ/ for the full usage and demo.


Install

pip install seprq

Usage (frozen ❄️ or fine-tuned 🔥)

from seprq import SepRQEncoder

wav = "hf.co/SepRQ/SepRQ/blob/main/ex/mix.wav"
# wav = torchaudio.load("path/to/audio.wav")

# "SepRQ" — see "Available models" for every name
encoder = SepRQEncoder("SepRQ", streams=2)

# ❄️ frozen feature extraction
encoder.requires_grad_(False).eval()  # or True for 🔥 fine-tuning

features = encoder(wav)

It accepts a file path (any format/rate — decoded, mono, resampled to 16 kHz) or a waveform tensor [num_samples], [batch, num_samples] or [batch, channel, num_samples].

The released SepRQ encoder is the 2-speaker model (streams=2).

Available models

name layers dim
⭐ SepRQ ⭐ 12 576
BestRQ_50Hz 12 576
HuBERT_BASE 12 768
WavLM_BASE 12 768
WavLM_BASE_PLUS 12 768
WavLM_LARGE 24 1024

The SepRQ / BEST-RQ weights come from the Hub (private — authenticate once with huggingface-cli login or HF_TOKEN); the HuBERT / WavLM baselines are fetched from the torchaudio pipelines, nothing extra to host.

Run a task

SUPERB separation, diarization, and enhancement, plus target-speaker extraction, personalized speech extraction, personalized VAD, target-speaker ASR, DIHARD 3 diarization (local segmentation), and WSJ0-2mix / WSJ0-3mix separation. The head is chosen from the upstream. Published for HuBERT_BASE, WavLM_BASE, and WavLM_BASE_PLUS. SepRQ downstream heads are not on the public Hub yet. Target-speaker tasks take an enrollment utterance.

from seprq import SepRQPipeline

# Separation
pipe = SepRQPipeline("separation", upstream="SepRQ", streams=2)

# Input mixture - [num_samples]
mixture = "hf.co/SepRQ/SepRQ/blob/main/ex/SS/mix1.wav"

save_to = "./output"

sources = pipe(mixture, save_to=save_to)
# [num_speakers, num_samples]

# ./output/source1.wav
# ./output/source2.wav

# Diarization
pipe = SepRQPipeline("diarization", upstream="SepRQ", streams=2)

# Input mixture - [num_samples]
mixture = "hf.co/SepRQ/SepRQ/blob/main/ex/SD/mix1.wav"

save_to = "./output"

activations = pipe(mixture, save_to=save_to)
# [time, num_speakers]

# ./output/activations.rttm

# Enhancement
pipe = SepRQPipeline("enhancement", upstream="SepRQ", streams=2)

# Input mixture - [num_samples]
mixture = "hf.co/SepRQ/SepRQ/blob/main/ex/SE/mix1.wav"

save_to = "./output"

clean = pipe(mixture, save_to=save_to)
# [num_samples]

# ./output/cleaned.wav

# Target speaker extraction
pipe = SepRQPipeline("target-speaker-extraction",
                     upstream="SepRQ",
                     streams=2)

# Input mixture - [num_samples]
mixture = "hf.co/SepRQ/SepRQ/blob/main/ex/TSE/mix1.wav"
enrollment = "hf.co/SepRQ/SepRQ/blob/main/ex/TSE/enroll1.wav"

save_to = "./output"

target = pipe(mixture, enrollment=enrollment, save_to=save_to)
# [num_samples]

# ./output/extracted_audio.wav

# Personalized speech extraction
pipe = SepRQPipeline("personalized-extraction",
                     upstream="SepRQ",
                     streams=2)

# Input mixture - [num_samples]
mixture = "hf.co/SepRQ/SepRQ/blob/main/ex/PSE/mix1.wav"
enrollment = "hf.co/SepRQ/SepRQ/blob/main/ex/PSE/enroll1.wav"

save_to = "./output"

target = pipe(mixture, enrollment=enrollment, save_to=save_to)
# [num_samples]

# ./output/extracted_audio.wav

# Personalized VAD
pipe = SepRQPipeline("personalized-vad", upstream="SepRQ", streams=2)

# Input mixture - [num_samples]
mixture = "hf.co/SepRQ/SepRQ/blob/main/ex/PVAD/mix1.wav"
enrollment = "hf.co/SepRQ/SepRQ/blob/main/ex/PVAD/enroll1.wav"

save_to = "./output"

activations = pipe(mixture, enrollment=enrollment, save_to=save_to)
# [time]

# ./output/activations.rttm

# Target-speaker ASR
pipe = SepRQPipeline("target-speaker-asr",
                     upstream="SepRQ",
                     streams=2)

# Input mixture - [num_samples]
mixture = "hf.co/SepRQ/SepRQ/blob/main/ex/TS-ASR/mix1.wav"
enrollment = "hf.co/SepRQ/SepRQ/blob/main/ex/TS-ASR/enroll1.wav"

save_to = "./output"

text = pipe(mixture, enrollment=enrollment, save_to=save_to)

# ./output/extracted_transcript.txt

# DIHARD 3 diarization
pipe = SepRQPipeline("diarization-dihard3",
                     upstream="SepRQ",
                     streams=2)

# Input mixture - [num_samples]
mixture = "hf.co/SepRQ/SepRQ/blob/main/ex/DH3/mix1.wav"

save_to = "./output"

activations = pipe(mixture, save_to=save_to)
# [time, num_speakers]

# ./output/activations.rttm
# Local segmentation only (EEND).
# Not intended for long file recordings without clustering.

# WSJ0-2mix separation
pipe = SepRQPipeline("separation-wsj0-2mix",
                     upstream="SepRQ",
                     streams=2)

# Input mixture - [num_samples]
mixture = "hf.co/SepRQ/SepRQ/blob/main/ex/WSJ2/mix1.wav"

save_to = "./output"

sources = pipe(mixture, save_to=save_to)
# [num_speakers, num_samples]

# ./output/source1.wav
# ./output/source2.wav

# WSJ0-3mix separation
pipe = SepRQPipeline("separation-wsj0-3mix",
                     upstream="SepRQ",
                     streams=3)

# Input mixture - [num_samples]
mixture = "hf.co/SepRQ/SepRQ/blob/main/ex/WSJ3/mix1.wav"

save_to = "./output"

sources = pipe(mixture, save_to=save_to)
# [num_speakers, num_samples]

# ./output/source1.wav
# ./output/source2.wav
# ./output/source3.wav

🔀 SepRQ — separation as the pretext task

SepRQ swaps masked prediction for pseudo source separation. It predicts one stream of discrete units per speaker in the mixture, at several temporal resolutions.

SepRQ architecture

Fig. 1. SepRQ performs pseudo source separation in the discrete space. Random vector quantizers (RVQs) give speaker-specific discrete labels at several resolutions.

  • Pseudo source separation — each separation head predicts the frozen BEST-RQ codewords of one clean speaker from the mixture. Utterance-level PIT resolves speaker order.
  • Mask-free — masking can hide exactly the content needed to disentangle a mixture. SepRQ predicts units over the full utterance, which uses every frame for training.
  • Multi-resolution — a separation objective follows every two Conformer layers, with frame folding going from 20 ms to 320 ms and one codebook per scale.

👥 Results

Frozen upstreams with SUPERB / TS-SUPERB downstream heads.

Multi-speaker SUPERB

Speaker diarization (SD), speech separation (SS) and speech enhancement (SE). LS = LibriSpeech, LL = Libri-Light, Mix = LL-60k + GigaSpeech-10k + VoxPopuli-24k.

Model Class #Param (M) Data (h) SD SS SE
DER ↓ SI-SDRi ↑ PESQ ↑ STOI ↑
Generic SSLs
HuBERT BaseBase94.68LS-9605.889.362.5893.9
WavLM BaseBase94.70LS-9604.5510.372.5894.0
WavLM Base+Base94.70Mix-94k3.5010.852.6394.3
HuBERT LargeLarge316.62LL-60k5.7510.452.6494.2
WavLM LargeLarge316.62Mix-94k3.2411.192.7094.5
Cocktail-party SSLs
C-HuBERT BaseBase96.00LS-9602.7711.082.6394.0
C-HuBERT LargeLarge318.00LL-60k2.6511.242.6594.3
⭐ SepRQ ⭐Base85.68LS-9602.0812.102.6794.4

TS-SUPERB

Target speaker extraction (TSE), personalized speech extraction (PSE), personalized VAD (PVAD), target-speaker ASR (TS-ASR).

Upstream #Param (M) TSE PSE PVAD
mAP ↑
TS-ASR
SI-SDRi ↑ STOI ↑ SI-SDRi ↑ STOI ↑ WER ↓
(w/o LM) (w/ LM)
HuBERT Base94.689.6487.308.6179.9294.6036.8630.52
WavLM Base94.7010.2688.409.6581.5794.4027.8222.68
WavLM Base+94.7010.6989.0010.0182.6795.0024.7520.06
⭐ SepRQ ⭐85.6812.5391.4511.1885.6096.6122.2616.78

Out-of-domain

EEND diarization on DIHARD 3 and ConvTasNet separation on WSJ0-2/3mix.

Upstream Diarization Separation
DIHARD 3 WSJ0-2mix WSJ0-3mix
FA / MD / SC ↓ DER ↓ SDRi ↑ SDRi ↑
w/o SSL features6.1 / 8.1 / 4.919.316.413.1
HuBERT Base4.3 / 8.6 / 4.717.717.012.7
WavLM Base4.4 / 8.3 / 4.517.317.513.2
WavLM Base+4.8 / 7.6 / 4.216.618.213.4
⭐ SepRQ (2 src) ⭐4.9 / 7.4 / 3.816.119.814.5
⭐ SepRQ (3 src) ⭐5.0 / 7.3 / 4.116.419.417.2

Citation

If SepRQ helps your research, please cite the paper: arXiv:2610.04690.

@misc{baroudi2026seprqselfsupervisedspeech,
  title         = {SepRQ : Self-Supervised Speech Mixture Representation Learning
                   via Mask-Free, Multi-Scale Source Separation},
  author        = {Séverin Baroudi and Hervé Bredin and Ricard Marxer},
  year          = {2026},
  eprint        = {2610.04690},
  archivePrefix = {arXiv},
  primaryClass  = {eess.AS},
  url           = {https://arxiv.org/abs/2610.04690}
}

Metadata

Release files for seprq 0.4.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for seprq 0.4.8
File Size Uploaded
seprq-0.4.8.tar.gz 21.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for seprq 0.4.8
File Interpreter ABI Platform
seprq-0.4.8-py3-none-any.whl Python 3 none any Details

Total release size: 41.7 kB

Release files / seprq-0.4.8.tar.gz

Download URL seprq-0.4.8.tar.gz
Size 21.8 kB
Tags Source
SHA-256 checksum
How to use checksums
025c3cf932653c91795e9ca7ef429eda66da989415417027f9753aeda0abb932
BLAKE2b-256 checksum
How to use checksums
8f82a1ae37b071001feab7174b013720df6d4b1181695bb89e8ec0ae767ece85
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / seprq-0.4.8-py3-none-any.whl

Download URL seprq-0.4.8-py3-none-any.whl
Size 19.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b22dba46925cffca008cb47caa9cadded73a6466c74eab19ddb07f7d244eb6cf
BLAKE2b-256 checksum
How to use checksums
9eb8cdcc44320ab17e9224903ecccdbc630e05bf4ce0dd69dee58a1fae4358bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.4.8 This release

2 release files

0.4.7

2 release files

0.4.6

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.1.3

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page