Whisper base speech-to-text (encoder + decoder, transformers.js)

models.skillsafe.ai/whisper-base-fp16@1846881b/

Vetted New WebGPU

Automatic speech recognition model for transformers.js (fp16). Runs on WebGPU or WASM — 139 MB downloaded once from models.skillsafe.ai, then cached for every SkillSafe app that uses it. Inference happens on your device; nothing you enter is uploaded to load it, and it never costs a credit. Weights from Hugging Face · skillsafe-ai/whisper-base, pinned at b30f42230425 — also loadable straight from Hugging Face outside SkillSafe (how).

Share

Details

Catalogue idwhisper-base-fp16@1846881b
Runtimetransformers.js ≥ 3.0.0
DeviceWebGPU, WASM
Variantfp16
Download139 MB · 2 files
LicenceApache-2.0 · notice
Pinned atb30f4223042550e28eb88d8ac79e76d880457ae9
ApprovedSep 22, 2026
Statusactive — every file is a live vetted hash

Files

Each file is served at an immutable URL; the canonical form is the SHA-256 itself. Tokenizer and config JSON are not here by design — they ship in your app bundle.

PathFormatSizeSHA-256
onnx/decoder_model_merged_fp16.onnx onnx 99.9 MB 2078fb08b753…fd71a4
onnx/encoder_model_fp16.onnx onnx 39.4 MB ffba51b20185…1a5369

Signature

Graph inputs and outputs read from the ONNX bytes at vetting — the tensor names your session.run() call feeds and reads. Symbolic dimensions are shown by name.

onnx/decoder_model_merged_fp16.onnx

Inputs

  • input_ids int64 [batch_size, decoder_sequence_length]
  • encoder_hidden_states float32 [batch_size, encoder_sequence_length / 2, 512]
  • past_key_values.0.decoder.key float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.0.decoder.value float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.0.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • past_key_values.0.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • past_key_values.1.decoder.key float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.1.decoder.value float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.1.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • past_key_values.1.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • past_key_values.2.decoder.key float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.2.decoder.value float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.2.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • past_key_values.2.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • past_key_values.3.decoder.key float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.3.decoder.value float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.3.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • past_key_values.3.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • past_key_values.4.decoder.key float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.4.decoder.value float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.4.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • past_key_values.4.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • past_key_values.5.decoder.key float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.5.decoder.value float32 [batch_size, 8, past_decoder_sequence_length, 64]
  • past_key_values.5.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • past_key_values.5.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • use_cache_branch bool [1]

Outputs

  • logits float32 [batch_size, decoder_sequence_length, 51865]
  • present.0.decoder.key float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.0.decoder.value float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.0.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • present.0.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • present.1.decoder.key float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.1.decoder.value float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.1.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • present.1.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • present.2.decoder.key float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.2.decoder.value float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.2.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • present.2.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • present.3.decoder.key float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.3.decoder.value float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.3.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • present.3.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • present.4.decoder.key float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.4.decoder.value float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.4.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • present.4.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • present.5.decoder.key float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.5.decoder.value float32 [batch_size, 8, past_decoder_sequence_length + 1, 64]
  • present.5.encoder.key float32 [batch_size, 8, encoder_sequence_length_out, 64]
  • present.5.encoder.value float32 [batch_size, 8, encoder_sequence_length_out, 64]

onnx/encoder_model_fp16.onnx

Inputs

  • input_features float32 [batch_size, feature_size, encoder_sequence_length]

Outputs

  • last_hidden_state float32 [batch_size, 1500, 512]
Use it in an app declaration · SDK loader · transformers.js · URLs · Hugging Face — generated from this entry

Add to the body of POST /v1/apps/{slug}/releases (or a release session). An unknown or withdrawn model is refused with a 400 naming it; the app page then shows "downloads 139 MB · runs on your device" and /models.txt carries the attribution.

{
  "models": [
    {
      "id": "whisper-base-fp16",
      "revision": "1846881b"
    }
  ]
}

Evaluation

onnx.checker + onnxruntime CPU smoke run with zero-filled inputs at the declared shapes; per-file SHA-256 pinned to the source; ONNX output vs the PyTorch model from the same commit on real text (import.parity) — imported as published upstream, then checked. Evaluated Sep 22, 2026.

Parity against transformers WhisperModel from openai/whisper-base@e37978b90ca9, fp32 · last_hidden_state

fileprecisionmax absmean abscosine / PSNR
onnx/encoder_model.onnxfp328.7e-44.4e-61.000000
onnx/encoder_model_fp16.onnxfp160.2311.2e-30.999999

Runs under onnxruntime

Zero-filled inputs at the declared shapes, CPU execution provider on the converter host; the check is that the graph loads, runs, and emits the declared output shapes.

  • onnx/decoder_model_merged.onnx: input_ids[1,4], encoder_hidden_states[1,1500,512], past_key_values.0.decoder.key[1,8,1,64], past_key_values.0.decoder.value[1,8,1,64], past_key_values.0.encoder.key[1,8,1500,64], past_key_values.0.encoder.value[1,8,1500,64], past_key_values.1.decoder.key[1,8,1,64], past_key_values.1.decoder.value[1,8,1,64], past_key_values.1.encoder.key[1,8,1500,64], past_key_values.1.encoder.value[1,8,1500,64], past_key_values.2.decoder.key[1,8,1,64], past_key_values.2.decoder.value[1,8,1,64], past_key_values.2.encoder.key[1,8,1500,64], past_key_values.2.encoder.value[1,8,1500,64], past_key_values.3.decoder.key[1,8,1,64], past_key_values.3.decoder.value[1,8,1,64], past_key_values.3.encoder.key[1,8,1500,64], past_key_values.3.encoder.value[1,8,1500,64], past_key_values.4.decoder.key[1,8,1,64], past_key_values.4.decoder.value[1,8,1,64], past_key_values.4.encoder.key[1,8,1500,64], past_key_values.4.encoder.value[1,8,1500,64], past_key_values.5.decoder.key[1,8,1,64], past_key_values.5.decoder.value[1,8,1,64], past_key_values.5.encoder.key[1,8,1500,64], past_key_values.5.encoder.value[1,8,1500,64], use_cache_branch[1] → logits[1,4,51865], present.0.decoder.key[1,8,4,64], present.0.decoder.value[1,8,4,64], present.0.encoder.key[1,8,1500,64], present.0.encoder.value[1,8,1500,64], present.1.decoder.key[1,8,4,64], present.1.decoder.value[1,8,4,64], present.1.encoder.key[1,8,1500,64], present.1.encoder.value[1,8,1500,64], present.2.decoder.key[1,8,4,64], present.2.decoder.value[1,8,4,64], present.2.encoder.key[1,8,1500,64], present.2.encoder.value[1,8,1500,64], present.3.decoder.key[1,8,4,64], present.3.decoder.value[1,8,4,64], present.3.encoder.key[1,8,1500,64], present.3.encoder.value[1,8,1500,64], present.4.decoder.key[1,8,4,64], present.4.decoder.value[1,8,4,64], present.4.encoder.key[1,8,1500,64], present.4.encoder.value[1,8,1500,64], present.5.decoder.key[1,8,4,64], present.5.decoder.value[1,8,4,64], present.5.encoder.key[1,8,1500,64], present.5.encoder.value[1,8,1500,64] 9.9 ms
  • onnx/decoder_model_merged_fp16.onnx: input_ids[1,4], encoder_hidden_states[1,1500,512], past_key_values.0.decoder.key[1,8,1,64], past_key_values.0.decoder.value[1,8,1,64], past_key_values.0.encoder.key[1,8,1500,64], past_key_values.0.encoder.value[1,8,1500,64], past_key_values.1.decoder.key[1,8,1,64], past_key_values.1.decoder.value[1,8,1,64], past_key_values.1.encoder.key[1,8,1500,64], past_key_values.1.encoder.value[1,8,1500,64], past_key_values.2.decoder.key[1,8,1,64], past_key_values.2.decoder.value[1,8,1,64], past_key_values.2.encoder.key[1,8,1500,64], past_key_values.2.encoder.value[1,8,1500,64], past_key_values.3.decoder.key[1,8,1,64], past_key_values.3.decoder.value[1,8,1,64], past_key_values.3.encoder.key[1,8,1500,64], past_key_values.3.encoder.value[1,8,1500,64], past_key_values.4.decoder.key[1,8,1,64], past_key_values.4.decoder.value[1,8,1,64], past_key_values.4.encoder.key[1,8,1500,64], past_key_values.4.encoder.value[1,8,1500,64], past_key_values.5.decoder.key[1,8,1,64], past_key_values.5.decoder.value[1,8,1,64], past_key_values.5.encoder.key[1,8,1500,64], past_key_values.5.encoder.value[1,8,1500,64], use_cache_branch[1] → logits[1,4,51865], present.0.decoder.key[1,8,4,64], present.0.decoder.value[1,8,4,64], present.0.encoder.key[1,8,1500,64], present.0.encoder.value[1,8,1500,64], present.1.decoder.key[1,8,4,64], present.1.decoder.value[1,8,4,64], present.1.encoder.key[1,8,1500,64], present.1.encoder.value[1,8,1500,64], present.2.decoder.key[1,8,4,64], present.2.decoder.value[1,8,4,64], present.2.encoder.key[1,8,1500,64], present.2.encoder.value[1,8,1500,64], present.3.decoder.key[1,8,4,64], present.3.decoder.value[1,8,4,64], present.3.encoder.key[1,8,1500,64], present.3.encoder.value[1,8,1500,64], present.4.decoder.key[1,8,4,64], present.4.decoder.value[1,8,4,64], present.4.encoder.key[1,8,1500,64], present.4.encoder.value[1,8,1500,64], present.5.decoder.key[1,8,4,64], present.5.decoder.value[1,8,4,64], present.5.encoder.key[1,8,1500,64], present.5.encoder.value[1,8,1500,64] 18.5 ms
  • onnx/decoder_model_merged_quantized.onnx: input_ids[1,4], encoder_hidden_states[1,1500,512], past_key_values.0.decoder.key[1,8,1,64], past_key_values.0.decoder.value[1,8,1,64], past_key_values.0.encoder.key[1,8,1500,64], past_key_values.0.encoder.value[1,8,1500,64], past_key_values.1.decoder.key[1,8,1,64], past_key_values.1.decoder.value[1,8,1,64], past_key_values.1.encoder.key[1,8,1500,64], past_key_values.1.encoder.value[1,8,1500,64], past_key_values.2.decoder.key[1,8,1,64], past_key_values.2.decoder.value[1,8,1,64], past_key_values.2.encoder.key[1,8,1500,64], past_key_values.2.encoder.value[1,8,1500,64], past_key_values.3.decoder.key[1,8,1,64], past_key_values.3.decoder.value[1,8,1,64], past_key_values.3.encoder.key[1,8,1500,64], past_key_values.3.encoder.value[1,8,1500,64], past_key_values.4.decoder.key[1,8,1,64], past_key_values.4.decoder.value[1,8,1,64], past_key_values.4.encoder.key[1,8,1500,64], past_key_values.4.encoder.value[1,8,1500,64], past_key_values.5.decoder.key[1,8,1,64], past_key_values.5.decoder.value[1,8,1,64], past_key_values.5.encoder.key[1,8,1500,64], past_key_values.5.encoder.value[1,8,1500,64], use_cache_branch[1] → logits[1,4,51865], present.0.decoder.key[1,8,4,64], present.0.decoder.value[1,8,4,64], present.0.encoder.key[1,8,1500,64], present.0.encoder.value[1,8,1500,64], present.1.decoder.key[1,8,4,64], present.1.decoder.value[1,8,4,64], present.1.encoder.key[1,8,1500,64], present.1.encoder.value[1,8,1500,64], present.2.decoder.key[1,8,4,64], present.2.decoder.value[1,8,4,64], present.2.encoder.key[1,8,1500,64], present.2.encoder.value[1,8,1500,64], present.3.decoder.key[1,8,4,64], present.3.decoder.value[1,8,4,64], present.3.encoder.key[1,8,1500,64], present.3.encoder.value[1,8,1500,64], present.4.decoder.key[1,8,4,64], present.4.decoder.value[1,8,4,64], present.4.encoder.key[1,8,1500,64], present.4.encoder.value[1,8,1500,64], present.5.decoder.key[1,8,4,64], present.5.decoder.value[1,8,4,64], present.5.encoder.key[1,8,1500,64], present.5.encoder.value[1,8,1500,64] 8.9 ms
  • onnx/encoder_model.onnx: input_features[1,80,3000] → last_hidden_state[1,1500,512] 71.7 ms
  • onnx/encoder_model_fp16.onnx: input_features[1,80,3000] → last_hidden_state[1,1500,512] 110.2 ms

Toolchain: python 3.12.13 · platform Darwin 25.6.0 arm64 · torch 2.10.0 · onnx 1.23.0 · onnxruntime 1.30.0. Recipe models/recipes/whisper-base.yaml (7b6e7e83a7b4). Full manifest.json

Licence & attribution

Apache-2.0 · licence text · notice

Whisper base: Copyright 2022 OpenAI, Apache License 2.0 (https://github.com/openai/whisper); ONNX export by onnx-community (https://huggingface.co/onnx-community/whisper-base).

Apps that declare this model get this text in their generated /models.txt, so a licence that requires a notice always carries one.

Every file here was approved by exact SHA-256 after a structural audit of the graph, fetched from a content-pinned source, and is served credential-free at an immutable URL. The SDK re-verifies the hash on your device before it caches or returns anything. Missing a variant? Request it — or read how the registry works.