Instructions to use DanieClar/stillscript-whisper-large-v3-afrikaans with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use DanieClar/stillscript-whisper-large-v3-afrikaans with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("automatic-speech-recognition", model="DanieClar/stillscript-whisper-large-v3-afrikaans")# Load model directly from transformers import AutoProcessor, AutoModelForSpeechSeq2Seq processor = AutoProcessor.from_pretrained("DanieClar/stillscript-whisper-large-v3-afrikaans") model = AutoModelForSpeechSeq2Seq.from_pretrained("DanieClar/stillscript-whisper-large-v3-afrikaans", device_map="auto") - Notebooks
- Google Colab
- Kaggle
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 weights —
openai/whisper-large-v3, Apache-2.0. - Afrikaans fine-tuning —
andreoosthuizen/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_projwill 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-00000 … part-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=Falseplus an attention mask) sogenerate()uses its long-form sequential algorithm. The chunkedpipeline(chunk_length_s=...)path hallucinated on long-form Afrikaans in our testing. condition_on_prev_tokens=Truemeasurably 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
Model tree for DanieClar/stillscript-whisper-large-v3-afrikaans
Base model
openai/whisper-large-v3