StillScript — Whisper large-v3 Afrikaans (merged fp32)

This repository holds openai/whisper-large-v3 with André Oosthuizen's Afrikaans LoRA adapter merged into the base weights, saved as a single fp32 checkpoint that transformers can load directly with from_pretrained() — no PEFT at inference time.

It exists to serve one application (see Why this repository exists). It is public, and you are welcome to use it under the licence terms below, but it is not presented as a general-purpose model release.

Lineage

Stage Who What
Base model OpenAI openai/whisper-large-v3 — Apache-2.0
Afrikaans fine-tune André Oosthuizen andreoosthuizen/whisper-large-v3-afrikaans — LoRA (PEFT), CC-BY-4.0
Merge to fp32 Acutus Consulting This repository — adapter merged via merge_and_unload(), no retraining, no quantisation

Nothing was retrained here. The only operation performed was merging the published adapter into the published base weights and saving the result. All modelling credit belongs to André Oosthuizen (Afrikaans adaptation) and OpenAI (base model).

Reported performance is André's, measured on his adapter, and is reproduced here for reference rather than independently re-measured: 12.85% WER, improved from 23.92% at the start of his training run. Training data: andreoosthuizen/afrikaans-30s (CC-BY-4.0).

Licence

This model is a combination of two upstream works, and both sets of terms apply:

  • Base weightsopenai/whisper-large-v3, Apache-2.0.
  • Afrikaans fine-tuningandreoosthuizen/whisper-large-v3-afrikaans, Creative Commons Attribution 4.0 International (CC-BY-4.0). André's model card states the licence as "Creative Commons Attribution 4.0 (Commercial use allowed)".

Because the merged weights contain both contributions inseparably, this repository is released under CC-BY-4.0, which is the more demanding of the two for anyone redistributing it (it requires attribution and an indication that changes were made). The Apache-2.0 terms continue to apply to the base-model contribution within it.

A note on why we matched rather than chose: CC-BY-4.0 has no ShareAlike clause, so it does not compel a downstream work to carry the same licence. We matched it anyway — this is a repackaging of someone else's model, not a new work with terms of our own to assert, and any other choice would obscure that.

If you use this model, please honour the attribution requirement and cite the upstream work, as André requests on his model card:

@misc{whisper-large-v3-afrikaans,
  author = {Andre Oosthuizen},
  title = {Whisper Large V3 Afrikaans},
  year = {2025},
  publisher = {HuggingFace},
  howpublished = {\url{https://huggingface.co/andreoosthuizen/whisper-large-v3-afrikaans}}
}

@article{radford2022whisper,
  title={Robust speech recognition via large-scale weak supervision},
  author={Radford, Alec and Kim, Jong Wook and Xu, Tao and Brockman, Greg and McLeavey, Christine and Sutskever, Ilya},
  journal={arXiv preprint arXiv:2212.04356},
  year={2022}
}

What the fine-tuning actually changed

This is worth stating plainly, because it is not obvious from the adapter alone and we only found it by inspecting the tensors directly.

The adapter is LoRA r=32, alpha=64, target_modules=[q_proj, v_proj]. It ships LoRA tensors for both the encoder and the decoder — but all 64 encoder lora_B tensors are exactly zero, i.e. that side was never effectively trained. Merging therefore leaves every encoder q_proj/v_proj weight bit-identical to base large-v3; only the 128 decoder q_proj/v_proj tensors actually move.

Practical consequences for anyone else building on this:

  • The Afrikaans adaptation lives entirely in the decoder's attention projections. The acoustic encoder is stock Whisper large-v3.
  • Any integrity check, diff, or "is the adapter really applied?" test must sample decoder tensors. Sampling an encoder q_proj will show zero difference from base and look like the adapter failed to apply, when it did.
  • Measured relative deltas on the decoder probes we sampled run 5.8e-2 to 2.9e-1.

We discovered this while building a startup guard that refuses to run if the wrong model is loaded — stock Whisper will happily transcribe Afrikaans and produce fluent, plausible, subtly-wrong output, which is the failure mode we most needed to exclude.

Contents and verification

The merged checkpoint is fp32, 1259 tensors, model.safetensors of 6,174,112,552 bytes, sha256:

33bdc94edce5478960fb7c1184b26a8b0ac5ff02ca2ba03e6b9d329948c215fc

Two layouts are published side by side, and they contain identical bytes:

Layout Files Purpose
Single file model.safetensors Ordinary from_pretrained() use
Chunked chunks/model.safetensors.part-00000part-00029 + chunks/model.safetensors.manifest.json Resumable download

The chunked layout is a plain byte-level split into ~200 MiB parts (29 × 200 MiB + an 88 MiB remainder) — deliberately not tensor-aware, so concatenating the parts in manifest order reproduces model.safetensors bit-for-bit. The manifest records each part's size and sha256 plus the sha256 of the reassembled whole.

Reassemble with:

cat chunks/model.safetensors.part-* > model.safetensors
sha256sum model.safetensors   # expect 33bdc94e...

Usage

import torch
from transformers import WhisperProcessor, WhisperForConditionalGeneration

processor = WhisperProcessor.from_pretrained("DanieClar/stillscript-whisper-large-v3-afrikaans")
model = WhisperForConditionalGeneration.from_pretrained(
    "DanieClar/stillscript-whisper-large-v3-afrikaans", dtype=torch.float32
)
model.eval()

inputs = processor(audio, sampling_rate=16000, return_tensors="pt",
                   truncation=False, padding="longest", return_attention_mask=True)
with torch.no_grad():
    output = model.generate(**inputs, language="af", task="transcribe",
                            return_timestamps=True, condition_on_prev_tokens=True)
print(processor.batch_decode(output, skip_special_tokens=True)[0])

Notes from our own integration, offered as findings rather than advice:

  • Feed audio whole (truncation=False plus an attention mask) so generate() uses its long-form sequential algorithm. The chunked pipeline(chunk_length_s=...) path hallucinated on long-form Afrikaans in our testing.
  • condition_on_prev_tokens=True measurably improved accuracy on our benchmark at roughly 22% additional runtime cost.
  • Set language="af" explicitly. Auto-detection is not a path we validated.
  • A CTranslate2 / faster-whisper conversion of this merge was broken for us: it forced the wrong language and produced fluent English text from Afrikaans audio. Verify carefully before using any converted variant.

Why this repository exists

StillScript Confidential Transcripts is a local-first transcription tool for legal, clinical and journalistic work. Its "Accurate" mode uses this model, and because the weights are ~5.75 GiB they cannot be bundled into the installer — they are downloaded on demand on first use. Both layouts above exist to serve that: the chunked one so an interrupted download resumes at part granularity instead of restarting a multi-hour transfer.

Audio never leaves the user's machine; this repository serves model weights only.

Limitations

André's limitations apply unchanged, since the modelling is his — degraded performance on noisy audio, on dialects thinly represented in the training data, on domain-specific terminology, and on overlapping multi-speaker speech. Additionally:

  • Afrikaans-specific. Do not expect the base model's multilingual breadth to survive intact in the decoder.
  • fp32 and unquantised, so it is large and slow: expect roughly 3× real time on CPU.
  • No independent re-evaluation of the 12.85% WER figure was performed here.

Merged and packaged by Acutus Consulting. Modelling credit: André Oosthuizen and OpenAI.

Downloads last month
58
Safetensors
Model size
2B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for DanieClar/stillscript-whisper-large-v3-afrikaans

Finetuned
(899)
this model

Dataset used to train DanieClar/stillscript-whisper-large-v3-afrikaans

Paper for DanieClar/stillscript-whisper-large-v3-afrikaans