Sync model card with upstream GitHub inference README
Browse files
README.md
CHANGED
|
@@ -19,8 +19,11 @@ license: apache-2.0
|
|
| 19 |
acoustic echo cancellation (AEC), noise suppression, and dereverberation of
|
| 20 |
16 kHz speech, designed to run on commodity CPUs in real time.
|
| 21 |
|
| 22 |
-
-
|
| 23 |
-
-
|
|
|
|
|
|
|
|
|
|
| 24 |
- Causal, streaming: 256-sample hop, 16 ms algorithmic latency
|
| 25 |
- F32 reference inference in C++ via [GGML](https://github.com/ggml-org/ggml);
|
| 26 |
PyTorch reference included for verification and research
|
|
@@ -31,9 +34,14 @@ This page is the Hugging Face model card β it hosts the published weights.
|
|
| 31 |
Source code, build system, tests, and training pipeline live in the GitHub
|
| 32 |
repository: <https://github.com/localai-org/LocalVQE>.
|
| 33 |
|
| 34 |
-
The current release is **v1.
|
| 35 |
-
|
| 36 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
The technical report describing the architecture, streaming-state contract,
|
| 39 |
and streaming-causal normalisation operator is included in this repo as
|
|
@@ -97,17 +105,22 @@ implementation, no streaming runtime. We re-implemented it from the
|
|
| 97 |
paper as a GGML graph at
|
| 98 |
[richiejp/deepvqe-ggml](https://github.com/richiejp/deepvqe-ggml)
|
| 99 |
(the full-width ~7.5 M-parameter version) before starting LocalVQE.
|
| 100 |
-
LocalVQE is the same idea
|
| 101 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
|
| 103 |
## Files in this repository
|
| 104 |
|
| 105 |
| File | Size | Description |
|
| 106 |
|---|---|---|
|
| 107 |
-
| `localvqe-v1.
|
| 108 |
-
| `localvqe-v1.
|
| 109 |
-
| `localvqe-v1.
|
| 110 |
-
| `localvqe-v1.
|
|
|
|
| 111 |
| `localvqe-v1-1.3M-f32.gguf` | 5 MB | Original release. |
|
| 112 |
|
| 113 |
Only F32 GGUF is published today. A `quantize` tool is included in the
|
|
@@ -120,6 +133,18 @@ Full 800-clip eval on the
|
|
| 120 |
[ICASSP 2022 AEC Challenge blind test set](https://github.com/microsoft/AEC-Challenge)
|
| 121 |
β real recordings, not synthetic mixes.
|
| 122 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
| Scenario | n | AECMOS echo β | AECMOS deg β | blind ERLE β | DNSMOS OVRL β |
|
| 124 |
|-----------------------------------|----:|--------------:|-------------:|-------------:|--------------:|
|
| 125 |
| doubletalk | 115 | 4.72 | 2.37 | 8.4 dB | 2.83 |
|
|
@@ -128,12 +153,27 @@ Full 800-clip eval on the
|
|
| 128 |
| farend-singletalk-with-movement | 193 | 4.12 | 4.96 | 40.6 dB | 1.75 |
|
| 129 |
| nearend-singletalk | 200 | 5.00 | 4.16 | 2.1 dB | 3.17 |
|
| 130 |
|
| 131 |
-
v1.
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
|
| 138 |
- **AECMOS** (Purin et al., ICASSP 2022) is Microsoft's non-intrusive AEC
|
| 139 |
quality predictor. "Echo" rates how well echo was removed; "degradation"
|
|
@@ -189,22 +229,41 @@ glslc`/`shaderc`).
|
|
| 189 |
Measured with `bench` on Zen4 desktop (Ryzen 9 7900). Each hop is a
|
| 190 |
full `ggml_backend_graph_compute`.
|
| 191 |
|
| 192 |
-
**v1.
|
| 193 |
-
|
| 194 |
-
| Backend | Threads | p50 | p99 |
|
| 195 |
-
|-----------------------------|--------:|--------:|--------:|--------:|
|
| 196 |
-
| CPU | 1 |
|
| 197 |
-
| CPU |
|
| 198 |
-
| CPU |
|
| 199 |
-
| CPU |
|
| 200 |
-
|
|
| 201 |
-
| Vulkan β
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 208 |
|
| 209 |
| Backend | Threads | p50 | p99 | max |
|
| 210 |
|-----------------------------|--------:|--------:|--------:|--------:|
|
|
@@ -222,9 +281,12 @@ range.
|
|
| 222 |
|
| 223 |
## Running Inference
|
| 224 |
|
| 225 |
-
Download `localvqe-v1.
|
| 226 |
-
|
| 227 |
-
`
|
|
|
|
|
|
|
|
|
|
| 228 |
|
| 229 |
### CLI
|
| 230 |
|
|
@@ -269,10 +331,15 @@ calibration have been worked through.
|
|
| 269 |
|
| 270 |
## PyTorch Reference
|
| 271 |
|
| 272 |
-
`localvqe-v1.
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 276 |
[GitHub repo](https://github.com/localai-org/LocalVQE):
|
| 277 |
|
| 278 |
```bash
|
|
|
|
| 19 |
acoustic echo cancellation (AEC), noise suppression, and dereverberation of
|
| 20 |
16 kHz speech, designed to run on commodity CPUs in real time.
|
| 21 |
|
| 22 |
+
- Two sizes β choose by CPU budget:
|
| 23 |
+
- **v1.3 (current)** β 4.8 M parameters (~19 MB F32), ~3.3 ms per 16 ms
|
| 24 |
+
frame on Zen4 (4 threads), **β4.7Γ realtime**.
|
| 25 |
+
- **v1.2** β 1.3 M parameters (~5 MB F32), ~1.6 ms per 16 ms frame on
|
| 26 |
+
Zen4 (4 threads), **β9.7Γ realtime**.
|
| 27 |
- Causal, streaming: 256-sample hop, 16 ms algorithmic latency
|
| 28 |
- F32 reference inference in C++ via [GGML](https://github.com/ggml-org/ggml);
|
| 29 |
PyTorch reference included for verification and research
|
|
|
|
| 34 |
Source code, build system, tests, and training pipeline live in the GitHub
|
| 35 |
repository: <https://github.com/localai-org/LocalVQE>.
|
| 36 |
|
| 37 |
+
The current release is **v1.3**. It widens the encoder/decoder
|
| 38 |
+
(mic channels `[2,112,32,104,96,152]`, far `[2,64,32]`, bottleneck
|
| 39 |
+
256) and trains from scratch under a noise-floor-aware loss recipe.
|
| 40 |
+
On doubletalk it filters noise better than v1.2; on far-end-only
|
| 41 |
+
echo it cancels harder but the residual rates rougher in AECMOS β
|
| 42 |
+
some users will prefer v1.2's gentler trade-off on FE-ST scenes.
|
| 43 |
+
v1.2 stays available as the small/fast option (~1/4 the per-hop
|
| 44 |
+
cost). Both reuse v1.2's 1024 ms echo-search window.
|
| 45 |
|
| 46 |
The technical report describing the architecture, streaming-state contract,
|
| 47 |
and streaming-causal normalisation operator is included in this repo as
|
|
|
|
| 105 |
paper as a GGML graph at
|
| 106 |
[richiejp/deepvqe-ggml](https://github.com/richiejp/deepvqe-ggml)
|
| 107 |
(the full-width ~7.5 M-parameter version) before starting LocalVQE.
|
| 108 |
+
LocalVQE is the same idea rebuilt for streaming CPU inference, and
|
| 109 |
+
published in two sizes: a 1.3 M-parameter compact build (v1.2,
|
| 110 |
+
~5 MB F32) for tight CPU budgets, and a 4.8 M-parameter wider build
|
| 111 |
+
(v1.3, ~19 MB F32) that filters noise better on some clips at ~2Γ
|
| 112 |
+
the per-hop cost. Both are small enough to run real time on
|
| 113 |
+
commodity CPUs.
|
| 114 |
|
| 115 |
## Files in this repository
|
| 116 |
|
| 117 |
| File | Size | Description |
|
| 118 |
|---|---|---|
|
| 119 |
+
| `localvqe-v1.3-4.8M.pt` | 55 MB | PyTorch checkpoint β DNS5 pre-training + ICASSP 2022/2023 AEC Challenge fine-tune, wider arch + noise-floor-aware loss. **Current release.** |
|
| 120 |
+
| `localvqe-v1.3-4.8M-f32.gguf` | 19 MB | GGML F32 export of the current release β what the C++ inference engine loads. |
|
| 121 |
+
| `localvqe-v1.2-1.3M.pt` | 11 MB | Compact alternative β same arch family as v1.3 (`arch_version=3`), ~1/4 the cost per hop. |
|
| 122 |
+
| `localvqe-v1.2-1.3M-f32.gguf` | 5 MB | GGML F32 export of the compact variant. |
|
| 123 |
+
| `localvqe-v1.1-1.3M-f32.gguf` | 5 MB | Older release (F32 GGUF). |
|
| 124 |
| `localvqe-v1-1.3M-f32.gguf` | 5 MB | Original release. |
|
| 125 |
|
| 126 |
Only F32 GGUF is published today. A `quantize` tool is included in the
|
|
|
|
| 133 |
[ICASSP 2022 AEC Challenge blind test set](https://github.com/microsoft/AEC-Challenge)
|
| 134 |
β real recordings, not synthetic mixes.
|
| 135 |
|
| 136 |
+
**v1.3** (current, 4.8 M):
|
| 137 |
+
|
| 138 |
+
| Scenario | n | AECMOS echo β | AECMOS deg β | blind ERLE β | DNSMOS OVRL β |
|
| 139 |
+
|-----------------------------------|----:|--------------:|-------------:|-------------:|--------------:|
|
| 140 |
+
| doubletalk | 115 | 4.73 | **2.62** | 8.5 dB | 2.89 |
|
| 141 |
+
| doubletalk-with-movement | 185 | 4.67 | **2.43** | 8.3 dB | 2.85 |
|
| 142 |
+
| farend-singletalk | 107 | 3.69 | 4.83 | **50.9 dB** | 1.94 |
|
| 143 |
+
| farend-singletalk-with-movement | 193 | 3.88 | 4.98 | **49.9 dB** | 1.96 |
|
| 144 |
+
| nearend-singletalk | 200 | 5.00 | 4.18 | 2.4 dB | 3.17 |
|
| 145 |
+
|
| 146 |
+
**v1.2** (compact alternative, 1.3 M):
|
| 147 |
+
|
| 148 |
| Scenario | n | AECMOS echo β | AECMOS deg β | blind ERLE β | DNSMOS OVRL β |
|
| 149 |
|-----------------------------------|----:|--------------:|-------------:|-------------:|--------------:|
|
| 150 |
| doubletalk | 115 | 4.72 | 2.37 | 8.4 dB | 2.83 |
|
|
|
|
| 153 |
| farend-singletalk-with-movement | 193 | 4.12 | 4.96 | 40.6 dB | 1.75 |
|
| 154 |
| nearend-singletalk | 200 | 5.00 | 4.16 | 2.1 dB | 3.17 |
|
| 155 |
|
| 156 |
+
v1.3 vs v1.2 deltas (same 800-clip set, same eval pipeline):
|
| 157 |
+
|
| 158 |
+
- **Doubletalk deg MOS +0.25**, dt-with-movement deg MOS +0.13 β the
|
| 159 |
+
wider model + noise-floor-aware loss recipe noticeably reduces
|
| 160 |
+
perceived speech degradation when both talkers are active. This is
|
| 161 |
+
the primary v1.3 release goal.
|
| 162 |
+
- **FE-ST-with-movement ERLE +9.3 dB**, FE-ST ERLE +5.2 dB β v1.3
|
| 163 |
+
cancels far-end echo substantially harder. **AECMOS echo MOS drops
|
| 164 |
+
β0.24 / β0.09** at the same time: the residual after cancellation
|
| 165 |
+
rates rougher on AECMOS's perceptual scale even though there's
|
| 166 |
+
numerically less of it. Some users will prefer v1.2's gentler
|
| 167 |
+
trade-off on far-end-only scenes.
|
| 168 |
+
- **Nearend-singletalk identical** within noise (deg +0.02,
|
| 169 |
+
OVRL +0.00) β wider capacity doesn't help (or hurt) when there's
|
| 170 |
+
nothing to cancel.
|
| 171 |
+
- DNSMOS OVRL is up 0.04β0.21 across all scenarios β the wider
|
| 172 |
+
model produces consistently cleaner-rated output by DNS metrics.
|
| 173 |
+
|
| 174 |
+
For the original v1.2 vs v1.1 deltas (the previous release's
|
| 175 |
+
headline numbers), see the [v1.2 release notes on
|
| 176 |
+
GitHub](https://github.com/localai-org/LocalVQE).
|
| 177 |
|
| 178 |
- **AECMOS** (Purin et al., ICASSP 2022) is Microsoft's non-intrusive AEC
|
| 179 |
quality predictor. "Echo" rates how well echo was removed; "degradation"
|
|
|
|
| 229 |
Measured with `bench` on Zen4 desktop (Ryzen 9 7900). Each hop is a
|
| 230 |
full `ggml_backend_graph_compute`.
|
| 231 |
|
| 232 |
+
**v1.3** (current β 4.8 M, wider encoder/decoder, bn 256):
|
| 233 |
+
|
| 234 |
+
| Backend | Threads | p50 | p99 | RT factor |
|
| 235 |
+
|-----------------------------|--------:|--------:|--------:|----------:|
|
| 236 |
+
| CPU | 1 | 9.73 ms | 14.48 ms | 1.58Γ |
|
| 237 |
+
| CPU | 2 | 5.41 ms | 5.62 ms | 2.95Γ |
|
| 238 |
+
| CPU | 4 | 3.21 ms | 3.42 ms | 4.97Γ |
|
| 239 |
+
| CPU | 8 | 3.47 ms | 3.80 ms | 4.59Γ |
|
| 240 |
+
| CPU | 16 | 3.79 ms | 4.06 ms | 4.19Γ |
|
| 241 |
+
| Vulkan β AMD iGPU (RADV) | β | 8.71 ms | 9.15 ms | 1.83Γ |
|
| 242 |
+
| Vulkan β NVIDIA RTX 5070 Ti | β | 2.57 ms | 4.21 ms | 6.07Γ |
|
| 243 |
+
|
| 244 |
+
The wider v1.3 model is ~2Γ the per-hop cost of v1.2 in matching
|
| 245 |
+
configurations. The dGPU (RTX 5070 Ti) ends up the fastest option
|
| 246 |
+
by ~1.25Γ vs 4-thread CPU. The 1-thread case is the worst, still
|
| 247 |
+
real-time (RT 1.58Γ) but with little margin β running v1.3 on a
|
| 248 |
+
low-core / power-constrained device should use v1.2 instead.
|
| 249 |
+
|
| 250 |
+
**v1.2** (compact alternative β 1.3 M, 1024 ms echo-search window):
|
| 251 |
+
|
| 252 |
+
| Backend | Threads | p50 | p99 | RT factor |
|
| 253 |
+
|-----------------------------|--------:|--------:|--------:|----------:|
|
| 254 |
+
| CPU | 1 | 4.28 ms | 4.85 ms | 3.72Γ |
|
| 255 |
+
| CPU | 2 | 2.59 ms | 3.80 ms | 6.09Γ |
|
| 256 |
+
| CPU | 4 | 1.65 ms | 2.91 ms | 8.90Γ |
|
| 257 |
+
| CPU | 8 | 1.93 ms | 2.41 ms | 8.22Γ |
|
| 258 |
+
| CPU | 16 | 2.09 ms | 2.22 ms | 7.69Γ |
|
| 259 |
+
| Vulkan β AMD iGPU (RADV) | β | 6.10 ms | 6.53 ms | 2.61Γ |
|
| 260 |
+
| Vulkan β NVIDIA RTX 5070 Ti | β | 1.96 ms | 3.64 ms | 7.85Γ |
|
| 261 |
+
|
| 262 |
+
Beyond β4 threads both models are small enough that thread-launch
|
| 263 |
+
and synchronisation overhead dominate; **four threads is the sweet
|
| 264 |
+
spot on Zen4** for both v1.2 and v1.3.
|
| 265 |
+
|
| 266 |
+
**v1.1** (older, 512 ms echo-search window) for comparison:
|
| 267 |
|
| 268 |
| Backend | Threads | p50 | p99 | max |
|
| 269 |
|-----------------------------|--------:|--------:|--------:|--------:|
|
|
|
|
| 281 |
|
| 282 |
## Running Inference
|
| 283 |
|
| 284 |
+
Download a GGUF from the file list above β `localvqe-v1.3-4.8M-f32.gguf`
|
| 285 |
+
for the current default, or `localvqe-v1.2-1.3M-f32.gguf` for the
|
| 286 |
+
smaller / faster option β via `huggingface-cli`, the Hub web UI, or
|
| 287 |
+
`hf_hub_download` from `huggingface_hub`. The CLI flags are the same
|
| 288 |
+
either way; the examples below use v1.2 so the snippets are shorter
|
| 289 |
+
to type. Swap the filename in to run v1.3.
|
| 290 |
|
| 291 |
### CLI
|
| 292 |
|
|
|
|
| 331 |
|
| 332 |
## PyTorch Reference
|
| 333 |
|
| 334 |
+
`localvqe-v1.3-4.8M.pt` (current) and `localvqe-v1.2-1.3M.pt`
|
| 335 |
+
(compact alternative) are the PyTorch checkpoints used to produce
|
| 336 |
+
the GGUF exports. They are provided for verification, ablation, and
|
| 337 |
+
downstream research β not for end-user inference, which should go
|
| 338 |
+
through the GGML build above. Both share `arch_version=3` (pre-norm
|
| 339 |
+
CausalGroupNorm + SiLU + STFT-256) and differ only in width
|
| 340 |
+
(`mic_channels`, `far_channels`, `bottleneck_hidden`), which the
|
| 341 |
+
loader reads from the saved `model_config` field. The model
|
| 342 |
+
definition lives under `pytorch/` in the
|
| 343 |
[GitHub repo](https://github.com/localai-org/LocalVQE):
|
| 344 |
|
| 345 |
```bash
|