CoolFace
Modelpublic

desert-ant-labs/voz

sourceHugging Faceotherupdated 18h agoView on Hugging Face
40likes126downloads
Model Card

<!-- card-header:start (generated from manifest.json, edit below this block) -->

Voz

Transcribe 10 minutes in 2 seconds.

On-device speech recognition: transcripts with word-level timestamps, 25 languages.

  • SDKs, install and examples: https://github.com/Desert-Ant-Labs/desert-ant-core/blob/main/docs/models/voz.md

<!-- card-header:end -->

Transcribes speech to text with word-level timestamps, in 25 languages, with the whole graph resident on the Neural Engine. Half an hour of audio takes about seven seconds on an M3 Ultra, and peak memory does not grow with the length of the recording.

"We made the bet to build for iOS" - each word with a start and an end, so a range is enough to cut on.

Try it

Ships as an Apple SwiftPM package: [Desert-Ant-Labs/desert-ant-core](https://github.com/Desert-Ant-Labs/desert-ant-core).

  • iOS / iPadOS / Mac Catalyst / macOS / tvOS / visionOS: the Swift SDK (Swift Package Manager). The models below are downloaded on demand and cached, so nothing is bundled into your app.
  • Apple-only. The SDK drives Core ML directly to keep the graph on the Neural Engine, which has no equivalent on the other backends.
swift
let voz = try await Voz()
let result = try await voz.transcribe(url)
result.text                       // "We made the bet to build for iOS..."
result.words.first?.start         // 0.32
result.words.first?.end           // 0.58

Files

FileWhat it is
encoder.mlmodelcAcoustic encoder
mel.mlmodelcAudio frontend
decoder.mlmodelcDecoder
meta.jsonGeometry the runtime reads instead of hardcoding
vocab.jsonSentencePiece vocabulary
embedding.f16Token embedding table

Artifact names describe roles rather than the network behind them, so replacing the recogniser is a new upload rather than an SDK change.

The models are shipped compiled (.mlmodelc). Keep them that way: an .mlpackage is recompiled on every launch and loads far more slowly.

Architecture

A three-stage Core ML cascade over a log-mel spectrogram, dispatched from Swift:

  • Frontend: a log-mel spectrogram computed inside Core ML, normalized over the frames that hold audio rather than the whole padded window.
  • Encoder: a conformer-style acoustic encoder over a fixed 15 s window, producing one frame every 80 ms.
  • Decoder: a transducer that emits a token and a duration at each step, run with sixteen independent windows batched into the lanes of a single dispatch.

Longer audio is cut into consecutive windows at pauses, transcribed independently, and joined on the longest run of words two neighbouring windows agree on. Every stage runs on the Neural Engine with no CPU or GPU fallback.

Inputs and outputs

  • Input: mono audio at any sample rate; the SDK resamples and downmixes.
  • Output: the transcript, plus every word with a start and an end in seconds.

Accuracy

Ten minutes of audio on an M3 Ultra, release build, warm:

Speed2.1 s for 611 s of audio (~290x real time) on long files; 50-62x transcribing single short utterances, where every clip pays for a full 15 s window
Word error rate7.40% averaged over six Open ASR Leaderboard sets, against 7.00% for Whisper large-v3-turbo
Long-form word error rate2.83% on half an hour of narration scored against the book, against 2.72% for Whisper large-v3-turbo on the same span
Word timestampsstarts 83 ms, ends 95 ms mean absolute error against a forced aligner
Neural Engine residency100%, with no CPU or GPU fallback
Size on disk467 MB
Load~0.2 s warm; ~20 s once per install while Core ML specializes

English, on the Open ASR Leaderboard

Scored on the Open ASR Leaderboard datasets with its own text normalizer. Whisper's figures are the leaderboard's, on the same dataset configurations.

datasetVozWhisper large-v3-turbo
LibriSpeech test-clean2.19%2.13%
LibriSpeech test-other3.86%3.70%
GigaSpeech9.70%8.47%
SPGISpeech3.86%2.79%
Earnings-2212.97%11.07%
AMI11.84%13.87%
average7.40%7.00%

Close overall, two points better on meetings, behind on prepared and read speech. It gets there in 467 MB entirely on the Neural Engine, against 1.6 GB for Whisper large-v3-turbo.

Expect the conversational figures, not the LibriSpeech one. Read speech in a clean recording scores around 2%; meetings, earnings calls and podcast audio score 10-13%, and most real material is nearer the second group. Roughly one word in ten wanting a look is the honest expectation for a podcast.

VoxPopuli and TEDLIUM are omitted: the leaderboard's scripts name a 628-utterance shard of the former, which is not the audio its published figure measures, and the latter's config carries no rows.

Word timestamps

Every word carries a start and an end, scored against torchaudio's MMS_FA forced aligner:

wordsstartendends within 80 mswithin 200 ms
English, LibriSpeech629583 ms95 ms60%90%
German, FLEURS93980 ms92 ms62%92%

Ends are the harder of the two. The recogniser reports how far to skip after each token rather than where a word stops, which overshoots into the pause that follows it, so ends are trimmed back using the audio. Forced alignment is itself approximate at the tens of milliseconds level, so treat these as agreement with a good aligner rather than absolute truth. Much of the residual is the 80 ms frame resolution, which is the floor for any word time this export produces.

Every supported language, on long audio

Ten minutes per language, built by concatenating FLEURS test utterances so that each file crosses about forty analysis boundaries. A single FLEURS utterance is shorter than one window and so measures nothing about how consecutive windows are joined, which is most of what happens on real material. 4.2 hours in total.

WERWERWER
it3.31%cs14.27%hu21.26%
pt6.08%sk15.42%et21.37%
uk6.40%hr16.92%sv21.67%
ru6.57%fi18.17%mt22.01%
en7.36%ro20.95%da24.32%
de8.12%lt26.89%
es9.01%lv30.57%
nl9.84%sl33.85%
pl9.99%el39.46%
bg12.39%
fr12.78%

Aggregate 16.58%, median 283x real time. Throughput varies only 12% across languages, because cost follows how much audio there is rather than what is in it.

Read the spread before choosing a language. The nine best are usable as-is; the tail above 20% will cost more to correct than to retype for many uses, and reflects where the underlying recogniser is already known to be weak rather than anything specific to this export. This is read speech in clean recordings, so treat it as a ranking rather than as a number to expect on your own audio.

Languages

Bulgarian, Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Maltese, Polish, Portuguese, Romanian, Russian, Slovak, Slovenian, Spanish, Swedish, and Ukrainian.

Accuracy varies widely across them; see the per-language table above before choosing one.

Built on

  • Parakeet TDT 0.6B v3 - NVIDIA (CC BY 4.0): the base recogniser, converted to Core ML and compressed for this export. Weight values are otherwise unchanged.
  • FLEURS (CC BY 4.0): evaluation audio for the per-language table above.

See `THIRD_PARTY_NOTICES.md`. FLEURS is not redistributed here.

<!-- card-footer:start (generated from manifest.json, edit above this block) -->

License

Desert Ant Labs Source-Available License. Free for most apps, and a commercial license is required at scale. Full terms are at the link. Licensing: <licensing@desertant.com>.

See `THIRD_PARTY_NOTICES.md`.

Citation

bibtex
@software{voz_2026,
  title  = {Voz: On-device speech recognition: transcripts with word-level timestamps, 25 languages},
  author = {Desert Ant Labs},
  year   = {2026},
  url    = {https://huggingface.co/desert-ant-labs/voz},
}

© 2026 Desert Ant Labs · <https://desertant.com> <!-- card-footer:end -->