Skip to page content
SAVRN
Search Plan a project

Open-weight model · Speech recognition

sea-asr-id

by Pixel ML PixelML/sea-asr-id

sea-asr-id is an open-weight model for speech recognition from Pixel ML, released under Apache License 2.0. It has 112M parameters. At 16-bit it needs about 0.3 GB of GPU memory, which fits on 1x MI300X from $1.85 an hour, at the lowest prices in the SAVRN Index. It draws 32 downloads a month.

Pixel ML builds video intelligence for Southeast Asian media. These are the speech models we run for Southeast Asian media: captions, search, clips. Open weights, open data, runs on your GPU — or on a CPU.

Parameters112M
Context—
Weights719.7 MB
Licenseapache-2.0
AccessOpen weights
Monthly Downloads32

Runs On

What it takes to serve sea-asr-id (112M parameters): the memory its weights need at each precision, and the cheapest way to rent enough data-center GPUs to hold them.

PrecisionWeightsMemory neededCheapest setupPer hourAlso fits
16-bit 0.2 GB 0.3 GB 1x MI300X (192 GB)
Vultr
$1.85 1x H100 $1.99 · 1x MI325X $2.00
8-bit 0.1 GB 0.1 GB 1x MI300X (192 GB)
Vultr
$1.85 1x H100 $1.99 · 1x MI325X $2.00
4-bit 0.1 GB 0.1 GB 1x MI300X (192 GB)
Vultr
$1.85 1x H100 $1.99 · 1x MI325X $2.00

Memory is the weights at that precision plus 20% for the runtime and a short context; a long context needs more. Prices are the lowest on-demand hourly rates in the SAVRN Index, read Oct 23, 2026.

sea-asr-id on every accelerator the SAVRN Index prices, at every precision

Model Card

By Pixel ML, published under apache-2.0, revision 90567734a716.

Pixel ML builds video intelligence for Southeast Asian media. These are the speech models we run for Southeast Asian media: captions, search, clips. Open weights, open data, runs on your GPU — or on a CPU. Google's EmbeddingGemma 2 audio encoder with a CTC head, trained by Pixel ML on openly licensed Indonesian speech (YODAS, FLEURS, Common Voice). An optional n-gram language model (folder lm/, 0.27 GB) built from Indonesian Wikipedia comes with the weights. Speed (one H100 80GB, side by side with Whisper on the same GPU type and container size; seaasr v0.2.1): greedy decoding is about 18x faster than batched Whisper large-v3 and 9x faster than large-v3-turbo on a 79-minute recording…

Read Pixel ML's full model card

sea-asr-id — fast Indonesian speech recognition on EmbeddingGemma 2 (CTC)

Pixel ML builds video intelligence for Southeast Asian media. These are the speech models we run for Southeast Asian media: captions, search, clips. Open weights, open data, runs on your GPU — or on a CPU.

Google's EmbeddingGemma 2 audio encoder with a CTC head, trained by Pixel ML on openly licensed Indonesian speech (YODAS, FLEURS, Common Voice). An optional n-gram language model (folder lm/, 0.27 GB) built from Indonesian Wikipedia comes with the weights.

Speed (one H100 80GB, side by side with Whisper on the same GPU type and container size; sea_asr v0.2.1): greedy decoding is about 18x faster than batched Whisper large-v3 and 9x faster than large-v3-turbo on a 79-minute recording (long-form), and 30x / 20x faster on FLEURS test (short clips). With the n-gram LM or rescoring, the beam search on CPU sets the speed: on short clips both modes are still faster than Whisper, but on the long-form recording + n-gram LM is slower than turbo and + rescoring is slower than large-v3 (table in "Max accuracy" below). It also runs on a CPU. One pass, no autoregressive decode, streaming in 0.48 s chunks. Word timestamps and SRT/VTT output included.

Trained on CC-BY YouTube audio (via YODAS) and read speech. No purchased data.

Results

Same H100 for every open model, one normaliser for all (quanphid/text.py: lower case, no punctuation, numbers as words), WER % (lower is better). Avg = mean of FLEURS and CV27. Speed = audio seconds / wall seconds on FLEURS id test (short clips), one H100 80GB, batched, model load and warm-up excluded; ours sea_asr v0.2.1, Whisper on the same GPU type and container size. Params = Hugging Face safetensors total (ours: counted from this repo).

Model Params Avg Speed (× RT) FLEURS id test (684) CV27 id test (3,711) GigaSpeech 2 id test (16,218)
Qwen3-ASR-1.7B (our teacher) 2,349M 5.1 — 4.9 5.3 14.9
sea-asr-id + n-gram LM + Sailor2-1B rescoring (opt-in) 364M + 0.27 GB LM + 1B LM 5.9 229 5.5 [5.0, 6.0] 6.3 [5.9, 6.7] 16.6 [16.3, 16.9]
Whisper large-v3 1,543M 5.8 114 5.2 6.3 17.3
Whisper large-v3-turbo 809M 6.5 171 5.8 7.2 18.0
sea-asr-id + n-gram LM 364M + 0.27 GB LM 6.6 389 6.1 [5.5, 6.7] 7.0 [6.6, 7.4] 17.4 [17.1, 17.7]
Qwen3-ASR-0.6B 938M 8.1 — 7.9 8.4 17.6
sea-asr-id, greedy 364M 9.0 3,427 9.0 [8.3, 9.7] 9.1 [8.6, 9.6] 18.7 [18.4, 19.0]
Whisper medium 764M 10.1 — 9.1 11.2 20.7
Whisper small 242M 16.4 — 15.2 17.6 25.7
omniASR CTC-1B ~1B — — 15.0 18.9 28.0
omniASR CTC-300M ~0.3B — — 24.7 30.6 38.0
Gemini 3.5 Transcribe (closed API) — — — 2.3 — —

Size class. Under 1B: sea-asr-id with its n-gram LM ties Whisper large-v3-turbo on read speech, lower WER on conversational Indonesian (GigaSpeech 2) than every other open model we tested. Paired 95 % CI of the WER difference (sea-asr-id + LM − rival): vs Qwen3-ASR-0.6B (2.6× larger) FLEURS −1.8 [−2.3, −1.3], CV27 −1.4 [−1.8, −1.0], GigaSpeech 2 −0.3 [−0.4, −0.1]; vs Whisper large-v3-turbo FLEURS +0.4 [−0.1, +0.8], CV27 −0.2 [−0.7, +0.2] (tie), GigaSpeech 2 −0.6 (CI below 0); vs Whisper large-v3 FLEURS +0.9 [+0.4, +1.3], CV27 +0.7 [+0.3, +1.1]. Whisper large-v3 and Qwen3-ASR-1.7B are more accurate. Greedy, without the LM: ties Whisper medium on FLEURS (−0.1 [−0.7, +0.5]) and is better on CV27 (−2.1 [−2.7, −1.6]).

  • GS2: test video 45 excluded for all systems; it overlaps our YODAS training audio.
  • — = not measured in this container. Qwen3-ASR, Whisper medium / small and omniASR were not re-run here. In an earlier H100 run (different container, vLLM max batch 128), Qwen3-ASR-1.7B ran at 1,650× real time on FLEURS id test and Qwen3-ASR-0.6B at 810–1,597× across our test sets: faster than sea-asr-id + n-gram LM (389×), slower than greedy.
  • Speed with the LM: beam 128 (the shipped default), one beam-search worker (the v0.2.1 default; 4 workers change it by less than 1 %). The beam search runs on CPU. Long-form speed: see "Max accuracy (opt-in)" below.
  • LM settings (alpha 0.4, beta 1.5, beam 128) and the LM itself were chosen on FLEURS id validation only. The LM text has every sentence removed that equals or shares an 8-gram with a FLEURS, CV27 or GigaSpeech 2 test or dev reference; an LM built without that filter gives CV27 6.99 vs 7.00.
  • CV27 test clips and sentences were held out of all our training data. omniASR was trained on FLEURS and Common Voice (Meta, arXiv 2511.09690): its FLEURS and CV27 rows are not held-out scores.

Max accuracy (opt-in): 1B rescoring LM

With a 1B rescoring LM, on par with Whisper large-v3 (1.55B) on FLEURS and Common Voice, and better on GigaSpeech 2.

A second pass rescores the n-gram beam search's 32 best hypotheses with Sailor2-1B (Sea AI Lab, Apache-2.0). Weights of the scores were chosen on FLEURS id validation only. System: 364M acoustic model + 0.27 GB n-gram LM + 1B rescoring LM. Paired 95 % CI of the WER difference (ours + rescoring − Whisper large-v3): FLEURS +0.28 [−0.20, +0.74], CV27 −0.03 [−0.41, +0.36] (both: CI includes 0, on par), GigaSpeech 2 (video 45 excluded) −0.62 [−0.79, −0.45] (better).

WER %, and speed in × real time on one H100 80GB (sea_asr v0.2.1; Whisper on the same GPU type and container size, 32 vCPU):

Mode FLEURS CV27 GigaSpeech 2 Speed, FLEURS test (short clips) Speed, CV27 test (short clips) Speed, 79-min recording (long-form)
greedy 9.0 9.1 18.7 3,427 3,512 3,293 (1.4 s)
+ n-gram LM (default with lm=) 6.1 7.0 17.4 389 520 272 (17.5 s)
+ n-gram LM + Sailor2-1B rescoring 5.5 [5.0, 6.0] 6.3 [5.9, 6.7] 16.6 [16.3, 16.9] 229 261 149 (31.9 s)
Whisper large-v3 5.2 6.3 17.3 114 63 181 (26.3 s)
Whisper large-v3-turbo 5.8 7.2 18.0 171 113 351 (13.6 s)

Speed: whole transcribe() wall time, load and warm-up excluded; FLEURS test = 684 clips, 2.34 h; CV27 test = 3,711 clips, 4.27 h; long-form = one 79 min 10 s Indonesian parliament plenary recording, whole file per call. The beam search runs on CPU (one worker, the v0.2.1 default) and is most of the cost with the LM. On long-form audio + n-gram LM is slower than Whisper large-v3-turbo and + rescoring is slower than Whisper large-v3. Rescoring needs about 2 GB of extra GPU memory (bf16).

Error tail: CTC cannot loop (no autoregressive decoder); utterances with WER > 100 %: sea-asr-id 0 % on FLEURS, 0.08 % on CV27; Whisper large-v3 0.22 % on CV27.

Same-GPU setup: Whisper via faster-whisper 1.2.1 fp16, beam 5, Silero VAD, batch 16 (clips, or the batched long-form pipeline); ours 600 s of padded audio per forward pass. CAUTION: Whisper here spends part of its wall time on per-clip CPU work (Silero VAD + log-mel), and batch 16 is conservative for an H100. A Whisper setup tuned for throughput would narrow the gap.

Gemini is a closed benchmark row only; its outputs were not used for training (Gemini API terms).

Use

pip install "sea-asr[lm] @ git+https://github.com/PixelML/[email protected]"        # drop [lm] for greedy only
pip install "sea-asr[rescore] @ git+https://github.com/PixelML/[email protected]"   # opt-in max accuracy
from sea_asr import SeaASR, to_srt

asr = SeaASR.from_pretrained("PixelML/sea-asr-id")                            # greedy; device="cuda" or "cpu"
asr = SeaASR.from_pretrained("PixelML/sea-asr-id", lm="PixelML/sea-asr-id")   # + n-gram LM from lm/
asr = SeaASR.from_pretrained("PixelML/sea-asr-id", lm="PixelML/sea-asr-id",
                             rescore=True)                                     # + Sailor2-1B rescoring (opt-in)
print(asr.transcribe("clip.wav"))

out = asr.transcribe("newscast.wav", return_words=True)    # {"text", "words": [{"word", "start", "end"}]}
open("newscast.srt", "w").write(to_srt(out["words"]))
1
00:00:00,880 --> 00:00:04,120
tim tim virtual memiliki standar
keunggulan yang sama dengan tim

2
00:00:04,320 --> 00:00:10,320
konvensional tetapi ada sedikit
perbedaan segera setelah

Cues: at most 2 lines × 32 characters, at most 6 s. Input: 16 kHz mono (other rates are resampled). Inputs longer than 30 s are cut at quiet points; timestamps stay on the original timeline. CLI: python -m sea_asr --model PixelML/sea-asr-id --lm PixelML/sea-asr-id clip.wav --srt.

Limits

  • Lower case, no punctuation; caption-ready output needs a punctuation + casing restorer (next, on the EG2 text backbone).
  • The n-gram LM is built from Wikipedia: it helps most on read, formal speech. On casual speech the gain is smaller.
  • Machine labels from Qwen3-ASR-1.7B and Whisper large-v3: the model inherits their shared errors and does not beat them on read speech.
  • Code-switching to English and regional languages (Javanese, Sundanese) is not evaluated. Speaker, accent and gender balance are not measured.
  • Do not use for speaker identification or surveillance.

Training

YODAS id000 + id100, scored with an earlier model (CER ≤ 0.6), relabelled with Qwen3-ASR + Whisper consensus (keep where CER(qwen, whisper) ≤ 0.2, label = Qwen): 1,901 h of segments plus 386 h of 1–3 s clips, + Common Voice 27.0 train ×5 (41 h) + FLEURS train ×5 (45 h) = 2,373 h. Fine-tuned from the previous round on one NVIDIA DGX Spark (GB10); best checkpoint at step 2,000 on FLEURS validation. Labels: PixelML/sea-asr-id-data. Code and recipe: PixelML/sea-asr.

The round-1 data filter used a pilot model that saw CC BY-NC (WorldSpeech) audio. That model only scored data; no NC audio or labels entered training. WorldSpeech is used as a test set only.

The n-gram LM: KenLM 4-gram on Indonesian Wikipedia (dump 20231101, 10.3 M sentences, 156 M words after the test filter), pruned to 0.27 GB; build details in lm/manifest.json.

Roadmap: punctuation + casing head; Malay, Vietnamese, Thai.

Credits

  • Base encoder: Google DeepMind, EmbeddingGemma 2 (914f7f89)
  • Data: YODAS (ESPnet/CMU, 52c5a1b9); FLEURS (Google); CC-BY YouTube creators listed in ATTRIBUTION
  • Data (pins added for this release): FLEURS train (google/fleurs, 70bb2e84, CC-BY-4.0); Common Voice 27.0 Indonesian train (Mozilla, CC0, via Mozilla Data Collective); the creator list is ATTRIBUTION.tsv
  • Teachers: Qwen3-ASR-1.7B (Alibaba Qwen, 7278e1e7); Whisper large-v3 (OpenAI) via faster-whisper (SYSTRAN)
  • Language model text: Indonesian Wikipedia, Wikipedia contributors / Wikimedia Foundation (wikimedia/wikipedia 20231101.id, b04c8d1c, CC-BY-SA-3.0 + GFDL)
  • Language model tools: KenLM by Kenneth Heafield (kpu/kenlm 4cb443e6); pyctcdecode 0.5.0 (Kensho Technologies, kensho-technologies/pyctcdecode)
  • Rescoring LM (opt-in): Sailor2-1B, Sea AI Lab (sail/Sailor2-1B 75c2856f, Apache-2.0)
  • Test sets: GigaSpeechBench (SpeechColab); Common Voice 27.0 Indonesian test (Mozilla, CC0); WorldSpeech (disco-eth)
  • Test sets (this release): GigaSpeech 2 Indonesian test (SpeechColab, non-commercial terms, test only); FLEURS Indonesian test (same revision as above)
  • Recipe: Quan Nguyen (@qnguyen3), QUAN-Transcribe — https://github.com/qnguyen3/QUAN-Transcribe (4f45e02)

Licence

Model weights and code: Apache-2.0. Base encoder EmbeddingGemma 2 is Apache-2.0; deployments must adhere to the Gemma Prohibited Use Policy.

The n-gram LM in lm/ is derived from Wikipedia text and is licensed CC BY-SA 3.0 (see lm/LICENSE.md). If you ship or modify lm/, keep the attribution and share it under the same licence. Greedy decoding does not use lm/.

Configuration

Vocabulary size
34,612

Identity and Version

Repository
PixelML/sea-asr-id
Publisher
Pixel ML
Task
Speech recognition
Modality
Audio
Library
Not stated by the source
Parameters
112M parameters
Languages
id
Revision
90567734a716694f47982b00cfec80b454b7470a
First published
2026-10-17
Last updated
2026-10-20

Files and Weights

12 files, 731.3 MB in total. The weights are 2 files totalling 719.7 MB in bin, safetensors.

Weights2 files · 719.7 MB
Configuration4 files · 249.2 KB
Documentation3 files · 25.2 KB
Other2 files · 11.3 MB
Repository1 file · 1.5 KB
Every file
FileTypeSizeSHA-256
lm/id_4gram.binWeights272.3 MB 6ba55aaf96c0
model.safetensorsWeights447.4 MB d1f0d8fe5ee5
config.jsonConfiguration331 B —
lm/lm_config.jsonConfiguration87 B —
lm/manifest.jsonConfiguration971 B —
units.jsonConfiguration247.8 KB —
LICENSEDocumentation11.4 KB —
README.mdDocumentation12.9 KB —
lm/LICENSE.mdDocumentation944 B —
ATTRIBUTION.tsvOther6.9 MB —
lm/unigrams.txtOther4.4 MB —
.gitattributesRepository1.5 KB —

License and Download

License
apache-2.0
Access
Open weights, no gate
Download size
719.7 MB
Download from Pixel ML

Released by Pixel ML through its official repository on Hugging Face. Read the license.

Built From

  • Derived from google/embeddinggemma-2

Memory Requirements

PrecisionWeights in memory
As published719.7 MB
16-bit0.2 GB
8-bit0.1 GB
4-bit0.1 GB

Weights only, from the published parameter count; the key-value cache and runtime add to this.

Questions About sea-asr-id

How much GPU memory does sea-asr-id need?

About 0.3 GB at 16-bit and 0.1 GB at 4-bit: the weights (112M parameters) plus a working margin. A long context needs more.

What is the cheapest GPU to run sea-asr-id on?

At 16-bit, 1x MI300X from $1.85 an hour; at 4-bit, 1x MI300X from $1.85 an hour, at the lowest on-demand prices the SAVRN Index lists.

Can I use sea-asr-id commercially?

Yes. sea-asr-id is released under Apache License 2.0. The Apache License 2.0 is a permissive open-source license. It permits commercial use, modification and redistribution. It requires keeping the license and copyright notices and any NOTICE file, stating significant changes, and it includes an express patent grant from contributors.

Similar Models

Model · Speech recognition

wav2vec2-base-960h

AI at Meta

The base model pretrained and fine-tuned on 960 hours of Librispeech on 16kHz sampled speech audio. When using the model make sure that your speech input is also sampled at 16Khz. Authors: Alexei Baevski, Henry Zhou, Abdelrahman Mohamed, Michael Auli Abstract We show for the first time that learning powerful representations from speech audio alone followed by fine-tuning on transcribed speech can outperform the best semi-supervised methods while being conceptually simpler. wav2vec 2.0 masks the speech input in the latent space and solves a contrastive task defined over a quantization of the latent representations which are jointly learned. Experiments using all labeled data of Librispeech…

Open weights apache-2.0 94M parameters transformers

Model · Speech recognition

wav2vec2-base-960h

JC

The base model pretrained and fine-tuned on 960 hours of Librispeech on 16kHz sampled speech audio. When using the model make sure that your speech input is also sampled at 16Khz. Authors: Alexei Baevski, Henry Zhou, Abdelrahman Mohamed, Michael Auli Abstract We show for the first time that learning powerful representations from speech audio alone followed by fine-tuning on transcribed speech can outperform the best semi-supervised methods while being conceptually simpler. wav2vec 2.0 masks the speech input in the latent space and solves a contrastive task defined over a quantization of the latent representations which are jointly learned. Experiments using all labeled data of Librispeech…

Open weights apache-2.0 94M parameters

Model · Speech recognition

whisper-base

OpenAI

Whisper is a pre-trained model for automatic speech recognition (ASR) and speech translation. Trained on 680k hours of labelled data, Whisper models demonstrate a strong ability to generalise to many datasets and domains without the need for fine-tuning. Whisper was proposed in the paper Robust Speech Recognition via Large-Scale Weak Supervision by Alec Radford et al from OpenAI. The original code repository can be found here. Disclaimer: Content for this model card has partly been written by the Hugging Face team, and parts of it were copied and pasted from the original model card. Whisper is a Transformer based encoder-decoder model, also referred to as a sequence-to-sequence model. It…

Open weights apache-2.0 73M parameters transformers