Add non-intrusive DS reference implementation: code, data, checkpoints, recipe
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +2 -34
- .gitignore +4 -0
- DATA_LICENSES.md +35 -0
- LICENSE +26 -0
- README.md +178 -1
- ckpt/ds4bsrnn_wide.pt +3 -0
- ckpt/ds_subband_v5.pt +3 -0
- ckpt/ds_subband_wide.pt +3 -0
- ckpt/se_bsrnn.pt +3 -0
- data/clean/dev-clean/1272/141231/1272_141231_000019_000000.normalized.txt +1 -0
- data/clean/dev-clean/1272/141231/1272_141231_000019_000000.wav +3 -0
- data/clean/dev-clean/1272/141231/1272_141231_000024_000005.normalized.txt +1 -0
- data/clean/dev-clean/1272/141231/1272_141231_000024_000005.wav +3 -0
- data/clean/dev-clean/1272/141231/1272_141231_000026_000007.normalized.txt +1 -0
- data/clean/dev-clean/1272/141231/1272_141231_000026_000007.wav +3 -0
- data/clean/dev-clean/1272/141231/1272_141231_000027_000007.normalized.txt +1 -0
- data/clean/dev-clean/1272/141231/1272_141231_000027_000007.wav +3 -0
- data/clean/dev-clean/1272/141231/1272_141231_000031_000000.normalized.txt +1 -0
- data/clean/dev-clean/1272/141231/1272_141231_000031_000000.wav +3 -0
- data/clean/dev-clean/1462/170138/1462_170138_000006_000001.normalized.txt +1 -0
- data/clean/dev-clean/1462/170138/1462_170138_000006_000001.wav +3 -0
- data/clean/dev-clean/1462/170138/1462_170138_000015_000006.normalized.txt +1 -0
- data/clean/dev-clean/1462/170138/1462_170138_000015_000006.wav +3 -0
- data/clean/dev-clean/1462/170138/1462_170138_000022_000014.normalized.txt +1 -0
- data/clean/dev-clean/1462/170138/1462_170138_000022_000014.wav +3 -0
- data/clean/dev-clean/1462/170142/1462_170142_000031_000001.normalized.txt +1 -0
- data/clean/dev-clean/1462/170142/1462_170142_000031_000001.wav +3 -0
- data/clean/dev-clean/1462/170142/1462_170142_000039_000000.normalized.txt +1 -0
- data/clean/dev-clean/1462/170142/1462_170142_000039_000000.wav +3 -0
- data/clean/dev-clean/1462/170142/1462_170142_000043_000001.normalized.txt +1 -0
- data/clean/dev-clean/1462/170142/1462_170142_000043_000001.wav +3 -0
- data/clean/dev-clean/1462/170145/1462_170145_000007_000000.normalized.txt +1 -0
- data/clean/dev-clean/1462/170145/1462_170145_000007_000000.wav +3 -0
- data/clean/dev-clean/1462/170145/1462_170145_000008_000003.normalized.txt +1 -0
- data/clean/dev-clean/1462/170145/1462_170145_000008_000003.wav +3 -0
- data/clean/dev-clean/1462/170145/1462_170145_000009_000007.normalized.txt +1 -0
- data/clean/dev-clean/1462/170145/1462_170145_000009_000007.wav +3 -0
- data/clean/dev-clean/174/168635/174_168635_000027_000004.normalized.txt +1 -0
- data/clean/dev-clean/174/168635/174_168635_000027_000004.wav +3 -0
- data/clean/dev-clean/174/50561/174_50561_000023_000004.normalized.txt +1 -0
- data/clean/dev-clean/174/50561/174_50561_000023_000004.wav +3 -0
- data/clean/dev-clean/1919/142785/1919_142785_000047_000002.normalized.txt +1 -0
- data/clean/dev-clean/1919/142785/1919_142785_000047_000002.wav +3 -0
- data/clean/dev-clean/1919/142785/1919_142785_000120_000000.normalized.txt +1 -0
- data/clean/dev-clean/1919/142785/1919_142785_000120_000000.wav +3 -0
- data/clean/dev-clean/1919/142785/1919_142785_000123_000008.normalized.txt +1 -0
- data/clean/dev-clean/1919/142785/1919_142785_000123_000008.wav +3 -0
- data/clean/dev-clean/1988/147956/1988_147956_000002_000003.normalized.txt +1 -0
- data/clean/dev-clean/1988/147956/1988_147956_000002_000003.wav +3 -0
- data/clean/dev-clean/1988/147956/1988_147956_000003_000005.normalized.txt +1 -0
.gitattributes
CHANGED
|
@@ -1,35 +1,3 @@
|
|
| 1 |
-
*.
|
| 2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
-
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
-
*.
|
| 24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
-
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
| 1 |
+
*.wav filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.flac filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.gitignore
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
__pycache__/
|
| 2 |
+
*.pyc
|
| 3 |
+
logs/
|
| 4 |
+
.ipynb_checkpoints/
|
DATA_LICENSES.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Bundled data — sources and licenses
|
| 2 |
+
|
| 3 |
+
This repository bundles audio so the recipe is self-contained. Each dataset is
|
| 4 |
+
redistributed under its original license, reproduced/attributed below. Because
|
| 5 |
+
**ESC-50 is CC BY-NC**, the bundled artifact as a whole is for
|
| 6 |
+
**non-commercial / academic** use.
|
| 7 |
+
|
| 8 |
+
## Clean speech — LibriTTS (`data/clean/`)
|
| 9 |
+
|
| 10 |
+
- Subset of LibriTTS: `train-clean-100` (training), `dev-clean` (dev),
|
| 11 |
+
`test-clean` (test). Each `*.wav` ships with its `*.normalized.txt` transcript.
|
| 12 |
+
- Source: https://www.openslr.org/60/
|
| 13 |
+
- License: **CC BY 4.0**.
|
| 14 |
+
- Citation:
|
| 15 |
+
> H. Zen, V. Dang, R. Clark, Y. Zhang, R. J. Weiss, Y. Jia, Z. Chen, Y. Wu.
|
| 16 |
+
> "LibriTTS: A Corpus Derived from LibriSpeech for Text-to-Speech," Interspeech 2019.
|
| 17 |
+
|
| 18 |
+
## Noise — ESC-50 (`data/noise/`)
|
| 19 |
+
|
| 20 |
+
- Full ESC-50 (2000 clips, 5 folds). Folds 1–3 used for training noise, fold 4
|
| 21 |
+
for dev, fold 5 for test (disjoint). `meta/esc50.csv` retained.
|
| 22 |
+
- Source: https://github.com/karolpiczak/ESC-50
|
| 23 |
+
- License: **CC BY-NC 3.0** (non-commercial).
|
| 24 |
+
- Citation:
|
| 25 |
+
> K. J. Piczak. "ESC: Dataset for Environmental Sound Classification,"
|
| 26 |
+
> ACM Multimedia 2015.
|
| 27 |
+
|
| 28 |
+
## ASR model — Whisper (not bundled)
|
| 29 |
+
|
| 30 |
+
- `openai/whisper-base.en` is downloaded from the Hugging Face Hub at runtime
|
| 31 |
+
(not redistributed here). License: MIT (OpenAI Whisper).
|
| 32 |
+
|
| 33 |
+
## Code
|
| 34 |
+
|
| 35 |
+
- The source code in `ds4se/` and `scripts/` is MIT-licensed — see `LICENSE`.
|
LICENSE
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2026 the authors of this re-implementation
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
| 22 |
+
|
| 23 |
+
NOTE: This MIT license covers the source CODE in this repository only. The
|
| 24 |
+
bundled audio DATA under data/ is redistributed under separate licenses — see
|
| 25 |
+
DATA_LICENSES.md. In particular ESC-50 is CC BY-NC, so the repository as a whole
|
| 26 |
+
is intended for non-commercial / academic use.
|
README.md
CHANGED
|
@@ -1,3 +1,180 @@
|
|
| 1 |
---
|
| 2 |
-
license:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
license: cc-by-nc-4.0
|
| 3 |
+
language:
|
| 4 |
+
- en
|
| 5 |
+
library_name: pytorch
|
| 6 |
+
tags:
|
| 7 |
+
- speech-enhancement
|
| 8 |
+
- automatic-speech-recognition
|
| 9 |
+
- noise-robust-asr
|
| 10 |
+
- distortion-suppression
|
| 11 |
+
- bsrnn
|
| 12 |
+
- whisper
|
| 13 |
---
|
| 14 |
+
|
| 15 |
+
# Non-intrusive Distortion Suppression for Noise-Robust ASR (DS / DS4BSRNN)
|
| 16 |
+
|
| 17 |
+
Reference implementation and **self-contained open reproduction** of:
|
| 18 |
+
|
| 19 |
+
> Wei Wang, Siyi Zhao, Yanmin Qian.
|
| 20 |
+
> **Advancing Non-intrusive Suppression on Enhancement Distortion for Noise
|
| 21 |
+
> Robust ASR.** ICASSP 2025.
|
| 22 |
+
|
| 23 |
+
This repository provides the method's source code, pretrained checkpoints, **and
|
| 24 |
+
the audio data**, so the full training and evaluation pipeline runs
|
| 25 |
+
out-of-the-box. The paper's headline tables are measured on a private in-house
|
| 26 |
+
Mandarin corpus (Table I) and licensed CHiME-4 + DNS data (Table III), which
|
| 27 |
+
cannot be redistributed. This release therefore reproduces the **method and its
|
| 28 |
+
trends on fully public data** — LibriTTS (speech) + ESC-50 (noise) with a frozen
|
| 29 |
+
Whisper ASR — so every number here is directly runnable and verifiable. The
|
| 30 |
+
qualitative conclusions match the paper: SE enhancement degrades ASR, OA
|
| 31 |
+
recovers it, and the adaptive **DS / DS4BSRNN** beat the fixed-coefficient OA
|
| 32 |
+
baseline (the more variable the conditions, the larger the margin).
|
| 33 |
+
|
| 34 |
+
The only runtime download is the frozen Whisper ASR from the HF Hub (see
|
| 35 |
+
*Environment*).
|
| 36 |
+
|
| 37 |
+
---
|
| 38 |
+
|
| 39 |
+
## What is implemented
|
| 40 |
+
|
| 41 |
+
- **Decoupled DS module** (`ds4se/ds_module.py`, Fig. 1b + Algorithm 1):
|
| 42 |
+
band-splits the original `X` and enhanced `X̃` complex spectrograms, runs `L`
|
| 43 |
+
Time/Band-RNN groups, and a linear+sigmoid head emits per-(band, frame)
|
| 44 |
+
coefficients `S ∈ [0,1]`. Algorithm 1 interpolates `X̂ = S·X + (1−S)·X̃`.
|
| 45 |
+
- **Coupled DS4BSRNN** (`ds4se/ds4bsrnn.py`, Fig. 2): reuses the BSRNN SE's
|
| 46 |
+
internal hidden representation `H` instead of a separate band-split — fewer
|
| 47 |
+
parameters.
|
| 48 |
+
- **BSRNN SE backbone** (`ds4se/bsrnn.py`): self-contained, mirrors ESPnet's
|
| 49 |
+
`BSRNNSeparator`, exposes the hidden `H`.
|
| 50 |
+
- **Non-intrusive training** (`scripts/train_ds_real.py`): SE and ASR are
|
| 51 |
+
**frozen**; only the DS module is trained on the ASR (cross-entropy) loss; SE
|
| 52 |
+
gradients are detached. **Scheduled DS coefficients** (warmup bias freeze)
|
| 53 |
+
avoid the trivial `S→0` collapse.
|
| 54 |
+
- **Frozen Whisper ASR** (`ds4se/asr_whisper.py`): a differentiable log-mel
|
| 55 |
+
front-end wrapping `openai/whisper-base.en` for the ASR training loss and WER.
|
| 56 |
+
|
| 57 |
+
## Results
|
| 58 |
+
|
| 59 |
+
End-to-end pipeline: `noisy → frozen BSRNN SE → {OA | DS | DS4BSRNN} → frozen
|
| 60 |
+
Whisper → WER`. Data: LibriTTS (clean) + ESC-50 (noise), simulated at varying
|
| 61 |
+
SNR. **OA** (observation-adding) is the fixed-coefficient baseline `X̂ = s·X +
|
| 62 |
+
(1−s)·X̃`, with `s` tuned on dev and applied to test.
|
| 63 |
+
|
| 64 |
+
**Wide-SNR test (−15…25 dB), DS modules trained on 10k utts:**
|
| 65 |
+
|
| 66 |
+
| Method | Test WER (%) | Params | vs OA |
|
| 67 |
+
|---|---|---|---|
|
| 68 |
+
| Noisy | 25.21 | — | — |
|
| 69 |
+
| SE-enhanced (BSRNN) | 26.11 | — | — |
|
| 70 |
+
| + OA (s=0.4, tuned on dev) | 20.43 | — | baseline |
|
| 71 |
+
| + DS (decoupled, sub-band) | 19.83 | 28.7K | **−0.60** |
|
| 72 |
+
| **+ DS4BSRNN (coupled, sub-band)** | **19.39** | **10.9K** | **−1.04** |
|
| 73 |
+
|
| 74 |
+
**Narrow-SNR test (−5…20 dB):** OA 11.19 / DS 11.09 (margin 0.10). The DS-over-OA
|
| 75 |
+
margin grows ~6× under wide SNR, because a *fixed* OA coefficient cannot track the
|
| 76 |
+
per-utterance optimum when conditions vary, while the **adaptive** DS can — the
|
| 77 |
+
paper's central point. Consistent with the paper, **DS4BSRNN is the best and most
|
| 78 |
+
lightweight** (beats OA by 1.04 WER with ~⅓ the parameters of the decoupled DS).
|
| 79 |
+
|
| 80 |
+
## Repository layout
|
| 81 |
+
|
| 82 |
+
```
|
| 83 |
+
ds4se/ # the method (BSRNN, DS, DS4BSRNN, STFT, Whisper wrapper, losses, data)
|
| 84 |
+
scripts/ # prepare_manifests, train_se, train_ds_real, eval_wer, inspect_ds_coef, smoke_test
|
| 85 |
+
ckpt/ # pretrained: se_bsrnn.pt, ds_subband_wide.pt, ds4bsrnn_wide.pt, ds_subband_v5.pt
|
| 86 |
+
data/
|
| 87 |
+
clean/ # LibriTTS clips (train-clean-100 subset / dev-clean / test-clean) + transcripts
|
| 88 |
+
noise/ # ESC-50 (audio/ + meta/esc50.csv)
|
| 89 |
+
manifests/ # train.json (10k) / dev.json (150) / test.json (300), RELATIVE paths
|
| 90 |
+
run_all.sh # one-command end-to-end recipe
|
| 91 |
+
```
|
| 92 |
+
|
| 93 |
+
## Environment
|
| 94 |
+
|
| 95 |
+
```bash
|
| 96 |
+
pip install -r requirements.txt
|
| 97 |
+
```
|
| 98 |
+
Tested with PyTorch 2.9 (CUDA 12.x) on a single 80 GB GPU. The frozen ASR
|
| 99 |
+
(`openai/whisper-base.en`, ~290 MB) is downloaded from the HF Hub on first use;
|
| 100 |
+
for an **offline** machine, pre-fetch it (e.g. `huggingface-cli download
|
| 101 |
+
openai/whisper-base.en`) and set `HF_HUB_OFFLINE=1`.
|
| 102 |
+
|
| 103 |
+
## Reproduce the reported numbers (pretrained checkpoints, no training)
|
| 104 |
+
|
| 105 |
+
```bash
|
| 106 |
+
# Wide-SNR evaluation: OA tuned on dev -> applied to test; DS + DS4BSRNN
|
| 107 |
+
python scripts/eval_wer.py --se ckpt/se_bsrnn.pt \
|
| 108 |
+
--ds ckpt/ds_subband_wide.pt --ds4 ckpt/ds4bsrnn_wide.pt \
|
| 109 |
+
--snr_lo -15 --snr_hi 25
|
| 110 |
+
```
|
| 111 |
+
This uses only in-repo data + checkpoints and prints the table above.
|
| 112 |
+
|
| 113 |
+
## Full training recipe (from scratch)
|
| 114 |
+
|
| 115 |
+
```bash
|
| 116 |
+
bash run_all.sh # SE -> DS (decoupled) -> DS4BSRNN -> eval, on the bundled data
|
| 117 |
+
```
|
| 118 |
+
or step by step:
|
| 119 |
+
```bash
|
| 120 |
+
# (0) manifests are shipped; regenerate only if starting from a full LibriTTS:
|
| 121 |
+
# python scripts/prepare_manifests.py --libritts_root <LibriTTS> \
|
| 122 |
+
# --n_train 10000 --n_dev 150 --n_test 300 --relative_to .
|
| 123 |
+
|
| 124 |
+
# (1) train the BSRNN speech-enhancement front-end (SI-SDR loss)
|
| 125 |
+
python scripts/train_se.py --epochs 40 --num_channel 64 --num_layer 6 \
|
| 126 |
+
--out ckpt/se_bsrnn.pt
|
| 127 |
+
|
| 128 |
+
# (2) non-intrusive DS training against frozen Whisper (wide SNR, unlocked adaptivity)
|
| 129 |
+
python scripts/train_ds_real.py --se ckpt/se_bsrnn.pt --updates 8000 \
|
| 130 |
+
--warmup 200 --mode sub-band --lr 1e-2 --cosine --weight_decay 1e-5 \
|
| 131 |
+
--s_tv 0.0 --bias_init 1.0 --dev_items 150 --snr_lo -15 --snr_hi 25 \
|
| 132 |
+
--out ckpt/ds_subband_wide.pt
|
| 133 |
+
python scripts/train_ds_real.py --se ckpt/se_bsrnn.pt --coupled --updates 8000 \
|
| 134 |
+
--warmup 200 --mode sub-band --lr 1e-2 --cosine --weight_decay 1e-5 \
|
| 135 |
+
--s_tv 0.0 --bias_init 1.0 --dev_items 150 --snr_lo -15 --snr_hi 25 \
|
| 136 |
+
--out ckpt/ds4bsrnn_wide.pt
|
| 137 |
+
|
| 138 |
+
# (3) evaluate
|
| 139 |
+
python scripts/eval_wer.py --se ckpt/se_bsrnn.pt \
|
| 140 |
+
--ds ckpt/ds_subband_wide.pt --ds4 ckpt/ds4bsrnn_wide.pt \
|
| 141 |
+
--snr_lo -15 --snr_hi 25
|
| 142 |
+
|
| 143 |
+
# (optional) inspect the learned DS coefficients (adaptivity diagnostic)
|
| 144 |
+
python scripts/inspect_ds_coef.py --ds ckpt/ds_subband_wide.pt
|
| 145 |
+
```
|
| 146 |
+
|
| 147 |
+
A quick self-check that exercises the core mechanisms without training:
|
| 148 |
+
```bash
|
| 149 |
+
python scripts/smoke_test.py
|
| 150 |
+
```
|
| 151 |
+
|
| 152 |
+
## Open-reproduction setup vs the paper's headline tables
|
| 153 |
+
|
| 154 |
+
| Aspect | Paper (Tables I / III) | This open reproduction |
|
| 155 |
+
|---|---|---|
|
| 156 |
+
| Data | private in-house Mandarin / licensed CHiME-4 + DNS | public LibriTTS + ESC-50 (simulated) |
|
| 157 |
+
| ASR back-end | Paraformer / large Whisper | frozen `openai/whisper-base.en` |
|
| 158 |
+
| Reported quantity | absolute CER/WER | runnable WER reproducing the same trends |
|
| 159 |
+
|
| 160 |
+
A few implementation details not fully specified in the paper text were fixed
|
| 161 |
+
explicitly here: a 23-band 16 kHz split, DS band-embedding dim N=16, and the
|
| 162 |
+
scheduled-bias `bias_init`.
|
| 163 |
+
|
| 164 |
+
## Data & licenses
|
| 165 |
+
|
| 166 |
+
The bundled audio is redistributed under its original licenses — see
|
| 167 |
+
[`DATA_LICENSES.md`](DATA_LICENSES.md). **ESC-50 is CC BY-NC**, so the bundled
|
| 168 |
+
artifact as a whole is for **non-commercial / academic** use. The repository
|
| 169 |
+
*code* is MIT-licensed (see `LICENSE`).
|
| 170 |
+
|
| 171 |
+
## Citation
|
| 172 |
+
|
| 173 |
+
```bibtex
|
| 174 |
+
@inproceedings{wang2025advancing,
|
| 175 |
+
title = {Advancing Non-intrusive Suppression on Enhancement Distortion for Noise Robust ASR},
|
| 176 |
+
author = {Wang, Wei and Zhao, Siyi and Qian, Yanmin},
|
| 177 |
+
booktitle = {ICASSP},
|
| 178 |
+
year = {2025}
|
| 179 |
+
}
|
| 180 |
+
```
|
ckpt/ds4bsrnn_wide.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0a76711b60dd5af84d549f343f678d79b03602a26edc5ea107c684c8ee7ab16b
|
| 3 |
+
size 51185
|
ckpt/ds_subband_v5.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:384767af95009e417d678326b1b7fb0192ce7ef3abf4ebbd5e9aaa37c9b44cfa
|
| 3 |
+
size 152707
|
ckpt/ds_subband_wide.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:43ea4746341815fbb787badce2ddec0147ac11715ef1474fc6ea7034dee68a6a
|
| 3 |
+
size 152991
|
ckpt/se_bsrnn.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:aa579de413a7498da65659e64fbbd3246e1fb596e66586e01947cfe22d1b7645
|
| 3 |
+
size 15835929
|
data/clean/dev-clean/1272/141231/1272_141231_000019_000000.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
"Out!" was the single snarled word of the response.
|
data/clean/dev-clean/1272/141231/1272_141231_000019_000000.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:402f4751d237a8809623bf0d043ffbe91c5c4c29626363bf9221001072699505
|
| 3 |
+
size 164204
|
data/clean/dev-clean/1272/141231/1272_141231_000024_000005.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Just thrust and parry, and victory to the stronger.
|
data/clean/dev-clean/1272/141231/1272_141231_000024_000005.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:45f2d03555410efd471c881f41c5d51f40846ac5cb56867488590cc4536745e5
|
| 3 |
+
size 166604
|
data/clean/dev-clean/1272/141231/1272_141231_000026_000007.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Self hypnosis was an accepted tool.
|
data/clean/dev-clean/1272/141231/1272_141231_000026_000007.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:454961b5d0217c4ec523d52be0123b07b9a8edcd3dc21d747e261d065e7e5c8f
|
| 3 |
+
size 112364
|
data/clean/dev-clean/1272/141231/1272_141231_000027_000007.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This is physically impossible when conscious.
|
data/clean/dev-clean/1272/141231/1272_141231_000027_000007.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:2c29b29abaea14641c5c391a7ce22a01ee647676668f8cc19b332818b05a6924
|
| 3 |
+
size 131084
|
data/clean/dev-clean/1272/141231/1272_141231_000031_000000.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
When the buzzer sounded he pulled his foil from his second's startled grasp, and ran forward.
|
data/clean/dev-clean/1272/141231/1272_141231_000031_000000.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:edc8ad70c493ef6dfeda33ad044239d03ffc0146241a4443d7dd43fa7c54f440
|
| 3 |
+
size 274124
|
data/clean/dev-clean/1462/170138/1462_170138_000006_000001.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
When they entered the stage box on the left the first act was well under way, the scene being the interior of a cabin in the south of Ireland.
|
data/clean/dev-clean/1462/170138/1462_170138_000006_000001.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:cebf60b4ee0df7ca0babd80d80d0d73bd4277a86cef528b9d8613daf7994d8aa
|
| 3 |
+
size 368204
|
data/clean/dev-clean/1462/170138/1462_170138_000015_000006.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
I dare say it's quite true that there's never been any one else." Mainhall vouched for her constancy with a loftiness that made Alexander smile, even while a kind of rapid excitement was tingling through him.
|
data/clean/dev-clean/1462/170138/1462_170138_000015_000006.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:4eb10d1459bc3a7009c4c0d381f41583a0a9526916289502f1668c6278de0746
|
| 3 |
+
size 556364
|
data/clean/dev-clean/1462/170138/1462_170138_000022_000014.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
You've made things come your way, and I never thought you'd do it.
|
data/clean/dev-clean/1462/170138/1462_170138_000022_000014.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:748caa1de4aa4aed74dd4b99f319dc37424d86470654d4e7e4c664a9c3ea0e88
|
| 3 |
+
size 132044
|
data/clean/dev-clean/1462/170142/1462_170142_000031_000001.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Something of their troubling sweetness came back to Alexander, too.
|
data/clean/dev-clean/1462/170142/1462_170142_000031_000001.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:32cfd2b555cbfd1e7b85d8ce81a6dececb255dc1e4f039659ab28778079ba6f2
|
| 3 |
+
size 174284
|
data/clean/dev-clean/1462/170142/1462_170142_000039_000000.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
"I can't," he said heavily.
|
data/clean/dev-clean/1462/170142/1462_170142_000039_000000.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ba57b70089b3fce773fa0c9230166d75ad787d72e16181400242b45ddab17f66
|
| 3 |
+
size 106124
|
data/clean/dev-clean/1462/170142/1462_170142_000043_000001.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
"Yes, I know I'm cowardly. I'm afraid of myself.
|
data/clean/dev-clean/1462/170142/1462_170142_000043_000001.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:3860b8525e5fd53c262d495dce87b27efd2488a9a7dd7516b38324110bf3a9ea
|
| 3 |
+
size 155082
|
data/clean/dev-clean/1462/170145/1462_170145_000007_000000.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
"Of course I know, Bartley," she said at last, "that after this you won't owe me the least consideration.
|
data/clean/dev-clean/1462/170145/1462_170145_000007_000000.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c46242dd159b77763a54be59cd0c075c59cd6d53d12c87fef8a1392e3fef9f0b
|
| 3 |
+
size 290924
|
data/clean/dev-clean/1462/170145/1462_170145_000008_000003.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
"Here, put your feet on this stool. You don't mean to say you walked down-and without overshoes!"
|
data/clean/dev-clean/1462/170145/1462_170145_000008_000003.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c38fd778b58ab137f01fd40afec773cedb2acf88ceb6c06183defc95f9734da9
|
| 3 |
+
size 278924
|
data/clean/dev-clean/1462/170145/1462_170145_000009_000007.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
But you won't let me write to you, and I had to see you after that letter, that terrible letter you wrote me when you got home."
|
data/clean/dev-clean/1462/170145/1462_170145_000009_000007.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1292d5e08727ab33fc789845cc910f98296cb0ac613ebbad0622607a87fec05a
|
| 3 |
+
size 298604
|
data/clean/dev-clean/174/168635/174_168635_000027_000004.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
To meet was to find each other.
|
data/clean/dev-clean/174/168635/174_168635_000027_000004.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1cfb01a5e648b7170cdc4c608a83b19a4181212a645e4c381eec72f3d2463f74
|
| 3 |
+
size 109004
|
data/clean/dev-clean/174/50561/174_50561_000023_000004.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
The dancers once more encircle their weeping comrade, and now they are gowned in white and pink.
|
data/clean/dev-clean/174/50561/174_50561_000023_000004.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:3fe2f83cf5fb38805c05f28450ff8f76e76d290a214943a974249d1692eed4c0
|
| 3 |
+
size 265484
|
data/clean/dev-clean/1919/142785/1919_142785_000047_000002.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
In Jamaica it flowers about August or September, fading about the end of the year.
|
data/clean/dev-clean/1919/142785/1919_142785_000047_000002.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e6c15470beec6845db1cd0753e1ad07a466800dfd82c133676cbb6912d21bbc0
|
| 3 |
+
size 232842
|
data/clean/dev-clean/1919/142785/1919_142785_000120_000000.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
PESTLE AND MORTAR.--No cookery can be perfectly performed without the aid of the useful instruments shown in the engraving.
|
data/clean/dev-clean/1919/142785/1919_142785_000120_000000.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c162b79b9d8aeca27505fe43a6c4aa748c6eac9a4dbc180c4c6423f1fc000469
|
| 3 |
+
size 342284
|
data/clean/dev-clean/1919/142785/1919_142785_000123_000008.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
For brown or white ragouts they should be firm, and when the quenelles are used very small, extreme delicacy will be necessary in their preparation.
|
data/clean/dev-clean/1919/142785/1919_142785_000123_000008.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ff6219fdd1790bb5a5f7b5b8636fcf9175b9b605f6b45cb44b7ecbff99ab2943
|
| 3 |
+
size 470446
|
data/clean/dev-clean/1988/147956/1988_147956_000002_000003.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
They made a gold ribbon across the prairie.
|
data/clean/dev-clean/1988/147956/1988_147956_000002_000003.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f8a30e86a1562186dbf0727e5d0929ba9383ce85ff329dfca5df1a8d4b5fbe43
|
| 3 |
+
size 109964
|
data/clean/dev-clean/1988/147956/1988_147956_000003_000005.normalized.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
One son, Fuchs said, was well grown, and strong enough to work the land; but the father was old and frail and knew nothing about farming.
|