Model reference · open weights
moonshine-streaming-tiny-es is an open-weight audio or speech model from moonshine-ai. AxForge deploys and operates it for you on dedicated EU-owned hardware — with the licence handled where one is required.
Available as managed deployment — configured and operated for you on dedicated EU hardware, quoted per deployment.
What it is
| Released by | moonshine-ai |
|---|---|
| Type | Audio & music |
| Task | Speech→text |
| Parameters (lead) | 27M |
| Context | 4k tokens |
| Runs with | transformers |
| Released | 2026-08-24 |
| Popularity | 892 downloads / month |
| Licence | Open weights |
About
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.
This repository is a conversion of one specific training checkpoint, recorded here because the weights behind a language move as later stages win:
| Checkpoint | es12k_stagec_v2_best_macro6.175.safetensors |
| Stage | C (read-speech mix) |
| Architecture | slinkier_prime_adapted |
| Tokenizer | tokenizer_es12k.json, vocab 12,288 |
| Snapshot taken | 2026-08-24 |
| Parameters | 27.0M |
If you need reproducibility, pin the revision of this repository rather than
tracking main.
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.
| Encoder | 6 layers, width 320, 8 heads, sliding windows (16, 4) on the first two and last two layers and (16, 0) between |
| Decoder | 6 layers, width 320, 8 heads, RoPE over 32 of each head's 40 dimensions |
| Frontend | 50 Hz features, CMVN, asinh compression, two causal stride-2 convolutions |
| Adapter | learned absolute positional embeddings before the decoder |
The lookahead layers give roughly 80 ms of lookahead; the intermediate layers have none.
Trained on a large-scale automatically labeled Spanish corpus, plus a much smaller human-labeled read-speech set:
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.
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.
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.
| Panel | WER |
|---|---|
fleurs_es | 6.34 |
mls_es | 5.89 |
| macro | 6.111 |
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_es | mls_es | macro | |
|---|---|---|---|
| Training checkpoint | 6.34 | 5.89 | 6.111 |
| Same checkpoint, same stopping rule | 6.34 | 5.50 | 5.919 |
| This repository | 6.34 | 5.50 | 5.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 .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.
From the published model card. Full card on the HuggingFace links in the sidebar.
Using it via the API
Once AxForge deploys moonshine-streaming-tiny-es for you, it answers on the OpenAI-compatible API — the same base URL and keys as every other model. (moonshine-streaming-tiny-es below is illustrative; you get the exact model name on deployment.)
$ curl -sS https://api.axforge.ai/v1/audio/transcriptions \ -H "Authorization: Bearer $AXFORGE_API_KEY" \ -F model="moonshine-streaming-tiny-es" -F file=@audio.mp3
Create an account — your API key is available in the console. 3M free tokens every 30 days with every new account.