alt.freeweights.speech / whisper-small-cantonese
From: alvanlii <huggingface.co/alvanlii>Newsgroups: alt.freeweights.speechSubject:

whisper-small-cantonese

Date: 2026-11-15Commit: b03a4e5Signed: 2DC28CC7B26A283B ✓

Automatic speech recognition model with 242M parameters. Ctranslate2 and ggml and safetensors weights, 5.32 GB in all. Published by alvanlii under Apache-2.0.

242M params5.32GBwhisper-small-cantonesectranslate2 ggml safetensorspermissive
FactsParams242MSize5.32 GBFormatsctranslate2, ggml, safetensorsTaskautomatic speech recognitionLicenseApache-2.0From sourcepermissive
$ fw get alvanlii/whisper-small-cantonese
# manifest sha256 1c20a983280b… · 5.32 GB · 24 files
$ fw verify ./whisper-small-cantonese alvanlii/whisper-small-cantonese
From sourceHosted (signed)alvanlii/whisper-small-cantoneseLast check: 2026-11-15 03:31 UTC

Get help: custom fine-tune or private deploy. We review your setup before we quote.

Fine-tune of whisper-small.

Works with

Overview

Size
5.32 GB
Weights
967 MB (safetensors)
Parameters
242M
Formats
ctranslate2, ggml, safetensors
Task
automatic speech recognition
License
Apache-2.0 (permissive)
Files
24, each with a sha256
Publisher
alvanlii
Added
2026-11-15
Section
alt.freeweights.speech
Lineage

Original release from the publisher.

Base model: openai/whisper-small

Where these bytes come from
Publisher at the pinned commit→You

Sources are tried in order. A file counts only when its size and sha256 match the manifest. Sources are checked when you ask for them, not on a timer.

Sources
BadgeHostLast checkResult
From sourcehuggingface.co2026-11-15 03:31 UTCpassed

Model card

From the publisher at commit b03a4e5. Shown as plain text with links; images open at the publisher.

Whisper Small Cantonese - Alvin#

This model is a fine-tuned version of openai/whisper-small on the Cantonese language. It achieves a 7.93 CER (without punctuations), 9.72 CER (with punctuations) on Common Voice 16.0

Training and evaluation data#

For training,

  • CantoMap: Winterstein, Grégoire, Tang, Carmen and Lai, Regine (2020) "CantoMap: a Hong Kong Cantonese MapTask Corpus", in Proceedings of The 12th Language Resources and Evaluation Conference, Marseille: European Language Resources Association, p. 2899-2906.
  • Cantonse-ASR: Yu, Tiezheng, Frieske, Rita, Xu, Peng, Cahyawijaya, Samuel, Yiu, Cheuk Tung, Lovenia, Holy, Dai, Wenliang, Barezi, Elham, Chen, Qifeng, Ma, Xiaojuan, Shi, Bertram, Fung, Pascale (2022) "Automatic Speech Recognition Datasets in Cantonese: A Survey and New Dataset", 2022. Link: https://arxiv.org/pdf/2201.02419.pdf
Name# of Hours
Common Voice 16.0 zh-HK Train138
Common Voice 16.0 yue Train85
Common Voice 17.0 yue Train178
Cantonese-ASR72
CantoMap23
Pseudo-Labelled YouTube Data438

For evaluation, Common Voice 16.0 yue Test set is used.

Results#

  • CER (lower is better): 0.0972
    • down from 0.1073, 0.1581 in the previous versions
  • CER (punctuations removed): 0.0793
  • GPU Inference with Fast Attention (example below): 0.055s/sample
    • Note all GPU evaluations are done on RTX 3090 GPU
  • GPU Inference: 0.308s/sample
  • CPU Inference: 2.57s/sample
  • GPU VRAM: ~1.5 GB

Using the Model#

import librosa

import torch
from transformers import WhisperForConditionalGeneration, WhisperProcessor

y, sr = librosa.load('audio.mp3', sr=16000)

MODEL_NAME = "alvanlii/whisper-small-cantonese"

processor = WhisperProcessor.from_pretrained(MODEL_NAME)
model = WhisperForConditionalGeneration.from_pretrained(MODEL_NAME)

processed_in = processor(y, sampling_rate=sr, return_tensors="pt")
gout = model.generate(
    input_features=processed_in.input_features, 
    output_scores=True, return_dict_in_generate=True
)
transcription = processor.batch_decode(gout.sequences, skip_special_tokens=True)[0]
print(transcription)
  • Alternatively, you can use huggingface pipelines
from transformers import pipeline
MODEL_NAME = "alvanlii/whisper-small-cantonese" 
lang = "zh"
pipe = pipeline(
    task="automatic-speech-recognition",
    model=MODEL_NAME,
    chunk_length_s=30,
    device=device,
)
pipe.model.config.forced_decoder_ids = pipe.tokenizer.get_decoder_prompt_ids(language=lang, task="transcribe")
text = pipe(file)["text"]

Model Speedup#

Just add attn_implementation="sdpa" for Flash Attention.

model = AutoModelForSpeechSeq2Seq.from_pretrained(
    "alvanlii/whisper-small-cantonese",
    torch_dtype=torch_dtype,
    low_cpu_mem_usage=True,
    use_safetensors=True,
    attn_implementation="sdpa",
)

Using Flash Attention reduced the amount of time taken per sample from 0.308s to 0.055s.

Speculative Decoding#

You can use a bigger model, then use alvanlii/whisper-small-cantonese to speed up inference with basically no loss in accuracy.

model_id = "simonl0909/whisper-large-v2-cantonese"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
    model_id,
    torch_dtype=torch_dtype,
    low_cpu_mem_usage=True,
    use_safetensors=True,
    attn_implementation="sdpa",
)
model.to(device)

processor = AutoProcessor.from_pretrained(model_id)

assistant_model_id = "alvanlii/whisper-small-cantonese"

assistant_model = AutoModelForSpeechSeq2Seq.from_pretrained(
    assistant_model_id,
    torch_dtype=torch_dtype,
    low_cpu_mem_usage=True,
    use_safetensors=True,
    attn_implementation="sdpa",
)

assistant_model.to(device)
...
model.generate(**inputs, use_cache=True, assistant_model=assistant_model)

In the original simonl0909/whisper-large-v2-cantonese model, it runs at 0.714s/sample for a CER of 7.65. \ Using speculative decoding with alvanlii/whisper-small-cantonese, it runs at 0.137s/sample for a CER of 7.67, which is much faster.

Whisper.cpp#

Uploaded a GGML bin file for Whisper cpp as of June 2024. You can download the bin file here and try it out here.

Whisper CT2#

For use in WhisperX or FasterWhisper, a CT2 file is needed. The converted model is under here

Training Hyperparameters#

  • learning_rate: 5e-5
  • train_batch_size: 25 (on 1 3090 GPU)
  • eval_batch_size: 8
  • gradient_accumulation_steps: 4
  • total_train_batch_size: 25x4=100
  • optimizer: Adam with betas=(0.9,0.999) and epsilon=1e-08
  • lr_scheduler_type: linear
  • lr_scheduler_warmup_steps: 500
  • training_steps: 15000
  • augmentation: None

Files

24 files · 5.32 GBWeights 967 MB (safetensors). Sizes and sha256 from the signed manifest.
Show all 24 files with their sha256
FileSizesha256
.gitattributes1.48 KBdb7c0371f46f0840b8f25794c1e3321c9b5820a8cb6ba9694a46fc64b8fae5a6
README.md5.68 KB50621b7efaf8abc2bf1f8b2af2d7dafede7eb1b7be95a5afc094ab4f90575733
added_tokens.json2.11 KB5687ef031827f4c9fa3e7cbdd7fd915de0d6c7c6416463a28c63cbe1cf99a07a
config.json2.32 KB58c67e6bcc4e5cdb9ad59c1b2e6867a0330033d4c2a4ff721395bce1007ef39d
cts/config.json4.26 KB5f9ce7147a745b6c500fa69f5db677dbfa37f6aee1ece2d80489a8d11296a843
cts/model.bin967 MBd343caa7ef827ddb60bc2c1c8c741b29d2bd99d5387aa5c6f96cbd26f6804b34
cts/preprocessor_config.json339 Ba6a76d28c93edb273669eb9e0b0636a2bddbb1272c3261e47b7ca6dfdbac1b8d
cts/vocabulary.json1.07 MB3f5e68832e43da76309a6999c4335648cd67bb8781b158867f422a674b7cbd78
generation_config.json4.29 KB7847d293b436a6d190000b643e653a9f5527cae162988253103436fda9004d3e
ggml-model.bin488 MBab6ddf83921733fd96b0bbb4850ae57c330a1049ab35252bf36b1d339835d2bf
merges.txt494 KB78f27f801feb4283ae969d4cadacb28fc051b655647402b1a252c7079ea11c46
model.safetensors967 MBfde842c011b43b2a7b988ad9b9f1a082731bc29c3d58b0cdffa3e71252ef7256
normalizer.json52.7 KBbf1c507dc8724ca9cf9903640dacfb69dae2f00edee4f21ceba106a7392f26dd
optimizer.pt1.93 GB52d3d75f188b0e83816ddfe2c081aa5811fef9f12f90bcf95efbb6f22d4cb03a
preprocessor_config.json339 Ba6a76d28c93edb273669eb9e0b0636a2bddbb1272c3261e47b7ca6dfdbac1b8d
pytorch_model.bin967 MB9563aaf2c8c73c9368146c47fb8767f7b2fc4ec19fa3d2f43de391939240e744
rng_state.pth14.2 KB5debd200034ecb7c5a4f41ef2227951c0f473e8fae7113e0066142d213a47d2d
scaler.pt557 Bb691e5fdc050ffec60fabc6f70ec25a5c9c5a415de9ceda0c71eee2c5823fe64
scheduler.pt1.06 KB554d2698384ad39f5da6b204240a25383b7dfb17d0add781017660bb036bc2f3
special_tokens_map.json2.18 KBd5edc7d0034441a45180aae8312fea315e467252aa08e302e8b6a4d9bc943360
tokenizer_config.json20.5 KB0eb4806861de1273613b39ebbf948597346e4ad0cf7d147fa53d69387b2f1a52
trainer_state.json80.3 KB2fd551752cc0eac5ed616e4fd17c4531f2ddf39ff271e46b2cc3634ba867123d
training_args.bin5.05 KB35b9840ed01e73c6d3c78f79f6c07a4c43b0f2853aa99d1bb368c2d4b5439c8c
vocab.json1.04 MBe2aa043ef015641d363d8288e7c241c85e36a5c761fb303598e0710233344387
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
b03a4e5d48 pinned now2026-11-15 03:31 UTC24 files · 5.32 GB

Use it

$ fw get alvanlii/whisper-small-cantonese
# manifest sha256 1c20a983280b… · 5.32 GB · 24 files
$ fw verify ./whisper-small-cantonese alvanlii/whisper-small-cantonese
fw.pyChecks the signature and every sha256, tries each source in order, resumes.
$ python3 fw.py get https://freeweights.allternit.com/manifests/alvanlii/whisper-small-cantonese.json --dir ./whisper-small-cantonese $ python3 fw.py verify ./whisper-small-cantonese ./alvanlii__whisper-small-cantonese.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download alvanlii/whisper-small-cantonese --revision b03a4e5d482f06858ce10ebbabebabec9f447a0d --local-dir ./whisper-small-cantonese
transformersSpeech recognition with the transformers pipeline.
import os os.environ["HF_ENDPOINT"] = "https://freeweights.allternit.com" from transformers import pipeline asr = pipeline("automatic-speech-recognition", model="alvanlii/whisper-small-cantonese", revision="b03a4e5d482f06858ce10ebbabebabec9f447a0d") print(asr("audio.wav")["text"])

License

Name
Apache License 2.0
Id
Apache-2.0
Class
Permissive
Redistribution
yes
Listing
Hosted (signed)
Decided
License as declared by the publisher. No person read it. 2026-11-15
Text in
README.md
Text sha256
50621b7efaf8abc2bf1f8b2af2d7dafede7eb1b7be95a5afc094ab4f90575733
Terms gate
No extra terms beyond the license.

Read the license text

Licenses are checked against the license table. A custom license passes only after a person reads it.

Provenance

From: alvanlii <huggingface.co/alvanlii>Newsgroups: alt.freeweights.speechSubject: whisper-small-cantoneseDate: 2026-11-15Commit: b03a4e5Signed: 2DC28CC7B26A283B ✓
Upstream
alvanlii/whisper-small-cantonese
Pinned commit
b03a4e5d482f06858ce10ebbabebabec9f447a0d
Manifest
whisper-small-cantonese.json · .minisig
Manifest sha256
1c20a983280b61e5207b5950243bef44fe1da4af00df2f7304b0bc89f1da09a6
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-15 03:31 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/alvanlii/whisper-small-cantonese.json $ curl -O https://freeweights.allternit.com/manifests/alvanlii/whisper-small-cantonese.json.minisig $ minisign -Vm whisper-small-cantonese.json -P RWQ7KGqyx4zCLXtUFOqvfv8L3g+8fpKJ1FsuxPyOYMF+4KufbUxKq1Oq $ shasum -a 256 <file> # compare with the Files tab

A manifest whose signature fails must be rejected. A file whose size or sha256 does not match must be discarded. Verify a download

Model tree

Parent

openai/whisper-small · this model is a finetune of it

1 model in the catalog name this one as their parent.

Quantizations
1
Get it
Download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download alvanlii/whisper-small-cantonese
Open in Freeweights Studio

Pull, verify and run it in the Allternit app on Desktop, web or phone.

Signed manifest
minisign, key 2DC28CC7B26A283B. whisper-small-cantonese.json. Provenance. Takedown history: none.

Variants

1 quantized or adapter build of whisper-small-cantonese. Each has its own license check and page.

From: MIT <huggingface.co/MIT>Subject: ast-finetuned-audioset-10-10-0.4593
From: onnx-community <huggingface.co/onnx-community>Subject: ast-finetuned-audioset-10-10-0.4593-ONNX
From: Edge0 <huggingface.co/Edge0>Subject: Audio8-TTS-Preview-0.6b
From: Edge0 <huggingface.co/Edge0>Subject: Audio8-TTS-Realistic-Air
From: facebook <huggingface.co/facebook>Subject: audiobox-aesthetics
From: mlx-community <huggingface.co/mlx-community>Subject: chatterbox-4bit