Access SAWT V4

SAWT V4 is free under the SAWT License. Two quick fields and you are in, approval is automatic.

Log in or Sign Up to review the conditions and access this model content.

SAWT

SAWT V4

Studio-quality restoration of any speech recording, at 48 kHz, without inventing a word

Reverb, noise, hum, band limits, codec damage, phone lines, hall echo: in. Dry 48 kHz speech in the same voice, saying the same words: out.

Technical report: SAWT: Restoring Speech for Synthesis (PDF)
Preprint, not peer reviewed and not posted to arXiv.

Listening room · Quick start · How it works · Evaluation · Paper (PDF)


SAWT V4 is a 48 kHz speech restorer built by Quran-Lab. It began with one problem. The Quran is among the most carefully preserved oral texts in human history: recited letter for letter, in an unbroken chain of teachers and students, for fourteen centuries and on every continent. Yet a century of its finest recordings survives on tape, in echoing halls and in low-bitrate uploads. Restoring those recordings without changing a syllable is not a convenience. For a reciter a changed word is a falsification. That standard shaped every decision in this model, and it turned out to be what every archive needs, in any language.

SAWT is a latent flow-matching generator on a frozen 48 kHz codec latent, steered frame by frame by a deterministic anchor that reads the damaged recording and hands the generator the content, the pitch, the speaker and a first estimate of the clean signal. The generator renders texture. It never decides what was said. That single design choice is why SAWT keeps words and voices where other restorers replace them, and it is measured, not asserted: every quality number below has a faithfulness number next to it. To our knowledge SAWT is the first speech restorer evaluated under a pre-registered protocol, and the first whose output is checked for content against its input before a single window is allowed through.

If you have never heard the Quran recited, start with the archive pair below: one voice, the room taken away, every word exactly as it has been carried for fourteen hundred years.

Highlights

  • Faithful by construction and by measurement. Against Google's own Miipher renders of 200 LibriTTS-R utterances, SAWT changes the recognised words of the input less (transcript drift 0.042 vs 0.068), keeps the speaker better (0.988 vs 0.962) and drops fewer words (0.7 % vs 1.9 %); word error against the reference text is 0.077 vs 0.082 (unprocessed input 0.066).
  • Removes reverberation that no training set contained. Hall decays of 6 to 7 s are brought down to a floor of -64 to -69 dBFS. On the toughest cells SAWT keeps more words than Sidon (the open Miipher-2 reproduction) and than its own predecessor.
  • Archive results. On 120 real recitation recordings plus long vintage tapes: phoneme error against the canonical text 0.071 (source recordings 0.062, which is the recogniser's own floor on clean speech; 0.068 with the optional recogniser-selected mode; internal predecessor 0.088), speaker consistency 0.94, background floor -70 dBFS, 47 dB between speech and floor.
  • Multilingual. Trained on about 900 hours of verified studio-dry speech and singing in 35 languages, and it restores languages it never saw: our listening room opens with Danish.
  • Fast. 10 to 16 times real time on one RTX 4090 with 16 files in flight, under 15 GB of VRAM.
  • Pre-registered, one look, all clauses reported. Where SAWT loses to the field, it says so below. We think that is the only way to publish a generative restorer.

What SAWT is, and what it is the first to do

SAWT V4 is the first SAWT model released. Its predecessor V3.1 was an internal system and appears in the tables below only as a paired reference.

To our knowledge, SAWT V4 is:

  • The first speech restorer evaluated under a pre-registered protocol. Sixteen pass criteria across six test sets, one seed, one confirmatory look, all committed to the repository before the look. Every quality number paired with a faithfulness number. Every result published, including the ones it lost.
  • The first open-weights latent flow-matching restorer at 48 kHz. Prior latent restorers kept their representation and their weights closed. SAWT runs on Meta's open DAC-VAE latent with an open anchor, so the whole chain can be inspected and reproduced.
  • The first restorer that audits its own output before it lets a window through. The anchor reads the restored window the same way it read the damaged one; if the content drifts, the energy collapses or the speaker changes, the window is redrawn. Words are guarded at inference time, not hoped for.
  • The first restorer whose training targets were measured one by one. Every candidate clip of every corpus was screened for floor, reverb tail, bandwidth, hum and clipping, and every refusal reason logged: 593,000 rows. The model never saw a roomy target, which is why it removes rooms it was never trained on.
  • The first published reverb envelope of a restorer. Hall decays from 1 to 7 s, two noise levels, word error and floor in every cell: how far the room goes, and how far the words survive, measured separately, because quality predictors cannot tell them apart.
  • The first restorer measured against a canonical text. For recitation the words are fixed, so phoneme error against the text is exact. Restorers that invent words fail this test instantly; SAWT scores within 0.01 of the damaged input on 120 archive files.
  • A restorer that carries its own measurements. Every output file ships with a sidecar: configuration hash, noise floor, reverb tail, and any window that still failed a guard after three redraws. Archives can refuse or flag, not guess.
  • Released as a permanent public trust. Full weights, anchor included, under a licence that forbids selling the model or any feature it powers, with attribution.

Hear it

Two recordings, before and after, nothing else changed. Headphones recommended.

Danish, heard over a telephone line. A public New Year address, 12 s, passed through a 300 to 3700 Hz line with line noise: the top two octaves are gone. SAWT gives back full bandwidth, the sibilants and the breath, and it is unmistakably still her. Quality predictor 3.05 to 4.60, bandwidth 3.7 to 23 kHz.

damaged restored

Arabic recitation from the archive. A 48 kbps upload of Khalid Almohana reciting surah 49, band-limited at 22 kHz with a raised floor. SAWT returns the voice at studio level with the pauses silent. Quality predictor 2.83 to 4.19, floor in pauses -39 to -61 dBFS, every phoneme matching the canonical text.

damaged restored

Dutch, over a telephone line. A CML-TTS sentence, 8 s, through a 300 to 3400 Hz line with heavy compression and line noise. Full 48 kHz bandwidth comes back from a telephone band; no words are invented and the rhythm of the sentence is untouched. Quality predictor 1.17 to 4.56, floor -48 to -73 dBFS.

damaged restored

More pairs, English, Portuguese, Spanish and Hausa among them, in the listening room.

Quick start

pip install -r requirements.txt huggingface_hub
python - <<'EOF'
from huggingface_hub import snapshot_download
snapshot_download("Quran-Lab/sawt-v4", local_dir="sawt-v4", allow_patterns=[
    "sawt2/*", "config.json", "requirements.txt",            # the client
    "generator.pt", "anchor.pt", "vae48_dacvae_d2.pt",       # the weights, 1.9 GB
])
EOF
cd sawt-v4
python sawt2/restore_v4r_fast.py --ckpt generator.pt --vae dacvae@vae48_dacvae_d2.pt --anchor anchor.pt \
    --in recordings/ --out restored/

That is the frozen recipe: Euler 64 steps, no guidance, 8 s windows with 1 s overlap, three guards, dynamics matched to the input, seed 0. Every output gets a JSON sidecar with the configuration hash, the measured floor and reverb tail, and any window that still failed a guard after three redraws.

The whole repository is 14 GB, because it also carries the trainable checkpoints and a half-precision copy of the weights. The list above is the 1.9 GB that restores audio. Add "quran_asr_v31/*" and "quran_canon_tokens.json" (76 MB) for --purpose quran and the recitation mode, or "bf16/*" in place of the three weight files to download half as much.

Useful flags: --no-metrics to skip the quality predictors and run at archive speed, --lanes and --dec-batch to trade memory for throughput on smaller cards, --purpose quran to restore only files a Quran recogniser accepts (for mixed archive batches; the recogniser and its canonical token cache ship in this repository). Inputs can be any sample rate; outputs are 48 kHz mono WAV.

Recitation mode. --select-k 3 --select-by asr draws three candidates per window and keeps the one whose phonemes, read by the bundled Quran recogniser (quran_asr_v31/), agree best with the input window. On 120 real archive recordings it lowers phoneme error against the canonical text from 0.071 to 0.068 (the source recordings read 0.062) at unchanged quality, speaker consistency and dropouts, and runs about three times slower. It needs no transcript, so the same mechanism works for any language with a recogniser.

Gentle guidance for general speech. --cfg 1.15 adds mild classifier-free guidance on the content streams: predicted quality unchanged, word error against the reference down about 10 % on heavily damaged English, one extra generator pass per step. It does not help real recitation, so it is off by default.

Smaller download, smaller card. bf16/ holds the same three weight files with their float32 tensors cast to bfloat16: 0.97 GB instead of 1.94. Nothing else changes, because the loader casts on read. --half and --half-anchor then also keep the generator and the anchor in bfloat16 on the card, which is the precision both already compute in, and take peak memory from 6.4 GB to 4.5 GB. Measured against the float32 files on the sixteen clips of the comparison page: DistillMOS -0.006, Audiobox PQ -0.001, transcript drift +0.002, speaker consistency +0.010, identical dropouts, largest single-clip change 0.08 DistillMOS.

python sawt2/restore_v4r_fast.py --ckpt bf16/generator.pt --vae dacvae@bf16/vae48_dacvae_d2.pt \
    --anchor bf16/anchor.pt --lanes 1 --half --half-anchor --in recordings/ --out restored/

How it works

SAWT V4 architecture: the anchor reads the damaged recording, the generator renders the clean latent, the guards check every window

  1. Representation. Meta's DAC-VAE, frozen, 48 kHz, 128 channels at 25 Hz. Its decoder is fine-tuned for 40k steps on dry targets and decodes without the watermark branch (D2).
  2. Anchor. A frozen w2v-BERT 2.0 with 42M LoRA parameters and four heads, trained to emit, from the damaged 16 kHz view, what the frozen teacher emits on the clean view: layer-8 content features, a stack of layers 8 to 20, pitch, and an estimate of the clean latent. Deterministic. The speaker vector is the mean stack over the file.
  3. Generator. A 24-layer diffusion transformer (width 1024, 16 heads, adaLN-single, RoPE, qk-norm). Inputs: the noised latent, the noisy latent, the anchor's estimate; per-block injection of content, stack, pitch, noisy latent and estimate; global speaker, bandwidth and room tokens. Flow matching from unit noise, x1-parametrised velocity loss, logit-normal time. 150k steps at 8 x 32 x 5 s on eight H100s with damage simulated on the fly every step: two RIR banks (rooms, and halls with octave-band decay and a PA path), noise from 239k AudioSet clips, DNS5 and FSD50K at -5 to 20 dB, hum, MP3 65 to 245 kbps, packet loss, band limits.
  4. Guards. Each 8 s window is redrawn (up to three times) if its energy collapses, if the anchor's reading of the decoded window drifts from its reading of the input (cosine below 0.85), or if the speaker embedding jumps from the previous window.

Training data

About 900 hours of 48 kHz recordings that passed a per-clip screen (floor below -50 dBFS, 30 dB speech-to-floor, no reverb tail, cutoff at 20 kHz for studio sets, no hum, no clipping). Every candidate clip of every corpus was measured and the refusal reason logged: 593k rows.

corpus hours languages
Bible-TTS 310 Hausa, Yoruba, Ewe, Asante Twi, Akuapem Twi, Kikuyu, Lingala, Luganda, Luo, Chichewa
OpenSLR high-quality sets 230 Spanish (Argentina, Chile, Colombia, Peru, Venezuela), Catalan, Basque, Galician, Nigerian English, English dialects (SLR83), Tamil, Telugu, Kannada, Malayalam, Marathi, Gujarati, Nepali, Javanese, Sundanese, Khmer, Burmese
EARS 89 English (anechoic, expressive)
AISHELL-3 74 Mandarin
VCTK 71 English (109 speakers)
GTSinger 65 singing in 9 languages
Arabic recitation and Arabic Speech Corpus 98 Arabic
DAPS clean, SIWIS, Expresso, JSUT, Opencpop, VocalSet, M4Singer 68 English, French, Japanese, Mandarin singing

The anchor additionally trained on LibriTTS-R, CML-TTS and FLEURS-R at 24 kHz, so its content reader has seen more than a hundred languages. Speakers of every evaluation set were removed from training by identity, including fingerprint matches.

Evaluation

SAWT V4 is, to our knowledge, the first speech restorer evaluated under a pre-registered protocol. The pass criteria, the sets, the statistics and the seed were frozen and committed to the repository before a single confirmatory sample was drawn, and every quality number is paired with a faithfulness number: word error under two recognisers, phoneme error against a canonical text, speaker consistency, dropped words, reverb tail and noise floor. Sixteen clauses, one look, all results published, including the ones we lost. Restoration papers usually report the first half of that sentence.

Archive of real recitation (120 files plus long vintage tapes), paired against the internal predecessor V3.1

measure SAWT V4 internal V3.1 input
phoneme error vs canonical text 0.071 0.088 0.062
phoneme error, recitation mode (--select-k 3 --select-by asr) 0.068 0.062
speaker consistency 0.941 0.923
background floor -69.6 dBFS
speech-to-floor 47.2 dB
DistillMOS, difference +0.123 (interval above zero)

General speech, against the field

set comparison quality faithfulness
LibriTTS-R 200 vs Google's Miipher renders -0.11 DistillMOS transcript drift 0.042 vs 0.068, speaker 0.988 vs 0.962, dropouts 0.7 % vs 1.9 %; word error vs reference 0.077 vs 0.082 (input 0.066)
Miipher-dev 48 vs Sidon -0.15 DistillMOS word error and speaker at parity or better
Google's 16 demo clips vs Miipher-2 3.83 vs 4.36 one collapse, two clips under 2.5 s
Phase C 200 read speech vs internal V3.1 word error 0.0721 vs 0.0738 (unprocessed 0.0710)

Reverb envelope (24 clips, hall RT60 1 to 6 s, SNR 20 and 5 dB, 288 inputs)

condition word error, input SAWT V4 Sidon internal V3.1
1 s, 20 dB 0.62 0.28 0.46 0.66
3 s, 20 dB 0.9+ 0.52 0.82 0.94
2 s, 5 dB 0.98 0.72 0.93 1.02
5 s, 5 dB 1.0 0.79 0.95 1.03

Decays end at -64 to -69 dBFS in every cell, including 6 to 7 s of reverb.

Blind listening, 24 items, three systems, shuffled letters, key opened after the answers: SAWT V4 12.0, Sidon 8.5, previous release 3.5. On English items SAWT was chosen 5 of 6 times (p = 0.018).

Speed and hardware

Peak memory is set by the weights and by how many files are in flight. Measured on one RTX 4090 that was also driving a desktop, over sixteen clips totalling 205 s (mean 12.8 s), --no-metrics:

setting peak allocated allocator reserved throughput
--lanes 1 6.4 GB 9.5 GB 3.5x real time
--lanes 1 --half 5.7 GB 8.9 GB 4.4x real time
--lanes 1 --half --half-anchor 4.5 GB 7.7 GB 4.7x real time
--lanes 2 6.4 GB 10.4 GB 4.7x real time
--lanes 4 7.7 GB 14.5 GB 5.6x real time
--lanes 8 10.5 GB 18.2 GB 6.1x real time
--lanes 16 10.6 GB 21.8 GB 1.8x real time

Six gigabytes is enough. Reserved above is what the allocator hoards when nothing stops it, not what the model needs. Give it less and it hoards less: capped to a hard 6 GB budget, the one-lane --half --half-anchor run reserves 5.9 GB, holds the same 4.5 GB, runs at 4.4 to 4.6x against 4.7x uncapped, and returns bit-identical audio on all sixteen clips. A 5 GB budget also passes. 4 GB runs out partway through the first file. Shortening the window does not help and is not worth trying: at one lane --win-s 4 holds exactly the same 4.5 GB and drops to 2.7x.

Sixteen lanes are the other end of the same behaviour: reserving 21.8 GB leaves nothing on a 24 GB card, which is why that row is slower than eight, so eight is the practical ceiling there. Downloading bf16/ does not by itself lower memory, because the loader casts the weights back up as it reads them; --half is what keeps them small on the card.

Throughput rises with the length of the files, because a long file keeps more windows in flight: on sets of minute-long recordings the same eight lanes run at 6 to 7.5x, and on twenty-minute tapes sixteen lanes reach 10 to 13x. Leave the CUDA graph on. --no-graph is correct and five times slower.

Files

file what size
generator.pt 372M flow-matching DiT, EMA at 150k steps 1.4 GB
anchor.pt LoRA and heads for w2v-BERT 2.0 (the base downloads from Hugging Face) 161 MB
vae48_dacvae_d2.pt fine-tuned DAC-VAE decoder (the base downloads with the dacvae package) 270 MB
bf16/ the same three files in bfloat16, for half the download 970 MB
sawt2/ restorer, anchor, guards, metrics
quran_asr_v31/ Quran phoneme recogniser (zipformer CTC, int8 ONNX) for --purpose quran and the recitation mode 73 MB
quran_canon_tokens.json canonical token cache for --purpose quran 2.6 MB
training/ the four checkpoints that resume or fine-tune the model, see below 11.2 GB

Training from here

training/ carries the state the released weights were trimmed from, so V4 can be resumed or fine-tuned rather than reproduced from nothing.

file what size
training/generator_step150000.pt the resume point: weights, EMA and optimizer state at step 150k 5.9 GB
training/generator_step150000_noopt.pt the same step without the optimizer: weights and EMA. Every render in the paper came from this file 3.0 GB
training/anchor_final.pt the anchor as trained at step 60k, untrimmed: LoRA and all four heads, EMA, optimizer and scheduler 677 MB
training/vae48_dacvae_full.pt the decoder fine-tune at step 40k: trainable weights, EMA, the discriminator and both optimizers 1.6 GB
python - <<'EOF'
from huggingface_hub import snapshot_download
snapshot_download("Quran-Lab/sawt-v4", local_dir="sawt-v4", allow_patterns=["sawt2/*", "training/*"])
EOF

sawt2/train_v4r.py is the trainer these came from and sawt2/train_vae48.py the decoder fine-tune. Both expect the damage simulator (sawt2/degrade_gpu.py, sawt2/degrade_v2.py) and the impulse-response banks, which are not redistributable; the corpora are listed above and the screen that selected them is in the paper. Fine-tuning on a new language means training the anchor first: it is the part that reads what was said.

License

SAWT License 1.0. Use it, run it, study it, build on it, host it: freely, with attribution to Quran-Lab. SAWT is held as a permanent public trust: the model, its derivatives and any feature they power may never be sold or put behind a payment; hosted services may recover their direct running costs and nothing more; derivatives carry the same licence. Two further conditions follow from what the model is: it may not be used to make a recording say what was not said or to pass off altered audio as an original, and it may not be used to deceive, impersonate, surveil or harm. Full text in LICENSE.

Upstream components (section 10 of the licence), each under its own terms for its original portions: w2v-BERT 2.0 (Meta, MIT), DAC-VAE (Meta, Apache 2.0), WavLM (Microsoft, MIT). Several training corpora are licensed for non-commercial use only (EARS, Expresso, GTSinger, M4Singer, Opencpop, DAPS); the no-sale condition of this licence is consistent with all of them.

Acknowledgements

Meta for w2v-BERT 2.0 and DAC-VAE; the creators of every corpus in the table above; the authors of Sidon for an open baseline worth measuring against; Google for publishing the Miipher demo clips and the LibriTTS-R renders that made paired comparison possible. SAWT was trained on 8x NVIDIA H100 GPUs with damage synthesised live on every step, and evaluated end to end on a single workstation.

Paper

SAWT: Restoring Speech for Synthesis (technical report, September 2026): paper/sawt_v4.pdf. It documents the architecture, the training data, the faithfulness audit against the canonical text, every comparison against Miipher, Miipher-2 and Sidon including the ones SAWT loses, the diagnosis of the residual phone loss and the recitation mode that recovers part of it. Every number in it is a dated row in the project's results log.

Citation

@misc{sawt_v4_2026,
  title  = {SAWT V4: Faithfulness-first speech restoration at 48 kHz, pre-registered end to end},
  author = {Quran-Lab},
  year   = {2026},
  url    = {https://huggingface.co/Quran-Lab/sawt-v4}
}

Paper in preparation. The results log with every gate, kill and negative result is published with the paper.


Built by Quran-Lab, University of Copenhagen. SAWT means voice.

Downloads last month
13
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support