DBS-BSRNN (DnR v2)
DBS-BSRNN separates a 44.1 kHz mono soundtrack into music, sound effects and speech. It is the BSRNN separator with Dynamic Band Splitting: the frequency boundaries of the 128 band tokens are predicted from each mixture instead of being fixed.
Code · Project page · Demo
| Music | Speech | SFX | Avg. | |
|---|---|---|---|---|
| SI-SDR (dB), DnR v2 test (973 tracks) | 6.48 | 15.01 | 5.73 | 9.07 |
4.7M parameters. The example uses the 3 s / 1.5 s overlap-add windows of the training recipe.
Usage
pip install git+https://github.com/JusperLee/Dynamic-Band-Splitting.git
import soundfile as sf
import torch
from dbs.engine import separate
from dbs.models import DBSBSRNN
model = DBSBSRNN.from_pretrained("JusperLee/DBS-BSRNN-DnR").eval()
audio, rate = sf.read("soundtrack.wav", dtype="float32", always_2d=True) # 44.1 kHz
mixture = torch.from_numpy(audio.mean(1)).view(1, 1, -1)
with torch.inference_mode():
music, sfx, speech = separate(model, mixture, {"mode": "chunked", "chunk_seconds": 3.0, "hop_seconds": 1.5}, sample_rate=44100)[0]
model(mixture, return_aux=True) also returns the predicted boundaries of each frequency region.
The outputs are in the order music, sfx, speech.
Training
Trained from scratch on the DnR v2 training set with
configs/dnr/dbs_bsrnn.yaml.
Citation
@misc{zhang2026dbs,
title = {Learning Where to Split: Dynamic Band Splitting for Audio Source Separation},
author = {Zhang, Bingzhe and Li, Kai and Hu, Xiaolin},
year = {2026}
}