| --- |
| license: mit |
| language: |
| - multilingual |
| datasets: |
| - google/fleurs-r |
| - parler-tts/libritts_r_filtered |
| tags: |
| - speech-restoration |
| - speech-enhancement |
| - dereverberation |
| - gguf |
| - crispasr |
| base_model: sarulab-speech/sidon-v0.1 |
| base_model_relation: quantized |
| pipeline_tag: audio-to-audio |
| --- |
| |
| # Sidon GGUF (quant ladder) |
|
|
| GGUF conversions of [SaruLab Sidon v0.1](https://huggingface.co/sarulab-speech/sidon-v0.1), a multilingual |
| speech-restoration model that removes noise and reverberation and restores speech bandwidth (16 kHz in β 48 kHz out). |
| Packaged for native, no-PyTorch inference with [CrispASR](https://github.com/CrispStrobe/CrispASR). |
|
|
| The model is the first eight layers of w2v-BERT 2.0 with the Sidon LoRA adapter merged, followed by Sidon's continuous |
| DAC decoder. The SeamlessM4T log-mel window and filter bank are embedded in the GGUF. Port by |
| [@KevinAHM](https://huggingface.co/KevinAHM/Sidon-GGUF) (CrispASR PR #283); this repo adds the quantization ladder. |
|
|
| ## Files |
|
|
| | File | Precision | Size | Notes | |
| | --- | --- | ---: | --- | |
| | `sidon-v0.1-f16.gguf` | FP16 weights, FP32 norms/biases | 470 MiB | Reference. Byte-identical to KevinAHM/Sidon-GGUF. | |
| | `sidon-v0.1-q8_0.gguf` | Q8_0 predictor matmuls | 320 MiB | Highest-fidelity quant. | |
| | `sidon-v0.1-q6_k.gguf` | Q6_K predictor matmuls | 281 MiB | Balanced. | |
| | `sidon-v0.1-q4_k.gguf` | Q4_K predictor matmuls | 240 MiB | Smallest. Intelligible, but see fidelity note. | |
| |
| Only the w2v-BERT predictor's large linear weights are quantized; the DAC decoder convolutions and all |
| norms/biases/Snake `alpha` parameters are kept at their original precision. |
| |
| ## Fidelity |
| |
| Validated by **ASR round-trip** (Whisper `base.en`) on the restored output β the metric that matters for a |
| restoration model, since output-waveform correlation understates perceptual quality: |
| |
| | Quant | ASR round-trip (JFK clip) | Output-waveform corr. vs F16 | |
| | --- | --- | ---: | |
| | F16 | WER 0 (exact transcript) | 1.000 | |
| | Q8_0 | WER 0 | r β 0.99, SNR β 16 dB | |
| | Q4_K | WER 0 | r β 0.61, SNR β 1 dB | |
| |
| All quants restore fully intelligible speech (WER 0). Q4_K's low waveform correlation means its fine restored |
| detail diverges from F16 even though intelligibility is preserved; prefer **Q8_0 or Q6_K** when output fidelity to |
| the reference matters, and Q4_K when size is the priority. |
| |
| ## Validation against the original model |
| |
| The GGUF port was checked against the **upstream SaruLab TorchScript** modules |
| (`feature_extractor_cpu.pt` + `decoder_cpu.pt`) on the JFK clip: |
|
|
| | Stage | Metric | Result | |
| | --- | --- | --- | |
| | Predictor handoff (w2v-BERT) | cosine, our F16 vs upstream F32 | **0.998** | |
| | End-to-end 48 kHz output | Pearson r | 0.945 | |
| | ASR round-trip (Whisper base.en) | transcription | **identical** | |
|
|
| The predictor reproduces the original almost exactly (0.998); the end-to-end |
| drop to 0.945 is the continuous-DAC decoder amplifying F16 weight-rounding |
| through its Snake activations, not a port error β the restored speech is |
| functionally identical (same transcription). The reference intermediates used |
| for this check are published here as `sidon-ref.gguf` (`input_16k`, |
| `predictor_feats`, `output_48k`) with `sidon-ref-48k.wav`; regenerate with |
| `tools/reference_backends/sidon_ref_dump.py` and re-run our side with |
| `CRISPASR_SIDON_DUMP_HANDOFF=<path>`. |
|
|
| ## CrispASR usage |
|
|
| ```bash |
| crispasr --s2s -m sidon-v0.1-q8_0.gguf -f input.wav --s2s-output restored-48khz.wav |
| ``` |
|
|
| CrispASR auto-detects the `sidon` architecture from GGUF metadata. The S2S interface processes a complete clip and |
| returns a complete restored clip (not streaming). GPU: `--gpu-backend cuda` / `--gpu-backend vulkan`. |
|
|
| **Long inputs:** the predictor uses O(TΒ²) self-attention (~50 feature frames/sec). Inputs are capped at ~60 s |
| (3000 frames) by default and fail cleanly past that; raise `CRISPASR_SIDON_MAX_FRAMES` if you have the memory. |
|
|
| ## Conversion |
|
|
| ```bash |
| # F16 from upstream weights: |
| python models/convert-sidon-to-gguf.py --base w2v-bert-2.0 --sidon sidon_raw_weight --out sidon-v0.1-f16.gguf |
| # quants: |
| crispasr-quantize sidon-v0.1-f16.gguf sidon-v0.1-q4_k.gguf q4_k |
| ``` |
|
|