[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-93436":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":14,"contributorsCount":9,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":15,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":16,"fork":16,"defaultBranch":17,"hasWiki":16,"hasPages":16,"topics":18,"createdAt":9,"pushedAt":9,"updatedAt":29,"readmeContent":30,"aiSummary":31,"trendingCount":14,"starSnapshotCount":14,"syncStatus":32,"lastSyncTime":9,"discoverSource":33},93436,"CrispASR","CrispStrobe\u002FCrispASR","CrispStrobe","C++ ggml runtime hub for multilingual ASR and TTS models: Cohere Transcribe, Parakeet TDT, Voxtral, Canary 1B v2, etc, plus universal forced alignment, and more",null,"https:\u002F\u002Fgithub.com\u002FCrispStrobe\u002FCrispASR","C++",449,70,0,42.55,false,"main",[19,20,21,22,23,24,25,26,27,28],"cohere-transcribe","cohere-transcribe-03-2026","ggml","speech-recognition","speech-to-text","stt","transcription","whisper-cpp","parakeet","voxtral","2026-07-22 04:02:09","# CrispASR\n\n**One C++ binary, 43 ASR backends + 48 TTS engines + multilingual text translation, zero Python dependencies.**\n\nCrispASR started as a fork of [whisper.cpp](https:\u002F\u002Fgithub.com\u002Fggml-org\u002Fwhisper.cpp) and extends that base into a **unified speech engine** called `crispasr`, backed by full ggml C++ runtimes for major open-weights ASR *and* TTS architectures. One build, one binary, one consistent CLI — pick the backend at the command line or let CrispASR auto-detect it from your GGUF file. See [Text-to-Speech](#text-to-speech-tts) for the TTS side.\n\n```console\n$ crispasr -m ggml-base.en.bin          -f samples\u002Fjfk.wav                    # OpenAI Whisper\n$ crispasr -m parakeet-tdt-0.6b.gguf    -f samples\u002Fjfk.wav                    # NVIDIA Parakeet\n$ crispasr -m canary-1b-v2.gguf         -f samples\u002Fjfk.wav                    # NVIDIA Canary\n$ crispasr -m voxtral-mini-3b-2507.gguf -f samples\u002Fjfk.wav                    # Mistral Voxtral\n$ crispasr --backend qwen3 -m auto      -f samples\u002Fjfk.wav                    # -m auto downloads\n$ crispasr --backend kokoro -m auto --tts \"Hello world\" --tts-output out.wav  # TTS\n```\n\nNo Python. No PyTorch. No separate per-model binary. No `pip install`. Just one C++ binary and a GGUF file.\n\n**Browser**: All backends compile to WebAssembly (4.3 MB) via `build-wasm.sh`.\nMultithreaded, runs entirely client-side with COOP\u002FCOEP headers.\n\n**Demo**: [HuggingFace Space](https:\u002F\u002Fhuggingface.co\u002Fspaces\u002Fcstr\u002FCrispASR) —\nlive transcription + TTS + language detection, auto-deployed from `hf-space\u002F`.\n\n### What's new (v0.8.9)\n\n- **MOSS-Transcribe-Diarize (#242, v0.8.9):** joint ASR + speaker diarization + timestamps in a single 0.9B model. Stock Whisper encoder + VQAdaptor + Qwen3-0.6B. Diff harness 4\u002F4 cos=1.0. `--backend moss-diarize -m auto`.\n- **dots.tts full pipeline (#200, v0.8.9):** PatchEncoder RoPE + QK-norm fix, BigVGAN vocoder working e2e, voice cloning via CAM++ speaker encoder. `--tts-steps` \u002F `--tts-cfg-scale` wired.\n- **Irodori-TTS VoiceDesign (v0.8.9):** caption-conditioned voice design for Irodori TTS.\n- **gallocr UAF audit (#215e, v0.8.9):** fixed stale-buffer use-after-free in 7 backends (canary, canary_ctc, kyutai_stt, moonshine_streaming, nemotron, paraformer, sensevoice). All 19 cached-graph sites audited.\n- **Generation-health gate (v0.8.9):** `core\u002Fgeneration_health.h` — 5 objective quality checks (empty, duration, n-gram loop, truncation, TTS duration) with 16 unit tests.\n- **Audio format expansion (v0.8.3):** `.opus`, `.webm`, `.au`, `.amr`, `.m4a`\u002F`.aac` decode — no ffmpeg.\n- **Hotwords (#98):** `--hotwords \"Tokyo,CrispASR\"` for CTC\u002FTDT contextual biasing + LLM prompt injection.\n- **Global diarization (#110):** `--diarize-method sherpa` \u002F `pyannote` \u002F `moss-diarize` (native) for consistent speaker IDs.\n- **Generation controls:** `--seed`, `--beam-size`, `--frequency-penalty`, `--max-new-tokens` wired through all backends.\n\n### Ecosystem\n\n| Project | What it does |\n|---|---|\n| **[CrispASR](https:\u002F\u002Fgithub.com\u002FCrispStrobe\u002FCrispASR)** | This repo — C++ speech engine. 43 ASR + 48 TTS backends, CLI + HTTP server + C-ABI + Python\u002FRust\u002FDart\u002FGo\u002FRuby\u002FJava bindings. |\n| **[CrisperWeaver](https:\u002F\u002Fgithub.com\u002FCrispStrobe\u002FCrisperWeaver)** | Cross-platform Flutter transcription app built on CrispASR. Desktop + mobile, all 10 backends, model browser with download queue, mic capture, SRT\u002FVTT\u002FJSON export, diarization, batch processing. Fully offline. |\n| **[CrispEmbed](https:\u002F\u002Fgithub.com\u002FCrispStrobe\u002FCrispEmbed)** | Text embedding engine via ggml — same philosophy as CrispASR but for retrieval. 10 architectures (XLM-R, Qwen3-Embed, Gemma3, ModernBERT, ...), dense + sparse + ColBERT + reranking. 9.5x faster than ONNX on CPU, GPU via CUDA\u002FMetal\u002FVulkan. Python\u002FRust\u002FDart bindings. |\n| **[Susurrus](https:\u002F\u002Fgithub.com\u002FCrispStrobe\u002FSusurrus)** | Python ASR GUI with 9 backends (faster-whisper, mlx-whisper, voxtral, insanely-fast-whisper, ...). The Python counterpart to CrispASR's C++ approach. |\n\n---\n\n## Table of contents\n\n- [Supported backends](#supported-backends) — [ASR](#asr-backends) + [TTS](#text-to-speech-models) + [translation](#translation) + [post-processing](#post-processing-models)\n- [Feature matrix](#feature-matrix)\n- [Install & build](#install--build) — quick install (full guide in [docs\u002Finstall.md](docs\u002Finstall.md))\n- [Quick start — ASR](#quick-start)\n- [**Text-to-Speech (TTS)**](docs\u002Ftts.md) — 48 engines: Kokoro, Qwen3-TTS, VibeVoice, dots.tts, Orpheus, Chatterbox, IndexTTS, Irodori, VoxCPM2, CosyVoice3, CSM, Dia, Zonos, Bark, Piper, MeloTTS, and more\n- [Streaming & live transcription](docs\u002Fstreaming.md)\n- [Server mode (HTTP API)](docs\u002Fserver.md)\n- [CLI reference](docs\u002Fcli.md) — flags, VAD, CTC alignment, output formats, auto-download, audio formats\n- [Environment variables](docs\u002Fenvironment-variables.md) — the `CRISPASR_\u003CBACKEND>_\u003CFEATURE>` convention, global knobs, and every per-backend variable\n- [Language bindings](docs\u002Fbindings.md) — Python \u002F Rust \u002F Dart \u002F Go \u002F Java \u002F JavaScript \u002F Ruby \u002F mobile\n- [Benchmarking CrispASR](docs\u002Fbenchmarking.md) — how to measure transcribe time (not cold start): server\u002Fin-process reps, proof-of-work rules, phase-timing env vars\n- [Architecture](docs\u002Farchitecture.md) — layered layout, `src\u002Fcore\u002F` primitives, regression discipline\n- [Contributing — adding a new backend](docs\u002Fcontributing.md) — 5-file recipe, ground-truth diff workflow\n- [Regression matrix](docs\u002Fregression-matrix.md) — `tools\u002Ftest-all-backends.py` capability tiers\n- [Quantize models](docs\u002Fquantize.md) — `crispasr-quantize` for all backends\n- [GPU backend selection](#gpu-backend-selection)\n- [Debugging & profiling](#debugging--profiling)\n- [Credits](#credits)\n\n---\n\n## Supported backends\n\nCrispASR ships **43 ASR backends** for transcription\u002Ftranslation and\n**48 TTS engines** for synthesis (91 total in the [feature matrix](docs\u002Ffeature-matrix.md)).\nPick at the CLI with `--backend NAME`, or omit it to let the binary auto-detect\nfrom the GGUF metadata. Jump to the [TTS table](#text-to-speech-models) for the synthesis side.\n\n### ASR backends\n\n| Backend | Model | Architecture | Languages | License |\n|---|---|---|---|---|\n| **whisper** | [`ggml-base.en.bin`](https:\u002F\u002Fhuggingface.co\u002Fggerganov\u002Fwhisper.cpp\u002F) and all OpenAI Whisper variants | Encoder-decoder transformer | 99 | MIT |\n| **whisper** | [`distil-whisper\u002Fdistil-large-v3`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fdistil-large-v3-GGUF) | Distilled Whisper: 32L encoder + 2L decoder (6.3x faster) | English | MIT |\n| **parakeet** | [`nvidia\u002Fparakeet-tdt-0.6b-v3`](https:\u002F\u002Fhuggingface.co\u002Fnvidia\u002Fparakeet-tdt-0.6b-v3) | FastConformer + TDT | 25 EU (auto-detect) | CC-BY-4.0 |\n| **parakeet** | [`nvidia\u002Fparakeet-tdt-0.6b-v2`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fparakeet-tdt-0.6b-v2-GGUF) | FastConformer + TDT, original Open ASR Leaderboard topper | en (mixed-case + punct) | CC-BY-4.0 |\n| **parakeet** | [`nvidia\u002Fparakeet-tdt-1.1b`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fparakeet-tdt-1.1b-GGUF) | 42L FastConformer + TDT, larger English variant | en (lowercase) | CC-BY-4.0 |\n| **parakeet** | [`nvidia\u002Fparakeet-tdt_ctc-110m`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fparakeet-tdt_ctc-110m-GGUF) | 17L FastConformer + TDT+CTC hybrid; smallest variant, auto-CTC decode | en | CC-BY-4.0 |\n| **parakeet** | [`nvidia\u002Fparakeet-tdt_ctc-1.1b`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fparakeet-tdt_ctc-1.1b-GGUF) | 42L FastConformer + TDT+CTC hybrid; largest, mixed-case + punct | en | CC-BY-4.0 |\n| **parakeet** | [`nvidia\u002Fparakeet-tdt_ctc-0.6b-ja`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fparakeet-tdt-0.6b-ja-GGUF) | FastConformer-TDT-CTC, xscaling, 80 mels | Japanese | CC-BY-4.0 |\n| **reazonspeech** | [`reazon-research\u002Freazonspeech-nemo-v2`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Freazonspeech-nemo-v2-GGUF) | FastConformer-RNNT, local attn (w=256), 80 mels, 619M params | Japanese | Apache-2.0 |\n| **fastconformer-ctc** | [`nvidia\u002Fparakeet-ctc-0.6b`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fparakeet-ctc-0.6b-GGUF) | 24L FastConformer + CTC, 80 mels (same arch as fc-ctc-xlarge) | en | CC-BY-4.0 |\n| **fastconformer-ctc** | [`nvidia\u002Fparakeet-ctc-1.1b`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fparakeet-ctc-1.1b-GGUF) | 42L FastConformer + CTC, 80 mels | en | CC-BY-4.0 |\n| **fastconformer-ctc** | [`grider-transwithai\u002Fparakeet-ctc-1.1b-ja`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fparakeet-ctc-1.1b-ja-GGUF) | 42L FastConformer + CTC, 80 mels, Japanese fine-tune | Japanese | Apache-2.0 |\n| **canary** | [`nvidia\u002Fcanary-1b-v2`](https:\u002F\u002Fhuggingface.co\u002Fnvidia\u002Fcanary-1b-v2) | FastConformer + Transformer decoder | 25 EU (explicit `-sl\u002F-tl`) | CC-BY-4.0 |\n| **canary-qwen** | [`nvidia\u002Fcanary-qwen-2.5b`](https:\u002F\u002Fhuggingface.co\u002Fnvidia\u002Fcanary-qwen-2.5b) | FastConformer + Qwen3-1.7B SALM | en | CC-BY-4.0 |\n| **lfm2-audio** | [`LiquidAI\u002FLFM2.5-Audio-1.5B`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Flfm2-audio-1.5b-GGUF) | FastConformer + LFM2 hybrid conv+attention backbone (ASR+TTS) | en | LFM Open v1.0 |\n| **lfm2-audio** | [`LiquidAI\u002FLFM2.5-Audio-1.5B-JP`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Flfm2-audio-1.5b-jp-GGUF) | FastConformer + LFM2 hybrid conv+attention backbone (ASR+TTS) | ja | LFM Open v1.0 |\n| **mini-omni2** | [`gpt-omni\u002Fmini-omni2`](https:\u002F\u002Fhuggingface.co\u002Fgpt-omni\u002Fmini-omni2) | Whisper-small + Qwen2-0.5B (ASR+TTS+S2S) | en | MIT |\n| **cohere** | [`CohereLabs\u002Fcohere-transcribe-03-2026`](https:\u002F\u002Fhuggingface.co\u002FCohereLabs\u002Fcohere-transcribe-03-2026) | Conformer + Transformer | 13 | Apache-2.0 |\n| **cohere** | [`efwkjn\u002Fcohere-asr-ja-v0.1`](https:\u002F\u002Fhuggingface.co\u002FTransWithAI\u002Fcohere-transcribe-ja-v0.1-GGUF) | Japanese fine-tune of cohere-transcribe-03-2026 (TedX\u002FJSUT-tuned) | Japanese | Apache-2.0 |\n| **granite** | [`ibm-granite\u002Fgranite-speech-{3.2-8b,3.3-2b,3.3-8b}`](https:\u002F\u002Fhuggingface.co\u002Fibm-granite\u002Fgranite-speech-3.3-2b), [`granite-4.0-1b-speech`](https:\u002F\u002Fhuggingface.co\u002Fibm-granite\u002Fgranite-4.0-1b-speech) | Conformer + Q-Former + Granite LLM (μP) ([more](docs\u002Farchitecture.md#granite--granite-41--granite-41-plus--granite-41-nar)) | en fr de es pt ja | Apache-2.0 |\n| **granite-4.1** | [`ibm-granite\u002Fgranite-speech-4.1-2b`](https:\u002F\u002Fhuggingface.co\u002Fibm-granite\u002Fgranite-speech-4.1-2b) | 16L Conformer + Q-Former + Granite LLM; single ggml graph ([more](docs\u002Farchitecture.md#granite--granite-41--granite-41-plus--granite-41-nar)) | en fr de es pt ja | Apache-2.0 |\n| **granite-4.1-plus** | [`ibm-granite\u002Fgranite-speech-4.1-2b-plus`](https:\u002F\u002Fhuggingface.co\u002Fibm-granite\u002Fgranite-speech-4.1-2b-plus) | 4.1 + hidden-state concat; punctuated output ([more](docs\u002Farchitecture.md#granite--granite-41--granite-41-plus--granite-41-nar)) | en fr de es pt | Apache-2.0 |\n| **granite-4.1-nar** | [`ibm-granite\u002Fgranite-speech-4.1-2b-nar`](https:\u002F\u002Fhuggingface.co\u002Fibm-granite\u002Fgranite-speech-4.1-2b-nar) | Non-autoregressive: single LLM forward + slot argmax ([more](docs\u002Farchitecture.md#granite--granite-41--granite-41-plus--granite-41-nar)) | en fr de es pt | Apache-2.0 |\n| **fastconformer-ctc** | [`nvidia\u002Fstt_en_fastconformer_ctc_large`](https:\u002F\u002Fhuggingface.co\u002Fnvidia\u002Fstt_en_fastconformer_ctc_large) | FastConformer + CTC (NeMo family, all sizes) | en | CC-BY-4.0 |\n| **voxtral** | [`mistralai\u002FVoxtral-Mini-3B-2507`](https:\u002F\u002Fhuggingface.co\u002Fmistralai\u002FVoxtral-Mini-3B-2507) | Whisper encoder + Mistral 3B LLM | 8 | Apache-2.0 |\n| **voxtral4b** | [`mistralai\u002FVoxtral-Mini-4B-Realtime-2602`](https:\u002F\u002Fhuggingface.co\u002Fmistralai\u002FVoxtral-Mini-4B-Realtime-2602) | Causal encoder + 3.4B LLM, sliding window | 13, realtime streaming | Apache-2.0 |\n| **qwen3** | [`Qwen\u002FQwen3-ASR-0.6B`](https:\u002F\u002Fhuggingface.co\u002FQwen\u002FQwen3-ASR-0.6B) | Whisper-style audio encoder + Qwen3 0.6B LLM | 30 + 22 Chinese dialects | Apache-2.0 |\n| **qwen3-1.7b** | [`Qwen\u002FQwen3-ASR-1.7B`](https:\u002F\u002Fhuggingface.co\u002FQwen\u002FQwen3-ASR-1.7B) | Whisper-style audio encoder + Qwen3 1.7B LLM | 30 + 22 Chinese dialects | Apache-2.0 |\n| **qwen3-ja-anime** | [`jaykwok\u002FQwen3-ASR-1.7B-JA-Anime-Galgame-hf`](https:\u002F\u002Fhuggingface.co\u002Fjaykwok\u002FQwen3-ASR-1.7B-JA-Anime-Galgame-hf) | Qwen3-ASR-1.7B fine-tuned for Japanese anime\u002Fgalgame speech | ja + 30 langs | Apache-2.0 |\n| **mega-asr** | [`zhifeixie\u002FMega-ASR`](https:\u002F\u002Fhuggingface.co\u002Fzhifeixie\u002FMega-ASR) | Qwen3-ASR-1.7B + merged robustness LoRA; always-on robust path | noisy \u002F degraded speech | Apache-2.0 |\n| **higgs-stt** | [`bosonai\u002Fhiggs-audio-v3-stt`](https:\u002F\u002Fhuggingface.co\u002Fbosonai\u002Fhiggs-audio-v3-stt) | Whisper-large-v3 encoder (4 s chunked) + Qwen3-1.7B LLM ([more](docs\u002Farchitecture.md#higgs-stt)) | en | Apache-2.0 |\n| **wav2vec2** | [`jonatasgrosman\u002Fwav2vec2-large-xlsr-53-english`](https:\u002F\u002Fhuggingface.co\u002Fjonatasgrosman\u002Fwav2vec2-large-xlsr-53-english) | CNN + 24L transformer + CTC head (any Wav2Vec2ForCTC) | per-model | Apache-2.0 |\n| **wav2vec2** | [`facebook\u002Fdata2vec-audio-base-960h`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fdata2vec-audio-960h-GGUF) | Data2Vec Audio (79 MB Q4_K) | English | Apache-2.0 |\n| **wav2vec2** | [`facebook\u002Fhubert-large-ls960-ft`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fhubert-large-ls960-ft-GGUF) | HuBERT Large (212 MB Q4_K) | English | Apache-2.0 |\n| **glm-asr** | [`zai-org\u002FGLM-ASR-Nano-2512`](https:\u002F\u002Fhuggingface.co\u002Fzai-org\u002FGLM-ASR-Nano-2512) | Whisper encoder + 4-frame projector + Llama 1.5B (GQA) | Mandarin (+ Chinese dialects), English, Cantonese | MIT |\n| **kyutai-stt** | [`kyutai\u002Fstt-1b-en_fr`](https:\u002F\u002Fhuggingface.co\u002Fkyutai\u002Fstt-1b-en_fr) | Mimi codec (SEANet + RVQ) + 16L causal LM | en, fr | MIT |\n| **kyutai-stt** | [`kyutai\u002Fstt-2.6b-en`](https:\u002F\u002Fhuggingface.co\u002Fkyutai\u002Fstt-2.6b-en) | Mimi codec + 48L causal LM (2.6B, English-only; 3.5 s lookahead) | en | MIT |\n| **firered-asr** | [`FireRedTeam\u002FFireRedASR2-AED`](https:\u002F\u002Fhuggingface.co\u002FFireRedTeam\u002FFireRedASR2-AED) | Conformer + CTC + beam search; also LID (120 langs) | Mandarin, English, 20+ Chinese dialects | Apache-2.0 |\n| **moonshine** | [`UsefulSensors\u002Fmoonshine-{tiny,base}`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fmoonshine-base-GGUF) | Conv + 6L enc + 6L dec; multilingual variants | English + 6 langs | MIT |\n| **moonshine&#8209;de** | [`fidoriel\u002Fmoonshine-base-de`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fmoonshine-base-de-fidoriel-GGUF) | German fine-tune of moonshine-base (6.9% WER CV22) | German | CC&#8209;BY&#8209;NC&#8209;SA&#8209;4.0 |\n| **moonshine&#8209;tiny&#8209;de** | [`fidoriel\u002Fmoonshine-tiny-de`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fmoonshine-tiny-de-fidoriel-GGUF) | German fine-tune of moonshine-tiny (11.4% WER CV22) | German | CC&#8209;BY&#8209;NC&#8209;SA&#8209;4.0 |\n| **moonshine-streaming** | [`UsefulSensors\u002Fmoonshine-streaming-{tiny,small,medium}`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fmoonshine-streaming-tiny-GGUF) | Streaming: sliding-window encoder + AR decoder (34–245M) | English | MIT |\n| **gemma4-e2b** | [`google\u002Fgemma-4-E2B-it`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fgemma4-e2b-it-GGUF) | USM Conformer 12L + Gemma4 LLM 35L (GQA, PLE) | 140+ langs | Apache-2.0 |\n| **gemma4-e4b** | [`google\u002Fgemma-4-E4B-it`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fgemma4-e4b-it-GGUF) | Same USM Conformer 12L + larger Gemma4 LLM 42L (GQA, PLE); runs on `--backend gemma4-e2b` | 140+ langs | Apache-2.0 |\n| **omniasr** | [`omniASR-CTC-1B-v2`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002FomniASR-CTC-1B-v2-GGUF) | wav2vec2 CNN + 48L transformer + CTC ([more](docs\u002Farchitecture.md#omniasr-ctc--llm--unlimited)) | **1600+** | Apache-2.0 |\n| **omniasr&#8209;300m** | [`omniASR-CTC-300M-v2`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002FomniASR-CTC-300M-v2-GGUF) | Same arch, 24L, ~194 MB Q4_K; auto-chunks >7 s ([more](docs\u002Farchitecture.md#omniasr-ctc--llm--unlimited)) | **1600+** | Apache-2.0 |\n| **omniasr-llm** | [`omniASR-LLM-300M-v2`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fomniasr-llm-300m-v2-GGUF) | Same encoder + 12L LLaMA decoder ([more](docs\u002Farchitecture.md#omniasr-ctc--llm--unlimited)) | **1600+** | Apache-2.0 |\n| **omniasr-llm** | [`omniASR-LLM-Unlimited-300M-v2`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fomniasr-llm-unlimited-300m-v2-GGUF) | Streaming: 15s segment protocol, unlimited audio ([more](docs\u002Farchitecture.md#omniasr-ctc--llm--unlimited)) | **1600+** | Apache-2.0 |\n| **vibevoice** | [`microsoft\u002FVibeVoice-ASR`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fvibevoice-asr-GGUF) | σ-VAE ConvNeXt + Qwen2.5-7B ([more](docs\u002Farchitecture.md#vibevoice)) | 50+ | MIT |\n| **mimo-asr** | [`XiaomiMiMo\u002FMiMo-V2.5-ASR`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fmimo-asr-GGUF) | 6L transformer + 36L Qwen2 LM + RVQ codec ([more](docs\u002Farchitecture.md#mimo-asr)) | Mandarin + dialects + English | MIT |\n| **ark-asr** ⚠️*experimental\u002FWIP* | [`cstr\u002Fark-asr-3b-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fark-asr-3b-GGUF) (base [`AutoArk-AI\u002FARK-ASR-3B`](https:\u002F\u002Fhuggingface.co\u002FAutoArk-AI\u002FARK-ASR-3B)) | Whisper-large-v3 enc (partial RoPE) + Qwen2.5-3B LM ([more](docs\u002Farchitecture.md#ark-asr)) | 19 (zh, en, de, ja, fr, ko, es, pl, it, ro, hu, cs, nl, fi, hr, sk, sl, et, lt) | see base |\n| **moss-audio** | [`OpenMOSS-Team\u002FMOSS-Audio-4B-Instruct`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002FMOSS-Audio-4B-Instruct-GGUF) | 32L Whisper encoder + DeepStack 3-tap + 36L Qwen3 LM; audio understanding + ASR ([more](docs\u002Farchitecture.md#moss-audio)) | zh, en | Apache-2.0 |\n| **moss-transcribe** | [`OpenMOSS-Team\u002FMOSS-Transcribe-preview-2B`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002FMOSS-Transcribe-preview-2B-GGUF) | Qwen3-Omni audio encoder (32L, windowed attn) + GatedMLP adapter + Qwen3-1.7B LM; ASR ([more](docs\u002Farchitecture.md#moss-transcribe)) | zh, en | Apache-2.0 |\n| **moss-diarize** | [`OpenMOSS-Team\u002FMOSS-Transcribe-Diarize-0.9B`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002FMOSS-Transcribe-Diarize-0.9B-GGUF) | Stock Whisper encoder (24L, 80 mel) + 4x merge + VQAdaptor + Qwen3-0.6B LM; joint ASR + speaker diarization + timestamps | multi | Apache-2.0 |\n| **funasr** | [`FunAudioLLM\u002FFun-ASR-Nano-2512`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Ffunasr-nano-GGUF) | 70-block SANM encoder + 2-block Transformer adaptor + Qwen3-0.6B LLM | zh, yue, en, ja, ko | FunASR Model License v1.1 (commercial OK w\u002F attribution) |\n| **fun-asr-mlt-nano** | [`FunAudioLLM\u002FFun-ASR-MLT-Nano-2512`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Ffunasr-mlt-nano-GGUF) | Same architecture, multilingual decoder | 31 langs incl. de, fr, es, pt, ru, ar, hi, vi, th, ko | FunASR Model License v1.1 |\n| **paraformer** | [`funasr\u002Fparaformer-zh`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fparaformer-zh-GGUF) | 50-block SANM encoder + CIF predictor + 16-block NAR decoder (single-pass, non-autoregressive); character-level vocab (8404); 220M params | zh, en | FunASR Model License (commercial OK w\u002F attribution) |\n| **sensevoice** | [`FunAudioLLM\u002FSenseVoiceSmall`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fsensevoice-small-GGUF) | 70-block SANM encoder + CTC head; emits transcript + language ID + emotion + audio-event in one forward pass (non-AR, 15× faster than Whisper-Large); structured C ABI + `-oj` JSON expose the four tags as separate fields | 50+ langs; native LID + emotion + audio-event tags | FunASR Model License v1.1 |\n\n### Text-to-Speech models\n\nSynthesis backends, driven by the `--tts` flag and a `--tts-output PATH.wav`.\nSee the dedicated [Text-to-Speech](#text-to-speech-tts) section below for\nquick-start commands and engine selection guidance.\n\n| Backend | Models | Architecture | Languages | License |\n|---------|--------|-------------|-----------|---------|\n| **vibevoice-tts** | [`VibeVoice-Realtime-0.5B`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fvibevoice-realtime-0.5b-GGUF), [`VibeVoice-1.5B`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fvibevoice-1.5b-GGUF) | DPM-Solver++ + σ-VAE decoder; voice presets or cloning | en, zh | MIT |\n| **kugelaudio** | [`kugelaudio-0-open`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fkugelaudio-0-open-GGUF) | Qwen2.5-7B LM + 4L DiT diffusion + acoustic VAE decoder; voice cloning | multilingual | Apache-2.0 |\n| **qwen3-tts** | [`Qwen3-TTS-12Hz-0.6B-Base`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fqwen3-tts-0.6b-base-GGUF), [`1.7B-Base`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fqwen3-tts-1.7b-base-GGUF), [`1.7B-VoiceDesign`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fqwen3-tts-1.7b-voicedesign-GGUF) | Qwen3 talker LM + 12 Hz RVQ ([more](docs\u002Farchitecture.md#qwen3-tts)) | multilingual | Apache-2.0 |\n| **qwen3-tts-customvoice** | [`1.7B-CustomVoice`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fqwen3-tts-1.7b-customvoice-GGUF) | Same talker + 9 premium built-in speakers (`--voice \u003Cname>`); optional style via `--instruct` (e.g. \"spoke very slowly\") ([more](docs\u002Farchitecture.md#qwen3-tts)) | multilingual | Apache-2.0 |\n| **moss-tts** | [`OpenMOSS-Team\u002FMOSS-TTS-v1.5`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fmoss-tts-v1.5-GGUF) | Qwen3-8B backbone emitting 32 RVQ audio codebooks under a delay pattern, decoded by a 1.6B pure-transformer codec companion; voice cloning via `--voice ref.wav`; `--backend moss-tts -m \u003Cbackbone> --codec-model \u003Ccodec>` | multilingual | Apache-2.0 |\n| **moss-tts-local** | [`OpenMOSS-Team\u002FMOSS-TTS-Local-Transformer-v1.5`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fmoss-tts-local-v1.5-GGUF) | Qwen3-4B backbone; a 1-layer local\u002Fdepth transformer autoregressively emits 12 RVQ codebooks per frame (RQ-Transformer, no delay), decoded to 48 kHz by MOSS-Audio-Tokenizer-v2 (downmixed to mono); `--backend moss-tts-local -m \u003Cbackbone> --codec-model \u003Ccodec>` | multilingual | Apache-2.0 |\n| **omnivoice** | [`k2-fsa\u002FOmniVoice`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fomnivoice-GGUF) | Qwen3-0.6B + masked iterative 8-codebook TTS (SoundStorm-style); voice cloning; 600+ languages ([more](docs\u002Farchitecture.md#omnivoice)) | 600+ langs | Apache-2.0 |\n| **melotts** | [`myshell-ai\u002FMeloTTS`](https:\u002F\u002Fgithub.com\u002Fmyshell-ai\u002FMeloTTS) EN_V2 | VITS2 (6L transformer + SDP\u002FDP + transformer coupling flow + HiFi-GAN); 44.1 kHz, 102 MB + 52 MB BERT Q4_K companion (154 MB total); neural G2P; 4 EN speakers ([more](docs\u002Farchitecture.md#melotts)) | en | MIT |\n| **piper** | [`rhasspy\u002Fpiper`](https:\u002F\u002Fgithub.com\u002Frhasspy\u002Fpiper) community voices | VITS (6L transformer + SDP + 4-block coupling flow + HiFi-GAN); 22 kHz mono, 30 MB F16 per voice; built-in G2P for EN\u002FDE\u002FFR\u002FES (`--g2p-dict`) | 30+ langs (built-in + espeak dlopen) | MIT |\n| **kokoro** | [`hexgrad\u002FKokoro-82M`](https:\u002F\u002Fhuggingface.co\u002Fhexgrad\u002FKokoro-82M) + German backbones | StyleTTS2 \u002F iSTFTNet (82M); per-voice GGUF ([more](docs\u002Farchitecture.md#kokoro)) | en, es, fr, hi, it, ja, pt, zh, de | Apache-2.0 |\n| **orpheus** | [`Orpheus-3B-FT`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Forpheus-3b-0.1-ft-GGUF) + [`SNAC 24 kHz`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fsnac-24khz-GGUF) | Llama-3.2-3B + SNAC RVQ codec; 8 speakers ([more](docs\u002Farchitecture.md#orpheus)) | en, de | Llama \u002F MIT |\n| **chatterbox** | [`cstr\u002Fchatterbox-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fchatterbox-GGUF) + turbo\u002Fkartoffelbox\u002Flahgtna variants | T3 AR + S3Gen flow-matching ([more](docs\u002Farchitecture.md#chatterbox--chatterbox-turbo--kartoffelbox-turbo--lahgtna-chatterbox)) | 23 multilingual; separate Arabic (`lahgtna-chatterbox`) and German turbo (`kartoffelbox-turbo`) fine-tunes | MIT |\n| **indextts** | [`cstr\u002Findextts-1.5-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Findextts-1.5-GGUF) | GPT-2 AR (24L\u002F1280d) + Conformer conditioning + BigVGAN vocoder; voice cloning via reference audio | zh, en | Apache-2.0 |\n| **voxcpm2-tts** | [`cstr\u002Fvoxcpm2-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fvoxcpm2-GGUF) | Tokenizer-free CFM diffusion AR (TSLM + RALM + LocDiT) at 48 kHz native; zero-shot + voice cloning via `--voice \u003Cwav>` | 30 languages | Apache-2.0 |\n| **voxtral-tts** | [`mistralai\u002FVoxtral-4B-TTS-2603`](https:\u002F\u002Fhuggingface.co\u002Fmistralai\u002FVoxtral-4B-TTS-2603) | Ministral-3B AR (26L GQA) + 3L FM acoustic transformer (7-step Euler ODE) + Voxtral codec decoder at 24 kHz; 20 preset voices; SOTA French technical text | en, fr, de, es, it, pt, nl, ar, hi | CC&#8209;BY&#8209;NC&#8209;4.0 |\n| **cosyvoice3-tts** | [`cstr\u002Fcosyvoice3-0.5b-2512-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fcosyvoice3-0.5b-2512-GGUF) | Qwen2-0.5B AR speech-token LM + DiT-CFM (10-step Euler) + HiFT (NSF + iSTFT) at 24 kHz; baked-voice zero-shot cloning via `--voice \u003Cname>` | 9 langs + 18 zh dialects | Apache-2.0 |\n| **csm** | [`cstr\u002Fcsm-1b-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fcsm-1b-GGUF) | Sesame CSM-1B conversational TTS: Llama-3.2 1B backbone + 100M depth decoder (32-codebook RVQ) + Kyutai Mimi codec at 24 kHz ([more](docs\u002Farchitecture.md#csm)) | en | Apache-2.0 |\n| **lfm2-audio** | [`cstr\u002Flfm2-audio-1.5b-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Flfm2-audio-1.5b-GGUF) + [`jp`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Flfm2-audio-1.5b-jp-GGUF) | LFM2.5-Audio ASR+TTS+S2S: FastConformer enc + LFM2 hybrid backbone + depthformer (8-codebook Mimi) + ISTFT detokenizer at 24 kHz; interleaved text+audio generation | en, ja | LFM Open v1.0 |\n| **dia** | [`nari-labs\u002FDia-1.6B`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fdia-1.6b-GGUF) | Byte-level text encoder (12L) + AR audio decoder (18L GQA + CFG) → 9 delayed DAC codebooks + 44.1 kHz DAC codec; dialogue style with `[S1]`\u002F`[S2]` tags (use >100-char prompts) | en | Apache-2.0 |\n| **zonos-tts** | [`cstr\u002Fzonos-v0.1-transformer-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fzonos-v0.1-transformer-GGUF) + [`cstr\u002Fdac-44khz-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fdac-44khz-GGUF) | Zyphra Zonos-v0.1: 26L GQA AR transformer (2B) + 9-codebook DAC @ 44.1 kHz; CFG-guided; voice cloning via reference WAV ([more](docs\u002Farchitecture.md#zonos-tts)) | en | Apache-2.0 |\n| **bark** | [`cstr\u002Fbark-small-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fbark-small-GGUF) | Suno Bark 3-stage GPT-2 TTS: text→semantic (12L) → coarse EnCodec (12L, 2 codebooks) → fine (12L, 8 codebooks) → EnCodec 24 kHz decoder; speaker conditioning via `.npz` prompts (`--voice \u003Cfile.npz>`) | multilingual | MIT |\n| **speecht5** | [`cstr\u002Fspeecht5-tts-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fspeecht5-tts-GGUF) | SpeechT5 80M: char-level encoder (12L) + AR mel decoder (6L) + 5-layer conv postnet + HiFi-GAN at 16 kHz; speaker via 512-d x-vector (`--voice \u003Cxvector.bin>`) | en | MIT |\n| **fastpitch** | [`cstr\u002Ffastpitch-en-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Ffastpitch-en-GGUF) | NVIDIA FastPitch 60M: non-autoregressive parallel TTS — 6L encoder + duration\u002Fpitch predictors + 6L decoder + HiFi-GAN at 22 kHz; deterministic, single forward pass ([more](docs\u002Farchitecture.md#fastpitch)) | en | CC-BY-4.0 |\n| **bananamind-tts** | `Banaxi-Tech\u002FBananaMind-TTS-V2.1-Preview` | BananaMind-TTS 13M: Tacotron-lite char-level encoder (Conv+BN+BiLSTM) + AR GRU decoder with location-sensitive attention + postnet + HiFi-GAN at 22 kHz; fixed voice per locale ([more](docs\u002Farchitecture.md#bananamind-tts)) | en, de | Apache-2.0 |\n| **parler-tts** | [`cstr\u002Fparler-tts-mini-v1.1-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fparler-tts-mini-v1.1-GGUF) | Parler TTS Mini v1.1 (~900M): T5 encoder + MusicGen decoder + DAC 44.1 kHz; prompt-conditioned (describe voice in text via `--instruct`) | en | Apache-2.0 |\n| **outetts** | [`cstr\u002Foutetts-0.3-1b-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Foutetts-0.3-1b-GGUF) | OLMo-1B talker + WavTokenizer single-codebook VQ-GAN at 24 kHz; voice cloning via speaker profile JSON (`--voice \u003Cspeaker.json>`) | en | CC-BY-4.0 |\n| **pocket-tts** | [`cstr\u002Fpocket-tts-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fpocket-tts-GGUF) | Kyutai Pocket TTS 100M: continuous-latent AR at 12.5 Hz + one-step LSD flow + Mimi VAE 24 kHz; voice cloning via ref audio ([more](docs\u002Farchitecture.md#pocket-tts)) | en | MIT \u002F CC-BY-4.0 |\n| **tada** | [`cstr\u002Ftada-tts-1b-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Ftada-tts-1b-GGUF) + `HumeAI\u002Ftada-3b-ml` | Llama-3.2 1B\u002F3B backbone + per-token FM diffusion head + TADA codec at 24 kHz; 1:1 text-to-acoustic alignment; default prompt via `tada-ref.gguf`, custom voices via `--voice \u003Ctada-ref.gguf>` built with `models\u002Fconvert-tada-ref-to-gguf.py` ([more](docs\u002Farchitecture.md#tada)) | en | — |\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>TTS feature matrix\u003C\u002Fb>\u003C\u002Fsummary>\n\n| Backend | Voice cloning | Sampling | kHz | Auto-download | Flash attn |\n|---------|:---:|:---:|:---:|:---:|:---:|\n| vibevoice-tts | yes | temp | 24 | yes | yes |\n| qwen3-tts | yes* | temp | 24 | yes | yes |\n| omnivoice | yes | temp | 24 | — | — |\n| kokoro | — | — | 24 | yes | — |\n| orpheus | — | temp | 24 | yes | yes |\n| chatterbox | yes | temp | 24 | yes | yes |\n| outetts | yes (JSON) | temp | 24 | yes | yes |\n| indextts | yes | temp | 24 | yes | yes |\n| voxcpm2-tts | yes | — | 48 | yes | — |\n| cosyvoice3-tts | yes | temp | 24 | yes | yes |\n| f5-tts | yes | — | 24 | yes | — |\n| irodori-tts | yes (WAV) | VoiceDesign: `--instruct` | 48 | yes | — |\n| csm | — | temp | 24 | yes | — |\n| dia | — | temp | 44 | yes | — |\n| bark | yes (.npz) | temp | 24 | yes | — |\n| speecht5 | yes (xvec) | — | 16 | yes | — |\n| parler-tts | — | temp | 44 | yes | — |\n| fastpitch | — | — | 22 | — | — |\n| piper | — | — | 22 | — | — |\n| pocket-tts | yes | temp | 24 | yes | — |\n| tada | yes | temp | 24 | yes | — |\n| dots-tts | yes | — | 48 | yes | — |\n\n\\* CustomVoice variant only; Base uses baked speakers via `--voice \u003Cname>`.\n\n\u003C\u002Fdetails>\n\n### Translation\n\nText-to-text translation, distinct from the audio-side `--translate`\nflag (which routes audio → English text on whisper \u002F canary \u002F etc.).\nDriven by `--text \"...\" -sl \u003Csrc> -tl \u003Ctgt>`.\n\n| Backend | Models | Architecture | Languages | License |\n|---|---|---|---|---|\n| **m2m100** | [`facebook\u002Fm2m100_418M`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fm2m100-418m-GGUF) | 12L enc + 12L dec transformer, SentencePiece 128K ([more](docs\u002Farchitecture.md#m2m100--wmt21)) | 100 langs, any-to-any | MIT |\n| **m2m100-wmt21** | [`facebook\u002Fwmt21-dense-24-wide-en-x`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fwmt21-dense-24-wide-en-x-GGUF) + [`facebook\u002Fwmt21-dense-24-wide-x-en`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fwmt21-dense-24-wide-x-en-GGUF) | Same as m2m100, scaled to 4.7B (24L enc) ([more](docs\u002Farchitecture.md#m2m100--wmt21)) | English ↔ 7 langs (separate `en-x` \u002F `x-en` checkpoints) | MIT |\n| **madlad** | [`google\u002Fmadlad400-3b-mt`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fmadlad400-3b-mt-GGUF) | T5 enc-dec (12L+12L, d=2048, gated-GELU, RMSNorm) ([more](docs\u002Farchitecture.md#madlad)) | 419 languages | Apache-2.0 |\n\n```bash\n# m2m100 base (production-ready)\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend m2m100 -m auto \\\n    --text \"Hello world, how are you today?\" \\\n    -sl en -tl de\n# → Hallo Welt, wie bist du heute?\n\n# WMT21 dense (English ↔ X, 4.7B — auto-downloads ~2.5 GB).\n# Two separate checkpoints: en-x for English-source, x-en for\n# English-target. Pick the one matching your `-sl`\u002F`-tl` direction\n# (or pass an explicit `-m \u003Cpath>` to load the other manually).\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend m2m100-wmt21 -m auto \\\n    --text \"The president said he would not attend.\" \\\n    -sl en -tl de   # uses wmt21-dense-24-wide-en-x\n\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend m2m100-wmt21 \\\n    -m models\u002Fwmt21-dense-24-wide-x-en-q4_k.gguf \\\n    --text \"Le président a dit qu'il ne serait pas présent.\" \\\n    -sl fr -tl en   # uses wmt21-dense-24-wide-x-en\n\n# MADLAD-400 3B (419 languages, bit-token-identical to Python SP)\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend madlad -m auto \\\n    --text \"Hello world.\" \\\n    -sl en -tl ta\n```\n\nFor 2-stage pipelines (e.g., ASR → m2m100), use the dedicated\n`--tr-sl` \u002F `--tr-tl` flags; they fall back to `-sl` \u002F `-tl` when\nunset, so single-stage standalone usage is just `-sl\u002F-tl`.\n\n### Post-processing models\n\nWork with all backends.\n\n| Model | Task | Architecture | Languages | License | HuggingFace |\n|---|---|---|---|---|---|\n| **FireRedPunc** | Punctuation restoration | BERT-base (12L, d=768), 5 classes | Chinese + English | Apache-2.0 | [`cstr\u002Ffireredpunc-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Ffireredpunc-GGUF) |\n| **fullstop-punc** | Punctuation restoration | XLM-RoBERTa-large (24L, d=1024), 6 classes | EN, DE, FR, IT | MIT | [`cstr\u002Ffullstop-punc-multilang-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Ffullstop-punc-multilang-GGUF) |\n| **punctuate-all** | Punctuation restoration | XLM-RoBERTa-base (12L, d=768), 6 classes | 12 languages | MIT | [`cstr\u002Fpunctuate-all-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fpunctuate-all-GGUF) |\n| **PCS** | Punc + truecase + SBD | XLM-RoBERTa-base (12L), 4 heads | 47 languages | Apache-2.0 | `--punc-model pcs` |\n| **truecaser&#8209;lstm** | German truecasing (best) | BiLSTM char-level (2×150, 3.2 MB, 97.9% F1) | German | Apache-2.0 | `--truecase-model lstm` |\n| **truecaser&#8209;crf** | German truecasing | CRF + context features (8.5 MB) | German | MIT | `--truecase-model crf` |\n| **truecaser&#8209;de** | German truecasing (simple) | Statistical word-frequency (71K entries, 1.7 MB) | German | MIT | `--truecase-model auto` |\n| **CLD3** | Text language ID | Embedding-bag → FC + ReLU → softmax (~1.5 MB F32) | 109 ISO 639-1 | Apache-2.0 | [`cstr\u002Fcld3-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fcld3-GGUF) |\n| **GlotLID-V3** | Text language ID | fastText supervised, flat softmax | 2102 ISO 639-3 + script | Apache-2.0 | [`cstr\u002Fglotlid-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fglotlid-GGUF) |\n| **LID-176** | Text language ID | fastText supervised, hierarchical softmax | 176 ISO 639-1 | CC-BY-SA-3.0 | [`cstr\u002Ffasttext-lid176-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Ffasttext-lid176-GGUF) |\n\nAll runtimes share ggml-based inference. The speech-LLM backends (**qwen3**, **voxtral**, **voxtral4b**, **granite**, **glm-asr**, **kyutai-stt**) inject audio encoder frames directly into an autoregressive language model's input embeddings, instead of using a dedicated CTC\u002Ftransducer\u002Fseq2seq decoder. The **fastconformer-ctc** backend hosts the NeMo FastConformer-CTC standalone ASR family — `stt_en_fastconformer_ctc_{large,xlarge,xxlarge}` and the architecturally-identical `parakeet-ctc-{0.6b,1.1b}` (different training data + tokenizer, same encoder + head shape) — with greedy CTC decoding. Same C++ runtime as the canary-ctc aligner.\n\n## Feature matrix\n\nRun `crispasr --list-backends` to see it live. Each backend declares capabilities at runtime; if you ask for a feature the selected backend does not support, CrispASR prints a warning and silently ignores the flag.\n\n**Sortable \u002F filterable view:** [`docs\u002Ffeature-matrix.html`](docs\u002Ffeature-matrix.html) — click any column header to sort, type to filter rows, click cap pills to require a capability. Generated from `crispasr --list-backends-json` (single source of truth — drift impossible). Regenerate via `python tools\u002Fgen-feature-matrix.py`. A Markdown twin lives at [`docs\u002Ffeature-matrix.md`](docs\u002Ffeature-matrix.md).\n\nThe static table below is a curated subset focusing on the ASR backends and the cross-cutting features that matter for ASR pipelines. The full 91-backend × 21-cap surface is in the generated views.\n\n\u003C!-- Generated from `crispasr --list-backends` + cross-cutting features. -->\n\n| Feature | whisper | parakeet | canary | cohere | granite | granite&#8209;4.1 | voxtral | voxtral4b | qwen3 | fc&#8209;ctc | wav2vec2 | glm&#8209;asr | kyutai&#8209;stt | firered | moonshine | moon&#8209;stream | omniasr | omniasr&#8209;llm | vibevoice | gemma4&#8209;e2b | mimo&#8209;asr | funasr | paraformer | sensevoice |\n|---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|\n| Native timestamps | ✔ | ✔ | ✔ | ✔ | | | | | | | | | ✔ | | | | | | | | | | | |\n| CTC timestamps | | | ✔ | | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |\n| Word-level timing | ✔ | ✔ | ✔ | ✔ | `-am` | ✔† | `-am` | `-am` | `-am` | `-am` | `-am` | `-am` | ✔ | `-am` | `-am` | `-am` | `-am` | `-am` | | `-am` | `-am` | `-am` | | `-am` |\n| Per-token confidence | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | | | ✔ | ✔ | | |\n| Language auto-detect | ✔ | ✔ | LID | LID | LID | LID | LID | LID | ✔ | LID | LID | ✔ | LID | LID | LID | LID | LID | LID | LID | ✔ | LID | LID | LID | ✔ |\n| Speech translation | ✔ | | ✔ | | ✔ | ✔ | ✔ | | ✔ | | | | | | | | | | | | | | | |\n| Speaker diarization | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |\n| Grammar (GBNF) | ✔ | | | | | | | | | | | | | | | | | | | | | | | |\n| Temperature sampling | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | | | ✔ | ✔ | | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | | |\n| Beam search | ✔ | | | | ✔ | ✔ | ✔ | | ✔ | | | ✔ | ✔ | ✔ | ✔ | | ✔ | ✔ | | | | | | |\n| Flash attention | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | | | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |\n| Punctuation toggle | | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | | | ✔ | ✔ | | ✔ | | ✔ | ✔ | | | | ✔ | | ✔ |\n| Punc restoration | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp | pp |\n| Source \u002F target language | | | ✔ | | ✔ | ✔ | ✔ | | ✔ | | | | | | | | | | | | | | | |\n| Audio Q&A (`--ask`) | | | | | * | * | ✔ | | * | | | * | | | | | | | | * | * | | | |\n| Streaming | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |\n| Auto-download (`-m auto`) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |\n| KV quant (`CRISPASR_KV_QUANT`, plus per-half `_K` \u002F `_V`) | | | | | ✔ | ✔ | ✔ | ✔ | ✔ | | | ✔ | | | | | | ✔ | | ✔ | ✔ | ✔ | | |\n| mmap weights (`CRISPASR_GGUF_MMAP`) | | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |\n| TTS | | | | | | | | | | | | | | | | | | | ✔ | | | | | |\n\nThe matrix above covers 24 ASR backends. **Additional ASR backends** not shown: `nemotron` (39-lang streaming ASR with cache-aware FastConformer + RNN-T), `lfm2-audio` (ASR + TTS + S2S in one model), `moss-audio` (audio understanding + ASR), `moss-transcribe` (Qwen3-Omni encoder + Qwen3-1.7B ASR), `mini-omni2` (ASR + TTS + S2S), `kugelaudio` (7B audio understanding). See [`docs\u002Ffeature-matrix.md`](docs\u002Ffeature-matrix.md) for the full 85-backend matrix. **TTS-only backends** (`kokoro`, `qwen3-tts` + variants, `vibevoice-tts`, `orpheus` + DE variants, `chatterbox` \u002F `chatterbox-turbo` \u002F `kartoffelbox-turbo` \u002F `lahgtna-chatterbox`, `dia`, `bark`, `outetts`, `zonos`, `csm`, `f5-tts`, `irodori-tts`, `parler-tts`, `speecht5`, `piper`, `fastpitch`, `pocket-tts`, `melotts`, `cosyvoice3`, `voxcpm2`, `tada-tts`) all carry the TTS, AUTO_DOWNLOAD, TEMPERATURE, and FLASH_ATTN caps; per-backend cloning + voice-pack support is documented in the [Text-to-Speech models](#text-to-speech-models) table above and [`docs\u002Ftts.md`](docs\u002Ftts.md). The vibevoice and lfm2-audio columns mark dual-mode (ASR + TTS) backends.\n\n**Key:** ✔ = native\u002Fbuilt-in, `-am` = via CTC forced aligner (`-am canary-ctc-aligner.gguf` or `-am qwen3-forced-aligner.gguf`), **LID** = via external language identification pre-step (`-l auto`), **pp** = via `--punc-model` post-processor (FireRedPunc or fullstop-punc), * = experimental or partial support, † = PLUS variant only (native `[T:N]` word timestamps with `-owts`; base uses `-am`). granite-4.1 covers both the regular and `-plus` variants; granite-4.1-nar is a non-autoregressive variant with encoder+projector only (no LLM decode features). The **KV quant** row marks backends that honor `CRISPASR_KV_QUANT={f16,q8_0,q4_0}` — CTC-style backends without a KV cache (parakeet, fc-ctc, wav2vec2, kyutai-stt, firered, moonshine variants, omniasr-CTC) don't apply. The same backends also honor the per-half `CRISPASR_KV_QUANT_K` \u002F `CRISPASR_KV_QUANT_V` overrides (llama.cpp `--cache-type-k` \u002F `--cache-type-v` parity) for asymmetric K-vs-V precision; common recipe `K=q8_0 V=q4_0` saves ~40 % more KV memory than symmetric Q8_0. The **mmap weights** row marks backends consuming `core_gguf::load_weights()` and therefore honoring `CRISPASR_GGUF_MMAP=1`; whisper itself uses upstream's loader and is unaffected. See [`docs\u002Fcli.md`](docs\u002Fcli.md) Memory footprint for usage + recommended combos.\n\n**Speaker diarization** as a post-processing step via `--diarize`:\n- `energy` \u002F `xcorr` — stereo-only, no extra deps\n- `pyannote` — native GGUF (no Python, no sherpa-onnx); add `--diarize-embedder auto` (TitaNet) or `--diarize-embedder indextts` (ECAPA-TDNN) for globally stable speaker IDs across long files\n- `sherpa` \u002F `ecapa` — external [sherpa-onnx](https:\u002F\u002Fgithub.com\u002Fk2-fsa\u002Fsherpa-onnx) subprocess; runs once globally on full audio for consistent speaker IDs (#110)\n- `vad-turns` — mono-friendly gap-based proxy\n\nThe server endpoint supports `response_format=diarized_json` for structured speaker-labelled output with normalised speaker letters (A, B, C …) — see [`docs\u002Fserver.md`](docs\u002Fserver.md#diarized-json-format-206).\n\nFull reference + tuning knobs (cluster threshold, max speakers, pluggable embedder adapters): see [`docs\u002Fcli.md#diarization`](docs\u002Fcli.md#diarization).\n\n**Language identification** for backends without native LID: `--lid-backend whisper` (default, 75 MB ggml-tiny.bin), `--lid-backend silero` (native GGUF, 16 MB, 95 languages), or `--lid-backend firered` (FireRedLID, 1.7 GB, 120 languages — Conformer encoder + Transformer decoder).\n\n**Voice activity detection**: `--vad` uses the default Silero VAD (~885 KB, auto-downloaded). Each VAD segment is transcribed independently, producing separate SRT\u002FVTT entries with correct timestamps. Use `--vad --split-on-punct` for best subtitle output. Four VAD backends: Silero (default), FireRedVAD (`-vm firered`, recommended), MarbleNet (`-vm marblenet`, 439 KB, 6 languages), Whisper-VAD-EncDec (`-vm whisper-vad`, experimental).\n\n**Punctuation restoration** (`--punc-model`): CTC-based backends output lowercase without punctuation. Named shortcuts: `auto`\u002F`firered` (Chinese+English), `fullstop` (EN\u002FDE\u002FFR\u002FIT, XLM-R-large), `punctuate-all` (12 languages, XLM-R-base), `pcs` (47 languages, punc + truecasing + sentence boundary detection in one model). Or pass a GGUF path directly. Also available via Python\u002FRust\u002FDart wrappers (`crispasr.PuncModel`).\n\n**Truecasing** (`--truecase-model`): Restore German noun\u002Fname capitalization in lowercase ASR output. Three options in ascending quality: `auto` (statistical, 9 MB), `crf` (CRF with context, 24 MB), `lstm` (BiLSTM char-level, 3.2 MB, **recommended** — 97.9% F1, handles adjective\u002Fnoun distinction and formal \"Ihnen\"). All auto-download from [`cstr\u002Ftruecaser-de`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Ftruecaser-de). Or use `--punc-model pcs` for neural punc + truecasing in one pass (47 languages).\n\n\u003Cdetails>\n\u003Csummary>Which backends produce punctuation natively?\u003C\u002Fsummary>\n\n| Backend | Punctuation | Capitalization | Notes |\n|---|:-:|:-:|---|\n| whisper | ✔ | ✔ | Full punctuation and casing |\n| parakeet | ✔ | ✔ | |\n| canary | ✔ | ✔ | |\n| cohere | ✔ | ✔ | Toggleable via `--no-punctuation` |\n| granite | ✔ | ✔ | LLM output |\n| voxtral | ✔ | ✔ | LLM output |\n| voxtral4b | ✔ | ✔ | LLM output |\n| qwen3 | ✔ | ✔ | LLM output |\n| funasr | ✔ | ✔ | LLM output (Qwen3-0.6B decoder). Chinese chars carry full-width period; mlt-nano variant adds Latin-script casing + punctuation. |\n| sensevoice | ✔ | ✔ | CTC output with native ITN — toggle via `--punctuation` \u002F `--no-punctuation`, controls Arabic-digit vs spelled-out numerals + comma\u002Fperiod emission. |\n| paraformer | **no** | **no** | NAR character-level output — add `--punc-model` |\n| glm-asr | ✔ | ✔ | LLM output |\n| kyutai-stt | ✔ | ✔ | LLM output |\n| moonshine | ✔ | ✔ | Encoder-decoder output |\n| **fastconformer-ctc** | **no** | **no** | CTC — add `--punc-model` |\n| **wav2vec2** | **no** | **no** | CTC — add `--punc-model` |\n| **firered-asr** | **no** | **no** | CTC — add `--punc-model` |\n| **omniasr** (CTC) | **no** | **no** | CTC — add `--punc-model` |\n| **omniasr** (LLM) | ✔ | ✔ | Autoregressive decoder |\n\nOther freely-licensed alternatives that could be added: [felflare\u002Fbert-restore-punctuation](https:\u002F\u002Fhuggingface.co\u002Ffelflare\u002Fbert-restore-punctuation) (MIT, English, includes truecasing), [xashru\u002Fpunctuation-restoration](https:\u002F\u002Fgithub.com\u002Fxashru\u002Fpunctuation-restoration) (Apache-2.0, 40+ languages, BiLSTM-CRF).\n\n\u003C\u002Fdetails>\n\n**Progressive subtitle output** (`--flush-after`): By default, non-whisper backends buffer all segments and print output at the end. For real-time subtitle consumption (PotPlayer, custom media players), use `--flush-after 1` to print each SRT entry to stdout immediately after its VAD segment is transcribed:\n\n```bash\ncrispasr --backend parakeet -m parakeet.gguf --vad --flush-after 1 -osrt -f long_audio.wav\n# SRT entries appear progressively as each segment finishes\n```\n\n**JSON output with language detection**: When using `-l auto -oj`, the JSON output includes detected language info:\n```json\n{\n  \"crispasr\": {\n    \"backend\": \"cohere\",\n    \"language\": \"en\",\n    \"language_detected\": \"en\",\n    \"language_confidence\": 0.977,\n    \"language_source\": \"ecapa\"\n  },\n  \"transcription\": [...]\n}\n```\n\n### Which backend should I pick?\n\n| Need | Pick |\n|---|---|\n| Battle-tested, all features exposed | **whisper** |\n| Lowest English WER | **cohere** |\n| **Fastest** (16x realtime on CPU) | **moonshine** (tiny), **fc-ctc** (10x) |\n| Multilingual + word timestamps + fast | **parakeet** (2.9x RT) |\n| Multilingual with **explicit language control** | **canary** |\n| **Speech translation** (X→en or en→X) | **canary**, **voxtral**, **qwen3** |\n| **30 languages + Chinese dialects** | **qwen3** |\n| **1600+ languages** | **omniasr** (CTC or LLM) |\n| **Realtime streaming ASR** (native incremental encoder, ~2× RT feed; sub-second-token target deferred to phase 2) | **voxtral4b** |\n| Highest-quality offline speech-LLM | **voxtral** |\n| Apache-licensed speech-LLM | **granite**, **voxtral**, **qwen3**, **omniasr-llm** |\n| **Lightweight CTC-only** (fast, no decoder) | **wav2vec2**, **fc-ctc**, **data2vec**, **omniasr** |\n| **Mandarin + Chinese dialects** | **firered-asr**, **qwen3**, **glm-asr**, **funasr**, **paraformer**, **sensevoice** |\n| **Multilingual (31 langs) speech-LLM** | **fun-asr-mlt-nano**, **qwen3**, **omniasr-llm**, **gemma4-e2b** |\n| **Multilingual (50+ langs) + LID + emotion + audio-event in one pass** | **sensevoice** (encoder-only CTC, non-AR, 15× faster than Whisper-Large) |\n\n### CPU performance tips\n\nAudio-LLM backends (`qwen3`, `voxtral`, `granite`, `glm-asr`, etc.) run full\ntransformer decoder stacks (28+ layers, 2048-dim) and are **dramatically slower\non CPU** than encoder-only backends. On older dual-core hardware they can drop\nbelow 0.01× realtime. If you're on CPU-only hardware:\n\n- Prefer **moonshine** (16× RT), **fc-ctc** (10× RT), **parakeet** (2.9× RT),\n  or **whisper** for usable speeds.\n- Use `--flush-after 1` to see results as each VAD slice completes instead of\n  waiting for the entire file.\n- Use `-pp` \u002F `--print-progress` for per-slice progress indicators on all\n  backends (unified backends show slice-level progress; whisper shows\n  encoder-level progress).\n- Quantize models to Q4_K or Q5_K to reduce memory and compute.\n\n### Language detection for backends that don't do it natively\n\nCohere, canary, granite, voxtral and voxtral4b need an explicit\nlanguage code up front. If you don't know the language, pass\n`-l auto` and crispasr runs an optional LID pre-step before the main\ntranscribe() call:\n\n```bash\n# Downloads ggml-tiny.bin (75 MB, 99 languages) on first use\ncrispasr --backend cohere -m $TC\u002Fcohere-transcribe-q5_0.gguf \\\n         -f unknown.wav -l auto\n# crispasr[lid]: detected 'en' (p=0.977) via whisper-tiny\n# crispasr: LID -> language = 'en' (whisper, p=0.977)\n```\n\nThese LID providers are available:\n\n- `--lid-backend whisper` (default) — uses a small multilingual ggml-*.bin model via the crispasr C API. Auto-downloads ~75 MB on first use. 99 languages.\n- `--lid-backend silero` — native GGUF port of Silero's 95-language classifier. 16 MB F32. Runs as a ggml graph (multi-threaded SIMD on CPU, GPU offload on Metal\u002FCUDA; on Vulkan the graph is routed to CPU pending an upstream kernel fix). Analyzes the first 30 s of audio (`CRISPASR_SILERO_LID_MAX_S` overrides); `CRISPASR_SILERO_LID_LEGACY=1` restores the old scalar path.\n- `--lid-backend ecapa` — **recommended**: ECAPA-TDNN (Apache-2.0). Purpose-built for language ID. Very high accuracy on TTS benchmark. Two variants via `--lid-model`:\n  - [`cstr\u002Fecapa-lid-107-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fecapa-lid-107-GGUF) — VoxLingua107, 43 MB F16, 107 languages, ISO codes (en, de, ...). **Default.**\n  - [`cstr\u002Fecapa-lid-commonlanguage-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fecapa-lid-commonlanguage-GGUF) — CommonLanguage, 40 MB F16, 45 languages, full names (English, German, ...).\n- `--lid-backend firered` — FireRedLID (Conformer encoder + Transformer decoder). Q4_K (544 MB), 120 languages including Chinese dialects. Slower but covers more languages.\n\nThese VAD providers are available:\n\n- **Silero VAD** (default) — ~885 KB, auto-downloaded via `--vad`. Industry-standard, well-tested.\n- **FireRedVAD** — DFSMN-based, 2.4 MB, F1=97.57%. Pass `--vad -vm firered` to auto-download. Recommended.\n- **MarbleNet** — NVIDIA 1D separable CNN, 439 KB, 6 languages (EN\u002FDE\u002FFR\u002FES\u002FRU\u002FZH). Pass `--vad -vm marblenet` to auto-download. Smallest model. ([`cstr\u002Fmarblenet-vad-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fmarblenet-vad-GGUF))\n- **Whisper-VAD-EncDec** *(experimental)* — Whisper-base encoder + TransformerDecoder head, 22 MB Q4_K. Trained on Japanese ASMR; may not generalise well to all domains. Pass `--vad -vm whisper-vad`. Slower than others (~1s vs ~50ms). ([`cstr\u002Fwhisper-vad-encdec-asmr-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fwhisper-vad-encdec-asmr-GGUF))\n\nPass `--lid-backend off` to skip LID entirely.\n\n### Text language identification (post-ASR \u002F standalone)\n\nAudio LID (above) tags **what was spoken**; text LID tags **what was\nwritten**. Text LID runs on a transcript or any UTF-8 string and is\nuseful for routing post-ASR pipelines (translation, punctuation, sub\nselection) without re-running an audio model. Three GGUF families,\none binary — the dispatcher picks by `general.architecture`:\n\n| Backend | Labels | Size (F16) | License | HF repo |\n|---|---:|---:|---|---|\n| **CLD3** (Google compact language detector v3) | 109 ISO 639-1 | **440 KB** | Apache-2.0 | [`cstr\u002Fcld3-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fcld3-GGUF) |\n| **GlotLID-V3** (cis-lmu fastText) | 2102 ISO 639-3 + script | 250 MB | Apache-2.0 | [`cstr\u002Fglotlid-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fglotlid-GGUF) |\n| **LID-176** (Facebook fastText) | 176 ISO 639-1 | 63 MB | CC-BY-SA-3.0¹ | [`cstr\u002Ffasttext-lid176-GGUF`](https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Ffasttext-lid176-GGUF) |\n\n¹ LID-176 is **CC-BY-SA-3.0 (viral)** — redistributors of the GGUF\ninherit ShareAlike. CLD3 + GlotLID-V3 are Apache-2.0 with no such\nconstraint. Pick CLD3 for the smallest, fastest path; GlotLID for\nmaximum coverage (low-resource languages); LID-176 only if you need\nits specific 176-label space and accept the SA obligation.\n\n**Standalone CLI** — auto-routes by GGUF arch, with auto-download:\n\n```bash\ncrispasr-lid -m auto --text \"Bonjour le monde\"        # → cstr\u002Fcld3-GGUF (default, ~440 KB)\ncrispasr-lid -m auto:glotlid --text \"Bonjour le monde\" -k 5\ncrispasr-lid -m auto:lid-fasttext176 --text \"Hallo Welt\"\n# Or pass an explicit path \u002F canonical filename (looked up in the registry):\ncrispasr-lid -m cld3-f16.gguf --text \"你好世界\"\n# zh\t0.997816\necho \"Привет мир\" | crispasr-lid -m auto --quiet\n# ru\t0.907322\n```\n\n**Post-ASR pipeline** — `--lid-on-transcript` runs the same dispatcher\non the assembled transcript (also accepts `auto[:variant]`):\n\n```bash\ncrispasr -m ggml-tiny.bin -f speech.wav --lid-on-transcript auto\n# (transcript on stdout)\n# lang=de\tconf=0.997123\tbackend=lid-cld3\n```\n\nThe dispatcher (`src\u002Ftext_lid_dispatch.{h,cpp}`) is a thin C ABI\nfaçade — one integer compare per call; per-stage diff harness is\ngreen at cos≥0.999 across 8 multilingual smoke samples.\n\n---\n\n## Install & build\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FCrispStrobe\u002FCrispASR\ncd CrispASR\ncmake -B build -DCMAKE_BUILD_TYPE=Release\ncmake --build build -j$(nproc)\n```\n\nProduces `build\u002Fbin\u002Fcrispasr` (main CLI), `build\u002Fbin\u002Fcrispasr-quantize`,\nand `build\u002Fbin\u002Fcrispasr-diff`. No Python, PyTorch, or pip required at\nruntime — just a C++17 compiler and CMake 3.14+.\n\nFor GPU acceleration, add the matching ggml flag at configure time:\n\n```bash\ncmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON     # NVIDIA\ncmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_METAL=ON    # Apple Silicon\ncmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_VULKAN=ON   # cross-vendor\n```\n\n**See [`docs\u002Finstall.md`](docs\u002Finstall.md)** for the full guide:\nall GPU backends (CUDA \u002F Metal \u002F Vulkan \u002F MUSA \u002F SYCL), Windows\nconvenience scripts, ffmpeg ingestion, optional BLAS, glibc notes,\nand the `scripts\u002Fdev-build.sh` wrapper.\n\n---\n\n## Quick start\n\nASR examples below; for TTS see the [Text-to-Speech](#text-to-speech-tts) section.\n\n### Whisper (historical path, byte-identical to upstream whisper.cpp)\n\n```bash\n# Download a whisper model (same as upstream whisper.cpp)\n.\u002Fmodels\u002Fdownload-ggml-model.sh base.en\n\n.\u002Fbuild\u002Fbin\u002Fcrispasr -m models\u002Fggml-base.en.bin -f samples\u002Fjfk.wav\n# [00:00:00.000 --> 00:00:07.940]   And so my fellow Americans ask not what your country can do for you\n# [00:00:07.940 --> 00:00:10.760]   ask what you can do for your country.\n```\n\n### Parakeet (multilingual, free word timestamps, fastest)\n\n```bash\n# Grab the quantized model (~467 MB)\ncurl -L -o parakeet.gguf \\\n    https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fparakeet-tdt-0.6b-v3-GGUF\u002Fresolve\u002Fmain\u002Fparakeet-tdt-0.6b-v3-q4_k.gguf\n\n.\u002Fbuild\u002Fbin\u002Fcrispasr -m parakeet.gguf -f samples\u002Fjfk.wav\n# Auto-detected backend 'parakeet' from GGUF metadata.\n# And so, my fellow Americans, ask not what your country can do for you, ask what you can do for your country.\n\n# Word-level timestamps (one line per word)\n.\u002Fbuild\u002Fbin\u002Fcrispasr -m parakeet.gguf -f samples\u002Fjfk.wav -ml 1\n```\n\n### Canary (explicit language, speech translation)\n\n```bash\n# Transcription (source == target)\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend canary -m canary-1b-v2-q5_0.gguf -f audio.de.wav -sl de -tl de\n\n# Translation (German speech → English text)\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend canary -m canary-1b-v2-q5_0.gguf -f audio.de.wav -sl de -tl en\n\n# ...or use the familiar crispasr flag:\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend canary -m canary-1b-v2-q5_0.gguf -f audio.de.wav -l de --translate\n```\n\n### Voxtral (speech-LLM with auto-download)\n\n```bash\n# First run downloads ~2.5 GB to ~\u002F.cache\u002Fcrispasr\u002F via curl, then runs\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend voxtral -m auto -f samples\u002Fjfk.wav\n\n# Subsequent runs use the cached file\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend voxtral -m auto -f samples\u002Fjfk.wav -l en\n```\n\n### Qwen3-ASR (30 languages + Chinese dialects)\n\n```bash\n# 0.6B (default, ~500 MB)\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend qwen3 -m auto -f audio.zh.wav\n\n# 1.7B (higher quality, ~1.3 GB) — supports both -hf and non-hf source models\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend qwen3 -m qwen3-1.7b --auto-download -f audio.wav\n\n# Japanese anime\u002Fgalgame fine-tune (~1.3 GB)\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend qwen3 -m qwen3-ja-anime --auto-download -f anime.wav\n```\n\n**Long audio:** the default is safe 30 s chunking. `--chunk-seconds 0` decodes\nthe whole file in ONE pass (matches the reference model verbatim on multi-minute\nclips, #218) — but the encoder's full attention is O(N²) in audio length, so\nkeep single-pass clips under ~10 minutes on 16 GB machines. For long-form use\nprefer the plain `-q4_k`\u002F`-q8_0` GGUFs over the `-imatrix` variants (see the\nmodel card).\n\n### GLM-ASR-Nano (Mandarin + dialects + Cantonese + English, 1.5B)\n\n```bash\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend glm-asr -m auto -f audio.wav\n\n# Long audio in one pass (up to 655 s — 30 s encoder windows, one LLM prompt,\n# same layout as the HF\u002Fzai reference; matches it verbatim on the #218 clip):\n.\u002Fbuild\u002Fbin\u002Fcrispasr --backend glm-asr -m auto --chunk-seconds 0 -f long.wav\n```\n\nNote: in single-pass mode the model (like the reference) skips leading\nnon-speech audio; the default 30 s-chunked mode transcribes more of such\nclips. Custom `--ask` \u002F non-English `--language` instructions need a GGUF\nwith baked BPE merges (re-published 2026-07; older GGUFs fall back to the\ndefault transcription prompt with a warning).\n\n### MiMo-V2.5-ASR (Mandarin + dialects + English, 7.5B Qwen2 LM)\n\n```bash\n# Download the LM + audio tokenizer (the tokenizer is a separate model)\nhuggingface-cli download cstr\u002Fmimo-asr-GGUF mimo-asr-q4_k.gguf \\\n    --local-dir ~\u002F.cache\u002Fcrispasr\nhuggingface-cli download cstr\u002Fmimo-tokenizer-GGUF mimo-tokenizer-q4_k.gguf \\\n    --local-dir ~\u002F.cache\u002Fcrispasr\n\n# Transcribe (auto-discovers tokenizer if it sits next to the LM)\n.\u002Fbuild\u002Fbin\u002Fcrispasr \\\n    --backend mimo-asr \\\n    -m ~\u002F.cache\u002Fcrispasr\u002Fmimo-asr-q4_k.gguf \\\n    --codec-model ~\u002F.cache\u002Fcrispasr\u002Fmimo-tokenizer-q4_k.gguf \\\n    -f samples\u002Fjfk.wav\n# Output: And so, my fellow Americans, ask not what your country can do\n# for you. Ask what you can do for your country.\n```\n\nThe 4.5 GB Q4_K is the recommended quant; F16 (14.9 GB) needs ~16 GB\nRAM during inference. JFK matches the upstream Python\n`MimoAudio.asr_sft` reference verbatim; performance on M1+Metal is\n~0.3× realtime (Q4_K dequant per step is the bottleneck — F16 +\nKV-reuse follow-ups are queued under PLAN #51a\u002Fb\u002Fc).\n\n### Wav2Vec2 (lightweight CTC, any HF Wav2Vec2ForCTC model)\n\n```bash\n# English (Q4_K quantized, 212 MB — 6x smaller than F16)\ncurl -L -o wav2vec2-en-q4k.gguf \\\n    https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fwav2vec2-large-xlsr-53-english-GGUF\u002Fresolve\u002Fmain\u002Fwav2vec2-xlsr-en-q4_k.gguf\n\n.\u002Fbuild\u002Fbin\u002Fcrispasr -m wav2vec2-en-q4k.gguf -f samples\u002Fjfk.wav\n# and so my fellow americans ask not what your country can do for you ask what you can do for your country\n\n# German\ncurl -L -o wav2vec2-de-q4k.gguf \\\n    https:\u002F\u002Fhuggingface.co\u002Fcstr\u002Fwav2vec2-large-xlsr-53-german-GGUF\u002Fresolve\u002Fmain\u002Fwav2vec2-xlsr-de-q4_k.gguf\n\n.\u002Fbuild\u002Fbin\u002Fcrispasr -m wav2vec2-de-q4k.gguf -f audio.de.wav\n\n# Convert any HuggingFace Wav2Vec2ForCTC model:\npython models\u002Fconvert-wav2vec2-to-gguf.py \\\n    --model-dir jonatasgrosman\u002Fwav2vec2-large-xlsr-53-german \\\n    --output wav2vec2-de.gguf --dtype f32\n# Then optionally quantize:\n.\u002Fbuild\u002Fbin\u002Fcrispasr-quantize wav2vec2-de.gguf wav2vec2-de-q4k.gguf q4_k\n```\n\n---\n\n## Streaming, TTS, and HTTP server\n\nCrispASR has three feature areas that warrant their own docs pages:\n\n- **[Streaming & live transcription](docs\u002Fstreaming.md)** — `--stream`,\n  `--mic`, `--live`, sliding-window chunking, per-token confidence.\n- **[Text-to-Speech (TTS)](docs\u002Ftts.md)** — Kokoro (multilingual,\n  smallest), Qwen3-TTS (highest fidelity, voice cloning), VibeVoice\n  (lowest-latency streaming), Orpheus (3 B Llama + SNAC), Chatterbox\n  (flow-matching + HiFT vocoder, German via Kartoffelbox), IndexTTS,\n  VoxCPM2, and CosyVoice3 (9 langs + 18 zh dialects; baked-voice bank +\n  arbitrary-WAV cloning). Voice packs, language routing, and qwen3-tts\n  environment switches. All TTS output is watermarked; post-embed\n  verification warns if confidence is low. Use\n  `--detect-watermark file.wav` to check any WAV for AI watermarks.\n- **[Server mode (HTTP API)](docs\u002Fserver.md)** — persistent model,\n  OpenAI-compatible `\u002Fv1\u002Faudio\u002Ftranscriptions` (ASR) and\n  `\u002Fv1\u002Faudio\u002Fspeech` + `\u002Fv1\u002Fvoices` (TTS, automatic on any loaded\n  CAP_TTS backend), per-request voice + speed + instructions, CORS,\n  long-form sentence chunking, API keys, Docker Compose, prebuilt\n  CUDA images.\n\nQuickest taste of each:\n\n```bash\n# Streaming from microphone\ncrispasr --mic -m model.gguf\n\n# TTS via auto-downloaded VibeVoice (~636 MB on first run)\ncrispasr --backend vibevoice-tts -m auto --tts \"Hello world\" --tts-output hello.wav\n\n# CosyVoice3 on GPU; companions auto-download beside the LLM\ncrispasr --backend cosyvoice3-tts -m auto --tts \"Hello world\" --tts-output cosy.wav\n\n# CosyVoice3 fast mode: 5 flow steps instead of the quality-default 10\nCOSYVOICE3_FLOW_STEPS=5 crispasr --backend cosyvoice3-tts -m auto \\\n  --tts \"Hello world\" --tts-output cosy-fast.wav\n\n# Persistent HTTP server, OpenAI-compatible\ncrispasr --server -m model.gguf --port 8080\ncurl -F \"file=@audio.wav\" http:\u002F\u002Flocalhost:8080\u002Fv1\u002Faudio\u002Ftranscriptions\n\n# TTS over HTTP — load a TTS backend, hit \u002Fv1\u002Faudio\u002Fspeech\ncrispasr --server --backend qwen3-tts-customvoice -m auto --voice-dir .\u002Fvoices --port 8080\ncurl http:\u002F\u002Flocalhost:8080\u002Fv1\u002Faudio\u002Fspeech \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -d '{\"input\":\"Hello world\",\"voice\":\"vivian\"}' -o out.wav\n```\n\nCosyVoice3 uses batched classifier-free guidance and request-sized KV\ncaching by default. Baked voices load only the LLM, flow, HiFT, and voice\nbank; the larger S3 tokenizer and CAMPPlus companions load lazily when a\n`.wav` cloning voice is first requested.\n\n---\n\n## CLI reference\n\nCommon flags:\n\n```bash\ncrispasr -m auto --backend parakeet -f audio.wav --vad -osrt --split-on-punct\n```\n\n| Flag | Meaning |\n|---|---|\n| `-m FNAME` \u002F `--backend NAME` | Model path (or `auto`) and forced backend |\n| `-f FNAME` | Input audio (repeatable; positional accepted) |\n| `--vad` | Silero VAD chunking — strongly recommended for multi-minute audio |\n| `-osrt` \u002F `-ovtt` \u002F `-otxt` \u002F `-oj` \u002F `-ojf` | Output formats (also `-ocsv`, `-olrc`) |\n| `-am FNAME` | CTC aligner GGUF for word-level timestamps on LLM backends |\n| `--align-only` | Standalone forced alignment: text\u002F`.srt` + audio → timestamped SRT\u002FJSON (no ASR needed); `.srt` input keeps its cues and gets re-timed (`--align-granularity auto\\|word\\|segment`) |\n| `-tp F` \u002F `-bs N` | Sampling temperature \u002F beam search width |\n| `-n N` \u002F `--frequency-penalty F` | Generated-token cap \u002F opt-in repeated-token penalty for supported autoregressive ASR backends |\n| `-l auto` \u002F `--detect-language` | LID pre-step for backends without native lang detect |\n| `--hotwords \"A,B,C\"` | Contextual biasing — boost named terms during CTC\u002FTDT decode or LLM prompt |\n| `-ck N` | Fallback chunk size when VAD is off (default 30 s) |\n| `--list-backends` | Print the capability matrix and exit |\n\n**See [`docs\u002Fcli.md`](docs\u002Fcli.md)** for the full reference: every\nflag, VAD details, CTC alignment workflow, output JSON layout, the\nauto-download registry, and supported audio formats. **See\n[`docs\u002Fbindings.md`](docs\u002Fbindings.md)** for Python \u002F Rust \u002F Dart \u002F\nGo \u002F Java \u002F JavaScript \u002F Ruby \u002F mobile.\n\n---\n\n## Architecture, contributing, regression matrix\n\nCrispASR is structured as a stable C-ABI in `src\u002F` (every algorithm:\nVAD, diarize, LID, alignment, cache, registry) consumed by all\nlanguage wrappers, with thin presentation layers in `examples\u002Fcli\u002F`.\nPer-model runtimes live in `src\u002F{whisper,parakeet,canary,...}.cpp`,\nsharing primitives from `src\u002Fcore\u002F` (mel, ffn, attention, GGUF\nloader, FastConformer \u002F Conformer \u002F Granite-LLM blocks, etc.).\n\n- **[`docs\u002Farchitecture.md`](docs\u002Farchitecture.md)** — full layered\n  layout, file-by-file tour of `src\u002F` and `examples\u002Fcli\u002F`,\n  per-backend internals table, regression discipline.\n- **[`docs\u002Fcontributing.md`](docs\u002Fcontributing.md)** — adding a new\n  backend in five files, clang-format-18 setup, the\n  `crispasr-diff` PyTorch-ground-truth workflow, and the\n  TTS audio-cosine-vs-reference regression target.\n- **[`docs\u002Fregression-matrix.md`](docs\u002Fregression-matrix.md)** —\n  `tools\u002Ftest-all-backends.py` capability tiers, cache modes\n  (`keep` \u002F `ephemeral`), `--skip-missing` for CI.\n\n**Shared libraries** (cross-repo with CrispEmbed):\n- `crisp_audio\u002F` — Whisper-shape audio encoder (Conv-stem + Transformer)\n- `crisp_punc\u002F` — punctuation restoration (FireRedPunc + PCS)\n- `crisp_lid\u002F` — text-based language identification (fastText + CLD3)\n- `crisp_truecase\u002F` — truecasing (statistical + CRF + BiLSTM)\n\nBoth are self-contained static libraries with CMakeLists.txt. CrispEmbed\nlinks them via `add_subdirectory(..\u002FCrispASR\u002Fcrisp_*\u002F)`; CrispASR uses\nthem directly. If the shared dir is absent, both repos fall back to local\ncopies of the source files.\n\nFor benchmarks see [`PERFORMANCE.md`](PERFORMANCE.md); for the\nsession-by-session port log and the bug-class lessons, see\n[`LEARNINGS.md`](LEARNINGS.md).\n\n---\n\n## Quantize models\n\n`build\u002Fbin\u002Fcrispasr-quantize` is a single, model-agnostic GGUF\nre-quantization tool that works across all supported model families\n(Whisper, Parakeet, Canary, Cohere, Voxtral, Qwen3, Granite, Wav2Vec2,\nMiMo-ASR, GLM-ASR, Moonshine, VibeVoice, Kokoro, Qwen3-TTS, …):\n\n```bash\n.\u002Fbuild\u002Fbin\u002Fcrispasr-quantize input.gguf output.gguf q4_k\n```\n\n**See [`docs\u002Fquantize.md`](docs\u002Fquantize.md)** for the full guide:\nsupported quant types, K-quant alignment fallback, recommended quant\nper backend, and worked examples for each architecture.\n\n---\n\n## GPU backend selection\n\nAll backends use `ggml_backend_init_best()` which automatically picks the highest-priority compiled backend: CUDA > Metal > Vulkan > CPU. To force a specific backend:\n\n```bash\n# Force Vulkan even when CUDA is available\ncrispasr --gpu-backend vulkan -m model.gguf -f audio.wav\n\n# Pin a specific GPU (useful on Vulkan systems with iGPU + dGPU)\ncrispasr --gpu-backend vulkan -dev 1 -m model.gguf -f audio.wav\n\n# Force CPU (useful for benchmarking)\ncrispasr -ng -m model.gguf -f audio.wav\n\n# CUDA unified memory (swap to RAM when VRAM exhausted)\nGGML_CUDA_ENABLE_UNIFIED_MEMORY=1 crispasr -m model.gguf -f audio.wav\n```\n\nBuild flags: `-DGGML_CUDA=ON`, `-DGGML_METAL=ON`, `-DGGML_VULKAN=ON`.\n\nNotes:\n- `--gpu-backend vulkan` selects the Vulkan backend, but it does not choose which physical GPU to use. Use `-dev N` to select the Vulkan device index.\n- On some Windows laptops, Vulkan device `0` is the Intel iGPU and the NVIDIA GPU is `1`. If Vulkan looks unexpectedly slow, rerun with `-dev 1`.\n- The Windows convenience script `build-vulkan.bat` creates a separate Vulkan-capable binary at `build-vulkan\\bin\\crispasr.exe`.\n\n---\n\n## Debugging & profiling\n\nFor most backends, `-v` \u002F `--verbose` surfaces per-stage timings and\ndevice picks. For headless \u002F library use (where the CLI flag isn't\nplumbed through), set `CRISPASR_VERBOSE=1` instead.\n\n```bash\n# Per-stage timing breakdown (mel \u002F encoder \u002F prefill \u002F decode):\ncrispasr -v --backend gemma4-e2b -m model.gguf -f audio.wav\n# gemma4_e2b: mel 128x1099 (17.2 ms)\n# gemma4_e2b: encoder done: 1536x275 (719.0 ms)\n# gemma4_e2b: prefill done, first_token=3133 (1464.0 ms)\n# gemma4_e2b: decoded 25 tokens (7748.3 ms total)\n# crispasr: transcribed 11.0s audio in 7.75s (1.4x realtime)\n\n# Hugging Face access for gated models (Voxtral, Gemma4-E2B, …):\nHF_TOKEN=hf","CrispASR 是一个基于 C++ ggml 的轻量级多模态语音处理引擎，支持 43 种 ASR 和 48 种 TTS 模型（如 Cohere Transcribe、Parakeet TDT、Voxtral、Canary 1B v2 等），提供统一 CLI 接口、零 Python 依赖、本地端到端运行能力，并集成强制对齐、说话人分离、热词识别、多格式音频解码（无需 FFmpeg）等功能。其核心特点是单二进制、多后端动态加载、WebAssembly 支持及全客户端部署能力。适用于边缘设备部署、隐私敏感场景下的离线语音转写与合成、实时语音交互系统及嵌入式语音应用开发。",2,"trending"]