Model reference · open weights

moonshine-streaming-tiny-es

Audio moonshine-ai Speech→text 1 build Open weights 892 dl/mo

moonshine-streaming-tiny-es is an open-weight audio or speech model from moonshine-ai. moonshine-streaming-tiny-es (FP32) weighs 54 MB; the smallest configuration that runs it is RTX 3060 12 GB.

For self-hosting, compare this build's requirements below with the GPU you plan to rent.

  • moonshine-streaming-tiny-es is a 27M parameter automatic speech recognition model by moonshine-ai designed for Spanish.
  • It uses a streaming architecture with a 4096 token context length and is licensed under MIT.
  • The model is intended for on-device use on edge-class hardware.

Summary of the moonshine-ai/moonshine-streaming-tiny-es model card, 2026-10-01

What it is

Released bymoonshine-ai
Released2026-08-24
Parameters27M
VRAM54 MB for the weights

What it runs on

Memory and cards for moonshine-streaming-tiny-es (FP32)

54 MBweights, file size
1.6 GBruntime overhead
CardOne streamMemory
RTX 3060 12 GBfits11.6 GB
RTX 4060 Ti 16 GBfits15.4 GB
RTX 3090 24 GBfits23.4 GB
RTX 4090 24 GBfits23.4 GB
RTX 5090 32 GBfits31.0 GB
L40S 48 GBfits44.0 GB
A100 80 GBfits78.2 GB
H100 80 GBfits78.1 GB
RTX PRO 6000 Blackwell 96 GBfits93.8 GB
DGX Spark (GB10) 128 GB unifiedfits107 GB
H200 141 GBfits138 GB
B200 180 GBfits176 GB

From the model card

What moonshine-ai says about moonshine-streaming-tiny-es

Read the model card

Spanish streaming speech recognition, 27.0M parameters. Same architecture as moonshine-ai/moonshine-streaming-tiny, trained for Spanish with a 12,288-entry Spanish tokenizer. The [Small model](https://huggingface.co/moonshine-ai/moonshine-streaming- small-es) is four times the size.

Moonshine Streaming pairs a 50 Hz time-domain audio frontend with a sliding-window Transformer encoder, so it transcribes incrementally rather than waiting for an utterance to finish. It is intended for on-device use on edge-class hardware.

Checkpoint identity

This repository is a conversion of one specific training checkpoint, recorded here because the weights behind a language move as later stages win:

Checkpointes12k_stagec_v2_best_macro6.175.safetensors
StageC (read-speech mix)
Architectureslinkier_prime_adapted
Tokenizertokenizer_es12k.json, vocab 12,288
Snapshot taken2026-08-24
Parameters27.0M

If you need reproducibility, pin the revision of this repository rather than tracking main.

Usage

pip install --upgrade transformers datasets[audio]
from transformers import MoonshineStreamingForConditionalGeneration, AutoProcessor
import torch

model = MoonshineStreamingForConditionalGeneration.from_pretrained(
    "moonshine-ai/moonshine-streaming-tiny-es"
).eval()
processor = AutoProcessor.from_pretrained("moonshine-ai/moonshine-streaming-tiny-es")

inputs = processor(audio, return_tensors="pt", sampling_rate=16000)

# Cap the output length. Like other seq2seq ASR models this one can fall into a
# repetition loop, and short or noisy clips are where it happens.
seq_lens = inputs.attention_mask.sum(dim=-1)
max_new_tokens = int((seq_lens * 6.5 / 16000).max().item()) + 2

generated = model.generate(**inputs, max_new_tokens=max_new_tokens)
print(processor.batch_decode(generated, skip_special_tokens=True)[0])

Pass the attention_mask. The encoder applies its per-layer sliding windows only when it is given one; called without a mask it attends over the whole utterance instead, which is a different model from the one that was trained. The processor returns the mask, so the snippet above is the safe form. The processor also pads audio to a whole number of 80-sample frames, which the frontend requires.

Architecture

Encoder6 layers, width 320, 8 heads, sliding windows (16, 4) on the first two and last two layers and (16, 0) between
Decoder6 layers, width 320, 8 heads, RoPE over 32 of each head's 40 dimensions
Frontend50 Hz features, CMVN, asinh compression, two causal stride-2 convolutions
Adapterlearned absolute positional embeddings before the decoder

The lookahead layers give roughly 80 ms of lookahead; the intermediate layers have none.

Training data

Trained on a large-scale automatically labeled Spanish corpus, plus a much smaller human-labeled read-speech set:

  • Crawled corpus, roughly 160,000 hours, pseudo-labeled and unaudited.
  • Track A read speech, roughly 1,700 hours, human-transcribed (Multilingual LibriSpeech, Common Voice, LibriVox, VoxPopuli, FLEURS and OpenSLR Argentinian/Chilean/Colombian sets).

The crawled transcripts are pseudo-labels: they were produced by running a Whisper-family teacher model over crawled audio, not by human transcription. The model therefore inherits the teacher's error modes, including its handling of proper nouns, numerals and code-switching. No human-verified transcript was used for the bulk of training.

Evaluation

Spanish is scored on word error rate (WER), after the usual case and punctuation normalization. Mandarin and Japanese in this model family are instead scored on no-space CER, because they are written without spaces; every other language, this one included, uses WER.

suite_es is FLEURS Spanish and Multilingual LibriSpeech Spanish. Both are read speech. The Multilingual LibriSpeech panel is European Spanish audiobooks; the model is not measured here on Latin American spontaneous speech.

Seeded 400-utterance sample, batch 1

Batch 1 is the honest number for deployment. Batched evaluation zero-pads short clips up to the longest in the batch, and that trailing silence flatters the model.

PanelWER
fleurs_es6.34
mls_es5.89
macro6.111

This repository against the training checkpoint

These weights were converted from the neo training checkpoint, and the conversion was checked by measurement rather than inspection: same seeded sample, same batch size, same normalizer. A conversion that loads and emits plausible text can still have a permuted weight mapping, which only a score catches.

fleurs_esmls_esmacro
Training checkpoint6.345.896.111
Same checkpoint, same stopping rule6.345.505.919
This repository6.345.505.919

400/400 and 398/400 transcripts are byte-identical.

The middle row is the comparison that matters. neo's decoder also stops when it sees a repeating token pattern, and transformers does not, so the top row is measured under a different stopping rule than this repository can use. Rescoring the checkpoint without that heuristic gives 5.919 against this repository's 5.919: the same number to three decimals. The gap in the top row is that heuristic, not the conversion.

The quantized build we ship

The .ort package served to the Moonshine deployment library is quantized to int8 from these same weights, and scores 6.218 against 5.919 for the float checkpoint on the same sample under the same stopping rule -- a difference of +0.299, which is inside the noise of a 400-clip sample and should not be read as the quantized build being better or worse. That build is a different artifact from this repository, which is float32.

Limitations

  • **Machine-labeled training

Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.

© 2026 AxForge · EU-hosted AI infrastructure Pricing Docs Trust Privacy Terms