PsarAI-S2S-ASR-GGUF
The speech recognizer of nphearum/PsarAI-S2S on its own, as GGUF for audio.cpp: Khmer, English, French and mixed Khmer–English / Khmer–French speech in one model, with word timestamps and subtitle-sized segments.
PsarAI-S2S-GGUF holds the same recognizer together with the text-to-speech model in one file. Apps that give each model a single task (Unsloth Studio lists that file as a speech model only) can use this repo for transcription.
| File | Type | Size | Mixed held-out CER | Use |
|---|---|---|---|---|
psarai-s2s-asr-f16.gguf |
F16 | 1.93 GB | – | reference weights |
psarai-s2s-asr-q8_0.gguf |
Q8_0 | 1.04 GB | 2.19% | recommended |
Each GGUF embeds its config.json, vocab.json (158 tokens: Khmer, Latin with French accents, word delimiter)
and the audio.cpp model spec (family mms_asr).
These files need audio.cpp with the
mms_asrfamily. It is not in released audio.cpp yet (proposed upstream). Until it is merged, build audio.cpp withaudiocpp/mms_asr.patchfrom this repository. Stock audio.cpp and the prebuilt shipped with Unsloth Studio cannot load them. These are not llama.cpp GGUFs.
Accuracy
Content CER (letters and marks; spaces, punctuation and case ignored), greedy CTC, no language model:
| Test set | Clips | CER |
|---|---|---|
| Mixed held-out: Khmer + English (synthetic voice) | 100 | 2.18% |
| Mixed held-out: Khmer + French (synthetic voice) | 100 | 2.56% |
| Mixed held-out: joined Khmer + French clips | 100 | 1.88% |
| Mixed held-out, all | 300 | 2.19% |
| FLEURS Khmer test | 100 | 12.44% |
| FLEURS English test | 100 | 5.08% |
| FLEURS French test | 100 | 5.01% |
The mixed rows were measured with psarai-s2s-asr-q8_0.gguf through audiocpp_server; the transformers model
scores the same 2.19% on those 300 clips. The FLEURS rows are the transformers model (fp32). For comparison,
PsarAI-ASR-1B (Khmer/English only) scores 14.09% on the
mixed held-out set (21.3% on Khmer + French) and 8.20% on FLEURS French.
Timestamps and segments
/v1/audio/transcriptions/details returns, besides text:
words: each word withstart_sample/end_sample(input sample rate insample_rate). Words are split at spaces, so for Khmer, written without spaces, a "word" is a phrase. A word ends at its last letter; a trailing,or.(which CTC emits after the pause) does not stretch it over the pause.segments: subtitle-sized lines. A segment ends after. ? ! ។ ៕, after, ; : ៖or a 0.3 s pause once it is 1.5 s long, after a 0.6 s pause, and never runs past 6 s.
Build audio.cpp with mms_asr
The patch applies to upstream commit 50749561 (audio.cpp v0.9.2):
git clone https://github.com/0xShug0/audio.cpp.git && cd audio.cpp
git checkout 507495611b22dc4590e0e5609e05e8096384e33f
git apply --3way /path/to/mms_asr.patch
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DENGINE_ENABLE_CUDA=ON \
-DAUDIOCPP_MODEL_SET=custom -DAUDIOCPP_MODELS=mms_asr # or the full model set
cmake --build build --target audiocpp_cli audiocpp_server -j
With CUDA 12.x, use a host compiler it supports (for example CC=gcc-13 CXX=g++-13 -DCMAKE_CUDA_HOST_COMPILER=g++-13).
Run
./build/bin/audiocpp_cli --task asr --family mms_asr \
--model psarai-s2s-asr-q8_0.gguf --backend cuda --audio speech.wav
Any sample rate or channel count is accepted (resampled to 16 kHz mono). Audio longer than ~32 s is decoded in 30 s windows with 2 s context. The output is lowercase; numbers may come out as digits.
SHA-256: F16 944a15f6…b483, Q8_0 6c91d71f…1435, audiocpp/mms_asr.patch 78a3a72c…a68a.
License
The model weights are CC-BY-NC-4.0 (non-commercial), following the base model
facebook/mms-1b-all; see the
PsarAI-S2S model card for data and credits. audiocpp/mms_asr.patch
modifies audio.cpp (Apache-2.0, Copyright 2026 ShugoAI LLC) and is provided under the same Apache-2.0 license.
- Downloads last month
- 51
8-bit
16-bit