Downloads · 30 days
98
15% of all-time downloads
moonshine-ai/moonshine-streaming-small-ja
moonshine-streaming-small-ja is a automatic speech recognition model from moonshine-ai. Use it when you need speech turned into text. It is set up for transformers. The card lists the license as mit.
Japanese streaming speech recognition, 112.9M parameters. Same architecture as moonshine-ai/moonshine-streaming-small, trained for Japanese with a 12,288-entry Japanese tokenizer. The Tiny model is
Downloads · 30 days
98
15% of all-time downloads
All-time downloads
644
Public
Parameters
113M
452 MB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors452 MB · 100%
From the Hugging Face model README
Japanese streaming speech recognition, 112.9M parameters. Same architecture as moonshine-ai/moonshine-streaming-small, trained for Japanese with a 12,288-entry Japanese tokenizer. The Tiny model is a quarter of the size and about 2.5 CER worse.
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 | ja12k_small_stageB_best.safetensors |
| Stage | B |
| Architecture | spindlier_prime_adapted |
| Tokenizer | tokenizer_ja12k.json, vocab 12,288 |
| Snapshot taken | 2026-08-23 |
| Parameters | 112.9M |
pip install --upgrade transformers datasets[audio]
from transformers import MoonshineStreamingForConditionalGeneration, AutoProcessor
import torch
model = MoonshineStreamingForConditionalGeneration.from_pretrained(
"moonshine-ai/moonshine-streaming-small-ja"
).eval()
processor = AutoProcessor.from_pretrained("moonshine-ai/moonshine-streaming-small-ja")
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 | 10 layers, width 620, 8 heads, sliding windows (16, 4) on the first two and last two layers and (16, 0) between |
| Decoder | 10 layers, width 512, 8 heads, RoPE over 32 of each head's 64 dimensions |
| Frontend | 50 Hz features, CMVN, asinh compression, two causal stride-2 convolutions |
| Adapter | learned absolute positional embeddings, then a projection from 620 to 512 |
The lookahead layers give roughly 80 ms of lookahead; the intermediate layers have none.
Trained on a large-scale automatically labeled Japanese corpus:
These 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, and its transcription conventions for a language written without spaces. No human-verified transcript was used for the bulk of training.
Japanese is scored on character error rate with spaces removed
(cer_nospace), never WER. Japanese is written without spaces, so tokenization
differences alone can read as several hundred percent WER while the characters
are correct.
suite_ja is FLEURS Japanese (650 utterances) and ReazonSpeech Japanese (5,263).
| Panel | CER |
|---|---|
| macro | 16.765 |
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 by more than a point on spontaneous speech.
| Panel | CER |
|---|---|
fleurs_ja | 7.99 |
reazonspeech_ja | 26.31 |
| macro | 17.15 |
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.
fleurs_ja | reazonspeech_ja | macro | |
|---|---|---|---|
| Training checkpoint | 7.99 | 26.31 | 17.153 |
| This repository | 7.90 | 26.69 | 17.295 |
397/400 and 383/400 transcripts are byte-identical, and excluding the handful of utterances where either side ran away the macro gap is 0.054. The residual comes from the frontend's 80-sample frame alignment, which this path pads and the training path does not.
Not intended for non-consensual surveillance, speaker identification, or high-stakes decisions.
MIT.