This FAQ answers current behavior questions. Source-of-truth status is Roadmap (see its Implemented-baseline section).
OpenASR is a local-first ASR runner with a Rust CLI, a local server, a model metadata registry, and a transcription-focused OpenAI-compatible API subset. It runs native ggml-backed model packs offline.
Sixteen, dispatched by a data-driven architecture registry (arch/): Whisper,
Cohere Transcribe, Qwen3-ASR, Parakeet-CTC, Parakeet-TDT (25 European
languages), wav2vec2-CTC (incl. data2vec), Moonshine, Dolphin (Chinese
dialects), SenseVoice (zh/yue/en/ja/ko), MiMo-V2.5-ASR (zh/en/yue; RVQ
tokenizer + Qwen2 decoder), FireRedASR-AED (Mandarin + English bilingual),
FireRedASR2-LLM (Mandarin + English bilingual; Encoder-Adapter-LLM),
Fun-ASR-Nano (zh/en; SAN-M encoder + Qwen3 decoder), Granite Speech 4.1
(en/fr/de/es/pt/ja; Conformer + Q-Former + 2B decoder),
MOSS-Transcribe-Diarize (zh/en meeting transcription with in-decoder speaker
segmentation), and X-ASR (Zipformer). They run local offline transcription on CPU and Metal
lanes. See Known Limitations for per-family
streaming and word-timestamp support, and the per-model cards under
model-registry/models/ for quant tiers.
native(default): local.oasrpack execution with staged fail-closed boundaries.mock: deterministic local mock transcription, opt-in via--backend mock(hidden in--help) for plumbing and CI.
Never silently. openasr pull is the explicit command for published packs. In
addition, transcribe/live will install a missing model for you, but only
through a visible consent prompt (showing model, quant, size, host, and
license); --offline or any non-interactive run fails closed before touching the
network. The shared resolve path and the HTTP server never pull -- the server
runs only an explicit local pack.
Yes. For published packs, use openasr pull <id>:<quant> or a bare <id> for
the recommended quant. For unpublished local development/benchmark workflows,
stage artifacts under ./tmp/ with provenance recorded (source identity,
revision/path, SHA256, size, mirror endpoint if used). Do not commit downloaded
artifacts.
Only .oasr (GGUF-backed internally). The bare .gguf extension is no longer
accepted as CLI run input or importer output. See
Format Contract.
Use the per-family importer on a local HF-style source directory:
import whisper, import qwen, import cohere,
import parakeet-ctc, import parakeet-tdt, import wav2vec2-ctc,
import moonshine, import dolphin, import sensevoice. Each accepts
--quantization fp16|q8_0|q4_k
(Qwen adds q3_k). openasr pull installs already-published packs; it does not
replace local importer workflows. There is no quantize command.
Yes. openasr verify <path.oasr> and openasr show <path.oasr> probe a
caller-provided local .oasr file via ggml. They reject remote URLs, missing
paths, and directory paths, and
do not run inference.
Yes. openasr transcribe <audio> uses the native backend by default and runs an
installed model (offering to install the default model on first use). To pin an
exact local pack instead, pass --model-pack <local.oasr>: the path must be a
local regular .oasr file; remote URLs/downloads are rejected. Current scope is
offline/final-only and fail-closed by stage.
Execution is split into separate stages so failures are unambiguous rather than a single opaque "native failed": runtime-pack path → metadata → tensor index → encoder tensor binding/materialization → encoder graph → tokenizer load → decoder tensor binding/materialization → decoder graph → greedy decode → decode text.
For runtime packs that declare the streaming feature and whose family has a registered streaming executor (e.g. X-ASR/Zipformer, Qwen3-ASR, Whisper), native frame-synchronous streaming emits incremental partials. Packs without that metadata fall back to final-per-utterance output. Official published streaming packs and public product guarantees are still pending — see Known Limitations.
Yes. For local file transcription, --diarize (and the API diarize flag)
enables the complete Voice ID path: first determine who spoke when, then match
enough clean evidence against the local person library. The speaker source is
selected by the ASR architecture rather than by a model-id allowlist:
moss-transcribe-diarizesupplies recording-local speaker turns from its own decoder.- Every other ASR family uses the shared recording-level pipeline: FireRed Stream-VAD, segmentation-3.0, ReDimNet2-B6 embeddings, automatic AHC/spectral clustering, and overlap-aware reconstruction.
Both routes still require the ReDimNet2-B6 capability pack: MOSS removes the external segmentation/clustering step, not the acoustic identity step. Missing or broken required packs fail closed instead of fabricating speakers or silently falling back to a different embedding space.
segmentation-3.0 is the permissive default external segmenter. DiariZen Large-s80-md-v2 is a higher-accuracy optional provider whose checkpoint is CC BY-NC 4.0. Its published pack is fp16-only and requires explicit non-commercial license acceptance before download plus a separate activation choice. Enabling Voice ID alone still prepares segmentation-3.0; it never silently installs DiariZen.
The operator-only /v1/voice-id/* API
(crates/openasr-server/src/routes/voice_id.rs) manages people and samples,
consent revocation, and metadata export. Enrolling a person requires at least
10 seconds of clean speech per registered sample
(MIN_SAMPLE_SPEECH_SECONDS,
crates/openasr-core/src/diarize/voice_id/quality.rs); once a person is
enrolled, automatically naming an anonymous SPEAKER_NN label to that person
during diarization additionally needs at least 8 continuous seconds of that
person speaking uninterrupted in one turn to clear naming's evidence gate
(MIN_CONTINUOUS_SPEECH_SECONDS_FOR_NAMING,
crates/openasr-core/src/diarize/voice_id/identity.rs). A speaker who is not
enrolled, or whose evidence falls short of that gate, simply keeps a
session-relative SPEAKER_NN number -- Voice ID never fabricates an identity
match.
This universal identity contract is qualified for local file transcription. Realtime and remote-compute diarization use separate API and privacy contracts; their lower-level speaker fields do not establish the same cross-recording identity guarantee.
OpenASR does not perform source/audio separation (isolating vocals from background music or noise, the way Demucs or similar stem-splitting tools do). Diarization and Voice ID only label, and optionally name, existing speech segments within a single mixed audio stream; there is no implementation of, or plan for, stem separation.
No. By default the daemon releases the bound model's resident runtime (mmap,
tensors, Metal state) after 10 minutes with no active transcription request or
realtime session; the next request just reloads and re-warms it, paying the
normal cold-build cost again. Adjust or disable this via the idle_unload
preference (never, now, 2m, 10m (default), 1h).
Yes. OpenASR is licensed under Apache-2.0 and maintained as the public open core. Model packs are distributed separately under their own upstream licenses. See Roadmap.
Yes for the open-core CLI and local server. Each core release publishes
checksummed archives on
GitHub Releases (macOS,
Linux, Windows, plus CUDA/ROCm/Vulkan/musl variants where applicable) and
matching runtime images on
Docker Hub (latest /
<version> for CPU multi-arch, cuda-latest / cuda-<version> for CUDA
amd64). The separate macOS/Windows desktop apps ship from
openasr.org/download.
Yes. quintinshaw/openasr on Docker Hub. Images contain the release binary and
model-registry metadata only — mount a volume at /data, then
docker exec … openasr pull <model> --yes before calling the HTTP API. The
server never auto-pulls. CUDA tags require the NVIDIA Container Toolkit and
refuse to start if no GPU is visible. Longer guide:
openasr.org/docs/docker.
Not for current mock and native paths. OpenASR does not bundle/install/manage ffmpeg.
No. OpenASR implements a focused local transcription subset plus local realtime routes. See Known Limitations.
Via the committed bench-suite (perf/suite.toml), which records RTF and peak
RSS per entry under subprocess isolation and gates against committed baselines
(gate_peak_rss, gate_vs_cpp), including competitive comparison vs
whisper.cpp. See Performance.