CoolFace
Modelpublic

h-gajdov/full_moonshine_tiny_wup1_ep3_lr1e-4

sourceHugging Faceupdated 11d agoView on Hugging Face
0likes7kdownloads
Model Card

fullmoonshinetinywup1ep3_lr1e-4

Full fine-tune of UsefulSensors/moonshine-tiny (27.1M parameters) for Macedonian speech-to-text, trained on the vezilka-asri collection.

Moonshine is a raw-waveform encoder-decoder: it takes input_values rather than Whisper's fixed 30 s log-mel window, so its cost scales with actual audio length instead of being flat per clip. That is what makes it viable on-device, and it is why its real-time factor barely moves with utterance length where Whisper's does.

Evaluation

Held-out test set rachno_provereno_od_yt (44 clips, 0.32 h), cuda, batch 16, 1 beam.

metricvalue
WER14.24
CER6.42
SER100.00
Parameters27.1 M
Latency72 ms/utterance
Throughput368x real-time
RTF0.00272

SER is exact-match over whole utterances. These test clips average 62 words, so at this WER an exactly-correct utterance is vanishingly unlikely -- read WER/CER.

Best WER seen during training (on the same held-out set): 13.73 at step 179000.

Compared with the other runs

[image]

Compared with Whisper

[image]

The full table across every model evaluated is in comparison.md.

Training

settingvalue
learning rate0.0001
warmup ratio0.01
epochs3
batch size32 x 1 accum
schedulercosine
weight decay0.01
precisionbf16
total steps277794

Usage

python
from transformers import AutoProcessor, AutoModelForSpeechSeq2Seq
import librosa, torch

model_id = "h-gajdov/full_moonshine_tiny_wup1_ep3_lr1e-4"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id).eval()

wav, _ = librosa.load("clip.wav", sr=16000, mono=True)
feats = processor.feature_extractor([wav], sampling_rate=16000,
                                    return_tensors="pt", padding=True)
with torch.no_grad():
    ids = model.generate(**feats, max_length=192)
print(processor.batch_decode(ids, skip_special_tokens=True)[0])

max_length is capped at 192 because the decoder has 194 positions (max_position_embeddings). Moonshine has no forced language/task tokens, so do not pass language= or task= to generate() -- it will raise.