Environment variables
August 20, 2026 · View on GitHub
CrispASR exposes a large number of environment variables — tuning knobs, device placement overrides, benchmark timers, and debug/dump switches. This page is the single reference for all of them: the naming convention, the cross-cutting variables, the per-backend variables, and the ones CrispASR deliberately does not own.
This document was introduced for issue #265 ("consistency and documentation"). The same change standardized every backend-owned variable onto one prefix and unified the reference-voice cache location (see below).
Naming convention
Every CrispASR-owned variable is named:
CRISPASR_<BACKEND>_<FEATURE>
for example CRISPASR_OMNIVOICE_CODEC_GPU, CRISPASR_IRODORI_CODEC_GPU,
CRISPASR_PARAKEET_BENCH. Process-global variables that are not tied to one
backend drop the <BACKEND> segment (CRISPASR_MODELS_DIR, CRISPASR_KV_ON_CPU).
Legacy aliases and deprecation warnings
Historically many backends used a bare prefix (OMNIVOICE_CODEC_GPU,
QWEN3_TTS_BENCH, CHATTERBOX_DEBUG, …). Those bare names still work as
legacy aliases so existing scripts, notebooks, and Kaggle A/B kernels keep
running. The alias is derived automatically by stripping the CRISPASR_ prefix,
so for any CRISPASR_FOO_BAR documented here the bare FOO_BAR is also honored.
The first time a run reads a value from a legacy name, CrispASR prints a one-time notice to stderr:
[crispasr] warning: environment variable 'OMNIVOICE_CODEC_GPU' is deprecated and
will be removed in a future release; use 'CRISPASR_OMNIVOICE_CODEC_GPU' instead
(the old name still works for now). ...
Migrate to the canonical CRISPASR_-prefixed name at your convenience. To
silence the warnings (e.g. for a pipeline that scrapes stderr and cannot migrate
yet), set:
CRISPASR_SUPPRESS_ENV_DEPRECATION=1
The lookup + aliasing is implemented once in src/core/crispasr_env.h
(crispasr_env::get / truthy / present); new backends should read env vars
through that helper with a canonical CRISPASR_-prefixed name.
Value/truthiness conventions
Most variables are read with one of two conventions — check the surrounding suffix legend, but as a rule:
- Flag (opt-in) — set to
1(or any non-empty, non-0value) to enable. Some legacy flags treat being set at all as on, so prefer=1/ unset it entirely rather than=0when a flag's exact semantics matter. - Path / value — the variable's value is a filesystem path, integer, or float used directly.
Common suffix legend
The same feature suffixes recur across nearly every backend. Rather than repeat them per backend below, they mean:
| Suffix | Meaning |
|---|---|
_BENCH | Print per-stage wall-clock timings for that engine. |
_DEBUG / _DIAG | Verbose debug logging. |
_DUMP_DIR / _DUMP / _DUMP_* | Write intermediate tensors / stages to disk (diagnostics, diff-harness). |
_FORCE_SCALAR | Disable SIMD kernels (numeric-parity debugging). |
_GPU / _USE_GPU / _FORCE_METAL | Force that stage/codec onto the GPU. |
_CPU / _CPU_ONLY / _FORCE_CPU | Force that stage/codec onto the CPU. |
_NO_FA / _FLASH_ATTN | Toggle flash-attention. |
_FASTCONV (_DEBUG) | Enable the baked-F32 / matmul conv fast path for a codec/vocoder. |
_CFG_INTERVAL (_DEBUG) | Interval-CFG cadence for a flow-matching decoder. |
_SEED | RNG seed for reproducible generation. |
_*_FILE / _*_PATH / _*_GGUF | Override an asset/model/fixture path (mostly dev/test). |
Global / cross-cutting variables
These are not tied to a single backend.
Paths, cache, and models
| Variable | Purpose |
|---|---|
CRISPASR_MODELS_DIR | Directory searched for GGUF models (also the auto-download target root). |
CRISPASR_CACHE_DIR | Base cache directory for auto-downloaded models/assets (default ~/.cache/crispasr). |
CRISPASR_SCRATCH_DIR | Scratch directory for temporary run artifacts. |
CRISPASR_DUMP_DIR | Global tensor-dump directory (diagnostics). |
CRISPASR_GGUF_MMAP / CRISPASR_GGUF_PRELOAD | Control GGUF mmap vs. preload-into-RAM loading. |
CRISPASR_MLOCK | mlock model weights into RAM. |
CRISPASR_IGNORE_CPU_ISA | Continue past the startup build-vs-host CPU instruction-set check (#380) instead of exiting; the process will SIGILL at the first compute op the CPU can't run. |
GPU / device placement
| Variable | Purpose |
|---|---|
CRISPASR_N_GPU_LAYERS | Number of transformer layers to offload to the GPU. |
CRISPASR_ARG_DEVICE | Default device selection for the CLI. |
CRISPASR_KV_ON_CPU | Keep the KV cache on the CPU. |
CRISPASR_KV_QUANT / _KV_QUANT_K / _KV_QUANT_V / _KV_READ_F32 | KV-cache quantization / read format. |
Device selection across compiled backends also honors the standard ggml / CUDA variables
CUDA_VISIBLE_DEVICESandGGML_VK_VISIBLE_DEVICES— see "Variables CrispASR does not own" below.
Session / long-audio chunking
| Variable | Purpose |
|---|---|
CRISPASR_SESSION_AUTOCHUNK | Enable auto-chunking in the session API for long audio. |
CRISPASR_SESSION_CHUNK_SECONDS | Chunk length (seconds) for session auto-chunking. |
CRISPASR_SESSION_PERBACKEND_CHUNK | Use per-backend chunk-window tuning instead of a flat window. |
CRISPASR_SESSION_UNIFIED_DISPATCH | Route surfaces through the unified library dispatch path. |
Post-decode hygiene (PLAN.md §W2–W7)
All OFF unless set. Each of these can delete or alter user-visible text, so none of them switches on by surprise; a wrong deletion is worse than a surviving artifact. Applied on both the CLI and the session C-ABI.
| Variable | Purpose |
|---|---|
CRISPASR_SEG_MAX_CHARS | Truncate any segment longer than N code points, backing up to the last 。..!!??、, but never below 75% of the cap. A line past the cap is almost always a repetition hallucination that survived the n-gram collapse. |
CRISPASR_SEG_DROP_NONVERBAL | Drop segments that are entirely a non-verbal marker — [Music], (applause), (喘ぎ声), ♪. Running speech merely containing such a word is never dropped. |
CRISPASR_SEG_LOGPROB_THOLD | Drop segments whose average log-probability is below this. Post-hoc, on top of the decoder's own fallback gate. |
CRISPASR_SEG_LOGPROB_MARGIN | Loosen that threshold by this much for segments ≤1.6 s — a short segment's mean logprob is noisier, so it gets more room, not less. |
CRISPASR_SEG_MERGE_REPEATS | Collapse runs of near-identical adjacent segments into one spanning the whole run. Catches a phrase repeating across segment boundaries, which per-segment loop fixes cannot see. |
CRISPASR_SEG_MERGE_SIMILARITY | Similarity bar for the above (default 0.90; LCS over code points). |
CRISPASR_SEG_MERGE_GAP_CS | Never merge across a gap wider than this many centiseconds (default 200). Two identical lines a minute apart are two real utterances. |
CRISPASR_SEG_MERGE_MIN_RUN | Minimum consecutive similar segments before merging (default 3), so an ordinary repeated "yes." pair survives. |
Alignment and VAD sanity checks
| Variable | Purpose |
|---|---|
CRISPASR_ALIGN_SENTINEL | 0 disables the forced-alignment collapse check. On by default, detect + warn only. Catches ctc_forced_align() returning words at t0 == t1 == 0 — its two silent-zero paths (characters absent from the CTC vocab, or a word the Viterbi path never visited) produce garbage timestamps inside a successful return. |
CRISPASR_ALIGN_SENTINEL_REDISTRIBUTE | 1 opts into repair: respace the words across the clip in proportion to character count. Off by default — a wrong auto-repair would be just as invisible as the collapse. |
CRISPASR_VAD_FAILOVER | 0 disables the VAD sanity check. On by default: if a clip over 120 s comes back with under 1% speech coverage (or a couple of segments covering under 10% of a very long clip), the VAD is wrong and the run falls back to fixed full-clip chunks rather than losing the transcript. |
CRISPASR_NGRAM_LOOPFIX_OFF | 1 disables the repeated-n-gram collapse entirely, exposing the RAW decoded text. Diagnostic: for telling whether a loop originates in the decode itself or is merely being masked. |
Decoding / beam search (shared)
| Variable | Purpose |
|---|---|
CRISPASR_MAES_BETA / _MAES_GAMMA / _MAES_NUM_STEPS | MAES beam-search parameters. |
CRISPASR_TDT_BATCH / CRISPASR_RNNT_BATCH | Batch the TDT / RNNT joint decode. |
CRISPASR_RNNT_GGML_PERSTEP | Per-step (vs. persistent-graph) ggml RNNT decode. |
CRISPASR_NGRAM_LOOPFIX_OFF | Disable the n-gram decode-loop breaker. |
CRISPASR_GAP_FILL / _GAP_FILL_MIN_CS | Re-transcribe spans a first pass left empty (long audio); on by default for parakeet, threshold non-JA 300 cs / JA 100 cs. |
G2P / phonemizer
| Variable | Purpose |
|---|---|
CRISPASR_CMUDICT_PATH | Path to the CMUdict pronunciation dictionary. |
CRISPASR_DE_DICT_PATH / _FR_DICT_PATH / _ES_DICT_PATH | Language-specific pronunciation dictionaries. |
CRISPASR_G2P_DICT_SOURCE / _G2P_MODEL_PATH | G2P dictionary source / neural G2P model path. |
CRISPASR_ESPEAK_DATA_PATH | eSpeak-NG data directory. |
CRISPASR_KOKORO_G2P | Kokoro G2P backend selection. |
CRISPASR_KOKORO_MISAKI_IPA | 0 disables the espeak-IPA → misaki-alphabet conversion Kokoro needs (#316), restoring the raw G2P spelling for A/B. On by default. |
CRISPASR_G2P_DE_UNSTRESS | 1 reads the German closed class the way espeak reads it in a SENTENCE (sie → ziː) instead of the citation form our per-word dictionary stores (zˈiː). Off by default: it takes phoneme agreement with espeak from 45.9% to 87.1%, but the ASR round-trip could not resolve a difference, and that metric measures intelligibility rather than naturalness (#316). |
CRISPASR_KOKORO_DE_MISAKI_ALPHABET | 1 applies misaki's tied-sequence collapse for German (tsvˈaɪ → ʦvˈI), which is what the published training recipe does. Off by default: it made the ASR round-trip worse on the kokoro-de-hui-base model we ship, which appears to predate that part of the recipe (#316). The ʏ→y vocabulary fixup is applied either way. |
CRISPASR_T5_REPEAT_BREAK | 0 disables the decode-loop break for madlad/T5 translation, restoring exact PyTorch-blueprint behaviour. On by default: MADLAD greedy-decodes into a repeated token cycle on some short inputs and burns the whole token budget on it. The blueprint does the same — this is a deliberate improvement on it, not a parity fix (#333). |
CRISPASR_T5_NO_KV_REUSE | 1 re-forwards the whole decoder prefix each step instead of appending to the KV cache. Same output, much slower; an A/B lever for isolating cache bugs (#333). |
CRISPASR_T5_KEEP_EMBED | 1 keeps shared.embed.* and lm_head.* at source precision when quantizing a T5 model. Off by default because it was measured and loses: on madlad400 it makes q8_0 3.38→3.62 GB and q4_k 2.04→2.41 GB for a worst-stage cosine that does not improve (0.999922→0.999920, 0.992929→0.992606). The Q4_K loss accumulates through the 32 encoder blocks, not in the embedding lookup (#333). |
CRISPASR_KOKORO_PUNCT | 0 drops punctuation from the phoneme string for the German/French/Spanish built-in G2Ps, restoring pre-0.8.26 behaviour for A/B. On by default: Kokoro's vocabulary contains ,.;:!? and they are how it pauses (#316). English is not gated — it is settled against misaki. |
Watermark / provenance
| Variable | Purpose |
|---|---|
CRISPASR_NO_WATERMARK | Disable the audio watermark. |
CRISPASR_WATERMARK_LEGACY | Use the legacy watermark path. |
CRISPASR_NO_C2PA_REMUX | Skip the C2PA MP4 remux step. |
Quantization / diff-harness / misc
| Variable | Purpose |
|---|---|
CRISPASR_QUANT_LMHEAD | Quantize the LM head during crispasr-quantize. |
CRISPASR_IMATRIX_OUT | Importance-matrix output path. |
CRISPASR_ACTDUMP_OUT / _ACTDUMP_TENSOR | Activation dump output / target tensor. |
CRISPASR_DIFF_NO_GPU / _DIFF_USE_GPU / _DIFF_SLICES / _DIFF_STAGES | crispasr-diff harness controls. |
CRISPASR_MEL_PARALLEL / _MEL_TIMING | Parallelize / time mel-spectrogram computation. |
CRISPASR_VERBOSE | Global verbose output. |
CRISPASR_NO_WARMUP / CRISPASR_WARMUP | Skip / force the model warmup pass. |
CRISPASR_SERVER_WORKERS / CRISPASR_API_KEYS | HTTP server worker count / API keys. |
Reference-voice cache (voice cloning)
Encoding a reference clip for voice cloning (a codec encoder, a Conformer /
Perceiver, or an ASR pass) is slow and produces a small, reusable blob. Every
voice-cloning TTS backend caches that blob through one shared mechanism
(src/core/tts_ref_cache.h), so the location and disable switch are identical
across backends (issue #265 unified OmniVoice — which previously used a bespoke
~/.cache/crispasr cache — onto this path):
| Variable | Purpose |
|---|---|
CRISPASR_TTS_REF_CACHE | Set to 0 to disable reference-voice caching everywhere. |
CRISPASR_TTS_REF_CACHE_DIR | Override the cache directory (default <TMPDIR>/crispasr-tts-refcache). |
Content-addressed entries are keyed by a hash of the raw reference (plus, for
some backends, an encoder-weight fingerprint) and tagged per backend
(irodori-latent, openvoice2-se, omnivoice-voice, f5-reftext, …) so no two
backends read each other's blob. OmniVoice additionally honors the legacy
CRISPASR_OMNIVOICE_VOICE_CACHE=0 as an alias for the shared disable switch.
Variables CrispASR does not own
These are read by CrispASR but are OS / third-party conventions and are
intentionally not renamed to the CRISPASR_ prefix:
| Variable | Origin |
|---|---|
HOME, USERPROFILE, LOCALAPPDATA, XDG_CACHE_HOME | OS home / cache dirs. |
TMPDIR, TEMP, TMP | OS temp dir (also the default ref-cache root). |
HF_TOKEN, HUGGING_FACE_HUB_TOKEN | HuggingFace auth (Hub convention). |
CUDA_VISIBLE_DEVICES | CUDA device selection. |
GGML_VK_VISIBLE_DEVICES | ggml Vulkan device selection. |
LLAMA_* | Vendored llama.cpp (talk-llama example). |
Sibling modular libraries (own conventions)
The in-tree modular libraries keep their own established prefixes and are synced
from their sibling repos, so their variables are not part of the CRISPASR_
scheme:
crisp_audio/— audio tower:CRISP_AUDIO_DUMP_STAGES,CRISP_AUDIO_KEEP_PAD_FRAMES,CRISP_AUDIO_WINDOWED_ATTN.glint/— clean-room MP3/AAC codec:GLINT_*,AACDBG.crisp_lid/·crisp_punc/·crisp_truecase/— standalone LID / punctuation / truecasing libraries; they and theirsrc/counterparts follow each library's own naming (LID_*,FIREREDPUNC_*,PCS_*,TRUECASER_*).FIREREDPUNC_DEBUG=1prints each restore pass as[PUNCDBG] in=<…>/out=<…>, which is the quickest way to see a backend's true model output —--no-punctuationis not, because it strips punctuation after the fact and so hides text the model punctuated itself.⚠ These libraries are built by the main target, and each has a second copy under
src/.src/CMakeLists.txtpreferscrisp_punc/(etc.) and falls back to thesrc/copy only when the sibling directory is missing from a checkout — so thecrisp_punc/copy is what normally links, and a change must be applied to both. #308's capitalisation fix went intosrc/fireredpunc.cppalone and was dead code for months while the shipping copy kept the bug.tests/test-punc-copies-in-sync.cppnow fails if they diverge.
Test fixtures
The live/integration test suite reads a few CRISPASR_-prefixed fixture
variables (model/audio paths); tests/env-live-tests.sh sets sensible defaults.
Like every other variable here, the pre-standardization bare names are still
honored as deprecated aliases:
| Variable | Purpose |
|---|---|
CRISPASR_PARAFORMER_MODEL / _PARAFORMER_MODEL_Q4K / _PARAFORMER_AUDIO_ZH / _PARAFORMER_AUDIO_EN | Paraformer test model / audio paths. |
CRISPASR_AUDIOSEAL_GGUF | AudioSeal test model path. |
CRISPASR_PIPER_TEST_MODEL | Piper phonemize test model path. |
CRISPASR_OV2_DUMP_DIR | OpenVoice2 HiFi test dump directory. |
CRISPASR_MODEL_BTC_CHORDS | BTC chord-recognition test model path. Defaults to $CRISPASR_MODELS_DIR/btc-chords-large-f32.gguf. |
Per-backend variables
Every variable below is the canonical CRISPASR_-prefixed name; the bare form
(without CRISPASR_) is accepted as a deprecated alias. See the suffix
legend above for the meaning of the common _BENCH / _DEBUG / _DUMP_* /
_GPU / _CPU / _FORCE_SCALAR / _FASTCONV / _CFG_INTERVAL / _SEED
suffixes.
AAC codec
CRISPASR_AAC_DEBUGCRISPASR_AAC_DECODER
ARK-ASR
CRISPASR_ARKASR_CPUCRISPASR_ARKASR_DEBUG_GENCRISPASR_ARKASR_GPUCRISPASR_ARKASR_MAX_SINGLE_PASS_SCRISPASR_ARKASR_NO_CHUNK_CONTEXTCRISPASR_ARKASR_NO_EOS_SUPPRESSCRISPASR_ARKASR_TIMING
AudioSeal watermark
CRISPASR_AUDIOSEAL_BENCHCRISPASR_AUDIOSEAL_DEBUGCRISPASR_AUDIOSEAL_DUMP_STAGES
BananaMind TTS
CRISPASR_BANANAMIND_DEBUGCRISPASR_BANANAMIND_TTS_BENCH
Bark
CRISPASR_BARK_BENCHCRISPASR_BARK_DECODE_CODESCRISPASR_BARK_DUMP_DIR
BERT encoder
CRISPASR_BERT_ENCODER_BENCH
BTC chord recognition
CRISPASR_BTC_MAJ_MIN— collapse the 170-class chord output to the 25-class maj/min vocabulary. Default off (full 170-class output): 170 reduces to maj/min at runtime, but a 25-class model can never be expanded, so the 170-class checkpoint is the shipping default.
The shipped BTC weights are CC-BY-NC-SA (trained on Isophonics / Robbie Williams / UsPop2002 chord annotations) even though the upstream BTC code and CrispASR itself are MIT. The registry refuses to download them without
--accept-license cc-by-nc-sa-4.0(orCRISPASR_ACCEPT_LICENSE). A commercial product must supply its own weights.
Canary / Canary-CTC / Canary-Qwen
CRISPASR_CANARY_BENCHCRISPASR_CANARY_CTC_BENCHCRISPASR_CANARY_QWEN_BENCHCRISPASR_CANARY_QWEN_DEBUGCRISPASR_CANARY_QWEN_MIN_ENC_FRAMESCRISPASR_CANARY_QWEN_NO_ECHO_STRIPCRISPASR_CANARY_LEGACY_STREAMCRISPASR_CANARY_SEAM_DEDUPCRISPASR_CANARY_STREAM_THRESHOLD_S
Chatterbox
CRISPASR_CHATTERBOX_BENCHCRISPASR_CHATTERBOX_BENCH_B2CRISPASR_CHATTERBOX_DEBUGCRISPASR_CHATTERBOX_DUMP_ATTN_ATCRISPASR_CHATTERBOX_DUMP_FFN_ATCRISPASR_CHATTERBOX_DUMP_GPT2_LAYERSCRISPASR_CHATTERBOX_DUMP_KPROJ_ATCRISPASR_CHATTERBOX_DUMP_KROPE_ATCRISPASR_CHATTERBOX_DUMP_KV_ATCRISPASR_CHATTERBOX_DUMP_KV_LAYERCRISPASR_CHATTERBOX_DUMP_LAYERCRISPASR_CHATTERBOX_DUMP_LOGITS_ATCRISPASR_CHATTERBOX_DUMP_NORM_ATCRISPASR_CHATTERBOX_DUMP_QPROJ_ATCRISPASR_CHATTERBOX_DUMP_VPROJ_ATCRISPASR_CHATTERBOX_DUMP_WKCRISPASR_CHATTERBOX_LANGCRISPASR_CHATTERBOX_NAIVE_ATTNCRISPASR_CHATTERBOX_SEEDCRISPASR_CHATTERBOX_SYN_TEXTCRISPASR_CHATTERBOX_T3_BUCKET_REUSECRISPASR_CHATTERBOX_T3_CFG_B2CRISPASR_CHATTERBOX_T3_CFG_BUCKETCRISPASR_CHATTERBOX_T3_SEEDCRISPASR_CHATTERBOX_TEMPCRISPASR_CHATTERBOX_THREADS
Chatterbox S3Gen
CRISPASR_S3GEN_CFG_INTERVALCRISPASR_S3GEN_DUMPCRISPASR_S3GEN_DUMP_UNETCRISPASR_S3GEN_DUMP_UNET_NO_AUTO_MARKCRISPASR_S3GEN_FASTCONVCRISPASR_S3GEN_FASTCONV_DEBUGCRISPASR_S3GEN_RC_AS_MUL_MATCRISPASR_S3GEN_UNET_CFG_SINGLECRISPASR_S3GEN_UNET_CPUCRISPASR_S3GEN_UNET_GALLOCRCRISPASR_S3GEN_UNET_KEEP_GPU_OPCRISPASR_S3GEN_UNET_MARK_DB_OUTCRISPASR_S3GEN_UNET_MARK_DB_RESNETCRISPASR_S3GEN_UNET_MARK_DB_TBCRISPASR_S3GEN_UNET_MARK_MB_OUTCRISPASR_S3GEN_UNET_MARK_MB_OUT_INDEXCRISPASR_S3GEN_UNET_MARK_MB_OUT_MAXCRISPASR_S3GEN_UNET_MARK_MB_RESNETCRISPASR_S3GEN_UNET_PIN_CPU_OPCRISPASR_S3GEN_UNET_PRESERVE_INTERMEDIATESCRISPASR_S3GEN_UNET_PROBE_BLOCK1CRISPASR_S3GEN_UNET_PROBE_DENOISER_OUTCRISPASR_S3GEN_UNET_PROBE_INPUT_SNAPSHOTCRISPASR_S3GEN_UNET_PROBE_RC_OUT
Chatterbox sub-modules
CRISPASR_CB_CAMPPLUS_BENCHCRISPASR_CB_S3GEN_BENCHCRISPASR_CB_S3TOK_BENCHCRISPASR_CB_VE_BENCH
Cohere
CRISPASR_COHERE_BENCHCRISPASR_COHERE_DEBUGCRISPASR_COHERE_DEVICECRISPASR_COHERE_DUMP_ATTNCRISPASR_COHERE_DUMP_ENCOUTCRISPASR_COHERE_DUMP_MELCRISPASR_COHERE_DUMP_STAGESCRISPASR_COHERE_FLASHCRISPASR_COHERE_GAPSCRISPASR_COHERE_LEGACY_SACRISPASR_COHERE_PROFCRISPASR_COHERE_THREADS
CosyVoice3
CRISPASR_COSYVOICE3_BENCHCRISPASR_COSYVOICE3_CAMPPLUS_PATHCRISPASR_COSYVOICE3_CFG_BATCHCRISPASR_COSYVOICE3_CFG_INTERVALCRISPASR_COSYVOICE3_CFG_INTERVAL_DEBUGCRISPASR_COSYVOICE3_DUMP_TOKENSCRISPASR_COSYVOICE3_FASTCONVCRISPASR_COSYVOICE3_FASTCONV_DEBUGCRISPASR_COSYVOICE3_FLOW_STEPSCRISPASR_COSYVOICE3_HIFT_PATHCRISPASR_COSYVOICE3_KV_BUCKETCRISPASR_COSYVOICE3_NO_CLONE_CACHE— re-extract the--voice ref.wavspeaker (s3tokenizer + CAMPPlus + prompt mel) on every synthesis instead of once per reference. Output-identical; the cached path is ~30% faster on a multi-sentence--tts(#334).CRISPASR_COSYVOICE3_NO_MIN_LEN— drop the decode's minimum-length floor (2 speech tokens per target text token, upstream'smin_token_text_ratio). Without the floor a single unlucky sample at step 0 ends the decode with no audio at all (#334).CRISPASR_COSYVOICE3_VOICES_PATH
CosyVoice3 (diff-harness assets)
CRISPASR_CV3_FLOW_GGUFCRISPASR_CV3_HIFT_GGUFCRISPASR_CV3_S3TOK_GGUF
CSM TTS
CRISPASR_CSM_BENCHCRISPASR_CSM_WAV_FRAMESCRISPASR_CSM_WAV_OUTCRISPASR_CSM_WAV_TEMPCRISPASR_CSM_WAV_TEXT
Dia TTS
CRISPASR_DIA_BENCHCRISPASR_DIA_DECODE_CODESCRISPASR_DIA_DUMP_DIRCRISPASR_DIA_DUMP_STEPLOGITSCRISPASR_DIA_DUMP_TOKENSCRISPASR_DIA_FORCE_TOKENSCRISPASR_DIA_GREEDYCRISPASR_DIA_MAX_STEPSCRISPASR_DIA_TTS_GPU
dots.tts
CRISPASR_DOTS_CFG_INTERVALCRISPASR_DOTS_CFG_INTERVAL_DEBUGCRISPASR_DOTS_DIFF_GPUCRISPASR_DOTS_DIT_DEBUGCRISPASR_DOTS_EOS_THRESHOLDCRISPASR_DOTS_FM_ABCRISPASR_DOTS_FM_DUMPCRISPASR_DOTS_FUSED_STEPCRISPASR_DOTS_MAX_PATCHESCRISPASR_DOTS_ODE_STEPSCRISPASR_DOTS_PENC_VERIFYCRISPASR_DOTS_TTS_BENCHCRISPASR_DOTS_TTS_CPUCRISPASR_DOTS_TTS_DEBUG
ECAPA (LID / speaker)
CRISPASR_ECAPA_ASP_CPUCRISPASR_ECAPA_ASP_GGMLCRISPASR_ECAPA_FORCE_SCALARCRISPASR_ECAPA_LID_BENCHCRISPASR_ECAPA_REF_FBANKCRISPASR_ECAPA_TIMING
F5-TTS
CRISPASR_F5_BATCH_CFGCRISPASR_F5_BENCHCRISPASR_F5_CFG_INTERVALCRISPASR_F5_DURATION_CLAMP— clamp the per-char speech rate into a sane English band so a reference whose audio/transcript lengths are mismatched can't truncate (or balloon) the output (#294). Default on; set0to restore the exact upstreamref_T / ref_text_len * gen_text_len / speedestimate.CRISPASR_F5_FORCE_SCALARCRISPASR_F5_REF_MAX_SEC— clip the reference audio to this many seconds before it drives the duration estimate (upstream parity: 12 s). Default12; set0to disable the clip.CRISPASR_F5_REF_TRIM_SILENCE— strip leading/trailing silence and collapse internal silences >~1 s in the reference audio (upstream parity). Default on; set0to disable.
FastConformer (shared encoder)
CRISPASR_FC_ATTN_CONTCRISPASR_FC_BUCKETCRISPASR_FC_FUSED_QKVCRISPASR_FC_GPU_MANUAL_ATTNCRISPASR_FC_MAX_LAYERSCRISPASR_FC_MEM_DEBUGCRISPASR_FC_NO_FLASHCRISPASR_FC_PROFILECRISPASR_FC_PROF_FPCRISPASR_FC_PROF_FP_COLSCRISPASR_FC_PW_Q8CRISPASR_FC_TILED_ATTNCRISPASR_FC_TILED_BLOCKCRISPASR_FC_WINDOWED_ATTNCRISPASR_FC_WINDOW_BLOCK
FastPitch
CRISPASR_FASTPITCH_BENCHCRISPASR_FASTPITCH_DUMP_DIRCRISPASR_FASTPITCH_FORCE_TOKENS
Ffmpeg
CRISPASR_FFMPEG_LOG
FireRed ASR / VAD
CRISPASR_FIRERED_BEAM_F32CRISPASR_FIRERED_BENCHCRISPASR_FIRERED_ENC_CPUCRISPASR_FIRERED_GGML_ATTNCRISPASR_FIRERED_LID_BENCHCRISPASR_FIRERED_MATVEC_CACHECRISPASR_FIRERED_NO_REPEAT_BREAKCRISPASR_FIRERED_VAD_BENCHCRISPASR_FIRERED_VAD_DEBUGCRISPASR_FIRERED_VAD_FORCE_SCALAR
FunASR / SenseVoice
CRISPASR_FUNASR_BENCHCRISPASR_FUNASR_DUMP_STAGESCRISPASR_FUNASR_EMBED_FASTCRISPASR_FUNASR_LLM_CPUCRISPASR_FUNASR_LLM_LAYERSCRISPASR_FUNASR_NAN_CHECKCRISPASR_FUNASR_NO_FACRISPASR_FUNASR_STEP_CACHE
Gemma-4 E2B
CRISPASR_GEMMA4_AUTO_CHUNKCRISPASR_GEMMA4_E2B_BENCHCRISPASR_GEMMA4_E2B_EMBED_FAST
GLM-ASR
CRISPASR_GLM_ASR_BENCHCRISPASR_GLM_ASR_DEBUGCRISPASR_GLM_ASR_EMBED_FASTCRISPASR_GLM_ASR_LEGACY_PROMPTCRISPASR_GLM_ASR_SINGLE_WINDOW
Granite speech / NLE
CRISPASR_GRANITE_BENCHCRISPASR_GRANITE_DEC_GALLOCRCRISPASR_GRANITE_DEC_PROFILECRISPASR_GRANITE_DISABLE_ENCODER_GRAPHCRISPASR_GRANITE_ENC_F16CRISPASR_GRANITE_FORCE_SCALARCRISPASR_GRANITE_NLE_BENCHCRISPASR_GRANITE_NLE_EDIT_DUMPCRISPASR_GRANITE_QUANT_ALL
HiFT vocoder
CRISPASR_HIFT_FULL_IDFT
HTDemucs (source separation)
CRISPASR_HTDEMUCS_BLAS— route the CrossTransformer matmuls throughcblas_sgemm(default ON where Accelerate is available).=0selects the scalar path. The transformer is ~86% of an unoptimised forward pass, so this is the dominant knob (measured 44x on the transformer, 4.6x overall).CRISPASR_HTDEMUCS_FASTCONV— batched im2col + one GEMM for the CPU convs (default ON).=0selects the original per-time-frame scalar path. Measuredenc.conv2d10.0 s -> 0.17 s andenc.rewrite12.2 s -> 0.30 s.CRISPASR_HTDEMUCS_WCACHE— cache F32 copies of weight tensors by pointer (default ON).=0re-reads and re-converts on every access, which the DConv stacks do ~6k times per encoder layer.CRISPASR_HTDEMUCS_GGML— run the CrossTransformer as a ggml graph instead of the CPU/BLAS path (default OFF). Verified correct on CPU and Metal (45/45 stages, every layer cos 1.000000) but not yet proven faster overall, so it stays opt-in per the inverse-default rule.CRISPASR_HTDEMUCS_GPU— request a GPU backend (CUDA > Metal > Vulkan, CPU fallback). Only meaningful together with_GGML=1: under the CPU/BLAS path the weights would sit on the device and every kernel would pay a read back.CRISPASR_HTDEMUCS_PROFILE— print a per-phase wall-time breakdown of one forward pass (stft / enc / transformer / dec / istft).CRISPASR_HTDEMUCS_DEBUG— verbose per-layer shape and NaN diagnostics.CRISPASR_HTDEMUCS_SKIP_TIME— skip the time branch (bisection aid).
All three optimisation gates are output-equivalent: the per-stage diff reports 45/45 stages passing with them ON or OFF.
Higgs STT
CRISPASR_HIGGS_DEBUGCRISPASR_HIGGS_STT_BENCHCRISPASR_HIGGS_STT_EMBED_FASTCRISPASR_HIGGS_STT_FUSED_QKV
IndexTTS
CRISPASR_INDEXTTS_AA_BACKENDCRISPASR_INDEXTTS_AA_SCALARCRISPASR_INDEXTTS_AUDIO24K_FILECRISPASR_INDEXTTS_BEAM_SIZECRISPASR_INDEXTTS_BENCHCRISPASR_INDEXTTS_COND_FILECRISPASR_INDEXTTS_DEBUGCRISPASR_INDEXTTS_KV_DEVICE_COPYCRISPASR_INDEXTTS_LATENT_FILECRISPASR_INDEXTTS_MEL_CODES_FILECRISPASR_INDEXTTS_MEL_FILECRISPASR_INDEXTTS_SPK_NORMCRISPASR_INDEXTTS_TEXT_NORMALIZERCRISPASR_INDEXTTS_VOCODER_AACRISPASR_INDEXTTS_VOCODER_RAWCRISPASR_INDEXTTS_VOC_BENCHCRISPASR_INDEXTTS_VOC_FORCE_GPU
Irodori TTS
CRISPASR_IRODORI_CAPTIONCRISPASR_IRODORI_CAPTION_TOKEN_IDSCRISPASR_IRODORI_CFG_CAPTIONCRISPASR_IRODORI_CFG_INTERVALCRISPASR_IRODORI_CFG_INTERVAL_DEBUGCRISPASR_IRODORI_CFG_SPEAKERCRISPASR_IRODORI_CFG_TEXTCRISPASR_IRODORI_CODEC_CPUCRISPASR_IRODORI_CODEC_GPUCRISPASR_IRODORI_CPUCRISPASR_IRODORI_DEBUGCRISPASR_IRODORI_DECODE_CHUNKCRISPASR_IRODORI_DECODE_CTXCRISPASR_IRODORI_DIT_TIMINGCRISPASR_IRODORI_DUMP_LATENTCRISPASR_IRODORI_DUMP_TEXT_STATECRISPASR_IRODORI_DUMP_TOKENSCRISPASR_IRODORI_DUMP_V_PRED0CRISPASR_IRODORI_ENC_DUMPCRISPASR_IRODORI_ENC_PRENORMCRISPASR_IRODORI_FASTCONVCRISPASR_IRODORI_LAYERSCRISPASR_IRODORI_ODE_STEPSCRISPASR_IRODORI_PERSIST_GRAPHCRISPASR_IRODORI_REF_NOISECRISPASR_IRODORI_TOKEN_IDSCRISPASR_IRODORI_T_LATENT
Kokoro
CRISPASR_KOKORO_BENCHCRISPASR_KOKORO_DEBUGCRISPASR_KOKORO_DEBUG_INTERMEDIATESCRISPASR_KOKORO_DUMP_STAGESCRISPASR_KOKORO_FASTCONVCRISPASR_KOKORO_FASTCONV_DEBUGCRISPASR_KOKORO_G2PCRISPASR_KOKORO_SEEDCRISPASR_KOKORO_USE_GPUCRISPASR_KOKORO_VOICE_GGUF
KugelAudio
CRISPASR_KUGELAUDIO_CPU_ONLYCRISPASR_KUGELAUDIO_DEBUG
Kyutai STT
CRISPASR_KYUTAI_RVQ_FASTCRISPASR_KYUTAI_STT_BENCH
LFM2-Audio
CRISPASR_LFM2_AUDIO_BENCHCRISPASR_LFM2_AUDIO_CPUCRISPASR_LFM2_SNAP_LAYERS
M2M-100 translate
CRISPASR_M2M100_BENCHCRISPASR_M2M100_GPU
MarbleNet VAD
CRISPASR_MARBLENET_VAD_BENCH
MeloTTS
CRISPASR_MELOTTS_BENCHCRISPASR_MELOTTS_BERTCRISPASR_MELOTTS_FORCE_SCALARCRISPASR_MELOTTS_WEIGHT_CACHE
Mimi codec
CRISPASR_MIMI_NONCAUSAL
MiMo-ASR
CRISPASR_MIMO_ASR_BENCHCRISPASR_MIMO_ASR_DIAGCRISPASR_MIMO_ASR_DUMP_STAGESCRISPASR_MIMO_ASR_GPUCRISPASR_MIMO_FORCE_CPUCRISPASR_MIMO_SMOKE_DUMPCRISPASR_MIMO_SMOKE_GPUCRISPASR_MIMO_TOKENIZER_GPUCRISPASR_MIMO_TOK_CPU
mini-omni2
CRISPASR_MINI_OMNI2_BENCH
Moonshine
CRISPASR_MOONSHINE_ALL_GPUCRISPASR_MOONSHINE_BENCHCRISPASR_MOONSHINE_ENC_ATTNCRISPASR_MOONSHINE_NO_REPEAT_BREAKCRISPASR_MOONSHINE_STREAMING_BENCHCRISPASR_MOONSHINE_STREAMING_GPUCRISPASR_MOONSHINE_STREAM_BENCH
MOSS family
CRISPASR_MOSS_AUDIO_BENCHCRISPASR_MOSS_AUDIO_EMBED_FASTCRISPASR_MOSS_AUDIO_ENC_FLASHCRISPASR_MOSS_AUDIO_ENC_MANUALCRISPASR_MOSS_AUDIO_FORCE_CPUCRISPASR_MOSS_AUDIO_MEL_FILECRISPASR_MOSS_DIARIZE_BENCHCRISPASR_MOSS_DIARIZE_DEBUGCRISPASR_MOSS_DIARIZE_DUMP_CONVCRISPASR_MOSS_DIARIZE_ENC_FLASHCRISPASR_MOSS_DIARIZE_ENC_MANUALCRISPASR_MOSS_DIARIZE_FORCE_CPUCRISPASR_MOSS_DIARIZE_NO_LOOPFIXCRISPASR_MOSS_TRANSCRIBE_BENCHCRISPASR_MOSS_TRANSCRIBE_ENC_DUMPCRISPASR_MOSS_TRANSCRIBE_ENC_FLASHCRISPASR_MOSS_TRANSCRIBE_ENC_MANUALCRISPASR_MOSS_TRANSCRIBE_FORCE_CPUCRISPASR_MOSS_TRANSCRIBE_L0_DUMPCRISPASR_MOSS_TRANSCRIBE_MEL_DUMPCRISPASR_MOSS_TRANSCRIBE_NO_LOOPFIXCRISPASR_MOSS_TTS_BENCHCRISPASR_MOSS_TTS_LOCAL_DEBUGCRISPASR_MOSS_TTS_LOCAL_GREEDY_AUDIOCRISPASR_MOSS_TTS_LOCAL_NO_GPU
MP3 codec
CRISPASR_MP3_ENCODER
Diarization — foxnose (#324)
CRISPASR_DIARIZE_COUNT— speaker-count estimator:bic(default, the upstream GMM/BIC + silhouette sweep) oreigengap. Eigengap is better on well-separated synthetic data and cheaper, but under-counts on real speech (11.4 % vs 5.3 % DER on VoxConverse) — seedocs/foxnose-diarize/PLAN.mdCRISPASR_DIARIZE_BIC_WINDOW— score silhouette only in a[k-2, k+3]window around the BIC anchor instead of the full[min, max]range. The full range is the default: the BIC anchor is unreliable in both directions (measured errors of +5 / -3 / -3 on 4/5/6 well-separated blobs) and when it over-counts the window is stranded above the truth and cannot climb back to itCRISPASR_WESPEAKER_BENCH— per-stage embedder timings (fbank / resnet / resnet_windows). Counting invocations of these is also how you check WHICH embedding path actually ranCRISPASR_WESPEAKER_DEBUG— embedder diagnosticsCRISPASR_DIARIZE_DEBUG— chosen speaker count, the reason it was chosen, and the per-k silhouette curve behind it. Worth reading before trusting a count: on a borderline file the decision can rest on a <1 % score gapCRISPASR_DIARIZE_EMBED_WORKERS— windows embedded concurrently (default:-t). Each worker gets its own context sharing one copy of the weightsCRISPASR_SPEAKER_EMBED_THREADS— ggml threads per embedder context (default:-t). Honoured by the pluggable embedders and by wespeakerCRISPASR_DIARIZE_SPAN_EMBED=1— run ONE network pass per span of windows instead of one per window. 1.78x less diarization CPU for +0.30 mean DER on the VoxConverse dev shard; off by default because accuracy is the better default for a diarizer. Seedocs/cli.md#diarizationCRISPASR_DIARIZE_SPAN_WINDOWS— windows per span (default 32). Measured NOT to affect the accuracy cost — identical from N=2 to N=32 — so there is nothing to tune here; larger is simply faster
GigaAM-v3
CRISPASR_GIGAAM_BENCH— per-stage timings (mel / encoder / decode)CRISPASR_GIGAAM_DEBUG— encoder output min/max/meanCRISPASR_GIGAAM_FLASH—ggml_flash_attn_extin the encoder (opt-in; the manual QK^T path is what the per-stage diff was validated on)CRISPASR_GIGAAM_FORCE_SCALAR— scalar LSTM/joint loops instead of cblasCRISPASR_GIGAAM_QUANT_ALL— letcrispasr-quantizequantize the heads and the pre-encode convs too (default keeps them at source precision)
Nemotron
CRISPASR_NEMOTRON_BENCHCRISPASR_NEMOTRON_CONTEXT_PRESETCRISPASR_NEMOTRON_DEBUGCRISPASR_NEMOTRON_DECODE_TIMINGCRISPASR_NEMOTRON_FORCE_SCALARCRISPASR_NEMOTRON_GGML_DECODECRISPASR_NEMOTRON_MAESCRISPASR_NEMOTRON_NO_WINDOW_MASKCRISPASR_NEMOTRON_STREAMING
OmniASR
CRISPASR_OMNIASR_BENCHCRISPASR_OMNIASR_DEBUGCRISPASR_OMNIASR_DUMP_DIRCRISPASR_OMNIASR_KEEP_F16_HEADCRISPASR_OMNIASR_KEEP_F16_TAILCRISPASR_OMNIASR_QUANT_ALL
OmniVoice
CRISPASR_OMNIVOICE_ACENC_BISECTCRISPASR_OMNIVOICE_AUTO_LANG— default on. When no language was requested (-l/-tl/ the server's"language"/set_target_language), guess one from the text being spoken and use it if it maps to an id the model knows. An explicitly requested language always wins; a low-confidence guess resolves to nothing and behaves exactly as before.=0restores the old always-language-agnostic behaviour. Exists because SubtitleEdit's language menu is not yet wired to its request payload (#13273).CRISPASR_OMNIVOICE_BENCHCRISPASR_OMNIVOICE_CFG_INTERVALCRISPASR_OMNIVOICE_CHUNKCRISPASR_OMNIVOICE_CLASS_TEMPCRISPASR_OMNIVOICE_CODEC_FASTCONVCRISPASR_OMNIVOICE_CODEC_GPU— codec placement override (1= GPU,0= CPU). Unset defaults to GPU on CUDA and CPU on Metal/CPU.CRISPASR_OMNIVOICE_CPUCRISPASR_OMNIVOICE_DEBUG_CODESCRISPASR_OMNIVOICE_DEBUG_SUMCRISPASR_OMNIVOICE_ENCODE_DIFFCRISPASR_OMNIVOICE_FRAMES_PER_CHARCRISPASR_OMNIVOICE_FUSED_STEPCRISPASR_OMNIVOICE_GUIDANCECRISPASR_OMNIVOICE_HUBERT_REFCRISPASR_OMNIVOICE_NUM_STEPSCRISPASR_OMNIVOICE_PERSISTENT_GRAPHCRISPASR_OMNIVOICE_POS_TEMPCRISPASR_OMNIVOICE_UNIFIED_CFGCRISPASR_OMNIVOICE_VOICE_CACHE
OpenVoice2
CRISPASR_OPENVOICE2_BENCH
OpenVoice2
CRISPASR_OV2_DUMP_DIRCRISPASR_OV2_FORCE_SCALARCRISPASR_OV2_NO_NORMALIZECRISPASR_OV2_TAU
Opus codec
CRISPASR_OPUS_DEBUGCRISPASR_OPUS_DECODERCRISPASR_OPUS_ENCODER
Orpheus
CRISPASR_ORPHEUS_BENCHCRISPASR_ORPHEUS_BUCKETCRISPASR_ORPHEUS_DEBUGCRISPASR_ORPHEUS_DIFF_GPUCRISPASR_ORPHEUS_DIFF_MAXGENCRISPASR_ORPHEUS_PROMPT_IDSCRISPASR_ORPHEUS_SNAC_CODECRISPASR_ORPHEUS_SNAC_GPUCRISPASR_ORPHEUS_SNAC_T_SUPER
OuteTTS
CRISPASR_OUTETTS_BENCH
Paraformer
CRISPASR_PARAFORMER_BENCHCRISPASR_PARAFORMER_GPU
Parakeet
CRISPASR_PARAKEET_ATT_CONTEXTCRISPASR_PARAKEET_BENCHCRISPASR_PARAKEET_CHUNK_OVERLAPCRISPASR_PARAKEET_CHUNK_SECONDSCRISPASR_PARAKEET_DEBUGCRISPASR_PARAKEET_DECODE_TIMINGCRISPASR_PARAKEET_ENC_CACHECRISPASR_PARAKEET_ENC_PROBECRISPASR_PARAKEET_FORCE_SCALARCRISPASR_PARAKEET_GGML_DECODECRISPASR_PARAKEET_INTERNAL_CHUNKINGCRISPASR_PARAKEET_LONGFORMCRISPASR_PARAKEET_MAESCRISPASR_PARAKEET_MEM_COEFFCRISPASR_PARAKEET_MEM_POLICYCRISPASR_PARAKEET_QUANT_ALLCRISPASR_PARAKEET_SIMULATE_ENCODE_OOMCRISPASR_PARAKEET_STREAM_CHUNKCRISPASR_PARAKEET_STREAM_OVERLAPCRISPASR_PARAKEET_STREAM_THRESHOLDCRISPASR_PARAKEET_VAD_SLICE_CAPCRISPASR_PARAKEET_VRAM_BUDGET_MB
Parler-TTS
CRISPASR_PARLER_BUCKETCRISPASR_PARLER_DEBUGCRISPASR_PARLER_DESC_IDSCRISPASR_PARLER_DIFF_MAXGENCRISPASR_PARLER_DUMP_ENCCRISPASR_PARLER_PROMPT_IDSCRISPASR_PARLER_TTS_BENCH
Piper
CRISPASR_PIPER_FORCE_SCALARCRISPASR_PIPER_TTS_BENCHCRISPASR_PIPER_WEIGHT_CACHE
Pocket-TTS
CRISPASR_POCKET_DUMP_DIRCRISPASR_POCKET_FORCE_LATENTSCRISPASR_POCKET_FORCE_NOISECRISPASR_POCKET_MANUAL_BACKBONECRISPASR_POCKET_MANUAL_MIMICRISPASR_POCKET_MAX_FRAMESCRISPASR_POCKET_MIMI_DUMPCRISPASR_POCKET_MIMI_SCALARCRISPASR_POCKET_TTS_BENCHCRISPASR_POCKET_VOICE_CACHECRISPASR_POCKET_VULKAN_MIMI_MAX_FRAMES
Pyannote segmentation
CRISPASR_PYANNOTE_LEGACYCRISPASR_PYANNOTE_SEG_BENCHCRISPASR_PYANNOTE_SEG_DUMPCRISPASR_PYANNOTE_CHUNK_S— audio per chunk of parallel inference, in seconds (default 60;0restores the pre-#326 single scan over the whole file). Chunking is decided by audio LENGTH and never by thread count, so posteriors do not change with-tCRISPASR_PYANNOTE_CHUNK_CONTEXT_S— real audio spliced either side of a chunk and then trimmed (default 5), which absorbs the convolutions' zero padding and the LSTM's zero initial state
Qwen3-ASR
CRISPASR_QWEN3ASR_QUANT_AUDIO
Qwen3-ASR / Qwen3-TTS
CRISPASR_QWEN3_ASR_BENCHCRISPASR_QWEN3_ASR_EMBED_FASTCRISPASR_QWEN3_ASR_FUSED_QKVCRISPASR_QWEN3_SYSPROMPT_LANGCRISPASR_QWEN3_TTS_BENCHCRISPASR_QWEN3_TTS_CODEC_ALLOW_FULLCRISPASR_QWEN3_TTS_CODEC_CHUNKCRISPASR_QWEN3_TTS_CODEC_CPUCRISPASR_QWEN3_TTS_CODEC_CTXCRISPASR_QWEN3_TTS_CODEC_FORCE_METALCRISPASR_QWEN3_TTS_CODEC_GGUFCRISPASR_QWEN3_TTS_CODEC_GPUCRISPASR_QWEN3_TTS_CODEC_TRACECRISPASR_QWEN3_TTS_EMBD_CHECKCRISPASR_QWEN3_TTS_DUMP_LOGITS=<dir>— write the raw per-frame talker logits (f32, before the repetition penalty and the suppress mask) plus a top-5 line to stderr. The instrument for a cross-backend diff: tokens alone cannot tell a miscompute from amplified rounding (#337).CRISPASR_QWEN3_TTS_REPLAY_CODES=<file>— 16 whitespace-separated codec ids per frame; the decode uses them instead of sampling. Teacher forcing, and the ONLY way to compare two backends step by step: pin the whole frame or the 15 residual codebooks (which must be sampled) diverge and the diff measures trajectory, not arithmetic (#337).CRISPASR_QWEN3_TTS_REPLAY_TOKENS=<file>— the weaker form: codebook-0 ids only. Useful for forcing a trajectory, NOT sufficient for a logits diff.CRISPASR_QWEN3_TTS_GREEDY— force the talker's codebook-0 sampler to argmax (top_k=1). The frame sequence then depends only on the logits, so two backends agree if and only if their logits agree — this is the lever for telling a GPU miscompute apart from a sampling difference, and without it a CPU-vs-GPU token comparison proves nothing (#337).CRISPASR_QWEN3_TTS_MAX_FRAMESCRISPASR_QWEN3_TTS_SKIP_REF_DECODE
SenseVoice
CRISPASR_SENSEVOICE_BENCHCRISPASR_SENSEVOICE_NO_FA
Sidon
CRISPASR_SIDON_FASTCONV— DAC convolution mode (off,k1-f16,k1-f32, orfull). Unset defaults tok1-f16on CUDA andoffon Vulkan/CPU.CRISPASR_SIDON_RPE— relative-position-bias formulation:bucket-direct(default),bucket, orexpand(legacy[head_dim, T, T]expansion, ~1 GiB more predictor workspace atT≈2825; keeps the Vulkanmul_matbatching branch). All three are algebraically equivalent.CRISPASR_SIDON_DECODER_CHUNK_FRAMES— maximum DAC core size in feature frames (default512).0decodes the whole utterance in one graph (~4.5 GiB atT≈2825vs ~0.79 GiB chunked). Chunked output is bit-exact against the whole-utterance decode.CRISPASR_SIDON_LOOKAHEAD— set to0to disable the input padding (one leading predictor frame plus 1.5 s of right-side lookahead). Padding is on by default; without it the last ~12 ms of every clip is a full-scale transient.CRISPASR_SIDON_MAX_FRAMES— predictor input cap in feature frames (default3000, ~58.5 s after the lookahead). Guards theO(T^2)attention.CRISPASR_SIDON_DEBUG— print per-stage scheduler workspace sizes (per backend) after graph allocation.
Sherpa
CRISPASR_SHERPA_LID_BIN
Silero LID
CRISPASR_SILERO_FORCE_SCALARCRISPASR_SILERO_LID_BENCHCRISPASR_SILERO_LID_DEBUGCRISPASR_SILERO_LID_DUMPCRISPASR_SILERO_LID_LEGACYCRISPASR_SILERO_LID_MAX_SCRISPASR_SILERO_LID_TRACECRISPASR_SILERO_LID_TRACE_OFFCRISPASR_SILERO_LID_TRUNCCRISPASR_SILERO_LID_VULKAN
SpeechT5
CRISPASR_SPEECHT5_DUMP_DIRCRISPASR_SPEECHT5_FASTCONVCRISPASR_SPEECHT5_FASTCONV_DEBUGCRISPASR_SPEECHT5_TTS_BENCH
T5 translate
CRISPASR_T5_GPUCRISPASR_T5_TRANSLATE_BENCH
TaDa TTS
CRISPASR_TADA_ACOUSTIC_CFGCRISPASR_TADA_ALLOW_VULKANCRISPASR_TADA_BATCH_PREFILLCRISPASR_TADA_BENCHCRISPASR_TADA_BUCKET_MINCRISPASR_TADA_CFG_INTERVALCRISPASR_TADA_CFG_INTERVAL_DEBUGCRISPASR_TADA_CODEC_BENCHCRISPASR_TADA_CODEC_DUMPCRISPASR_TADA_CODEC_GGUFCRISPASR_TADA_CODEC_VULKAN_NATIVECRISPASR_TADA_CTC_ASRCRISPASR_TADA_DIFF_TEXTCRISPASR_TADA_DO_SAMPLECRISPASR_TADA_DUMP_ACOUSTIC_FEATURESCRISPASR_TADA_DUMP_FEATURESCRISPASR_TADA_DUMP_FM_STEPSCRISPASR_TADA_DUMP_TIME_BEFORECRISPASR_TADA_ENCODER_DEBUGCRISPASR_TADA_EXTRA_STEPSCRISPASR_TADA_FM_B2CRISPASR_TADA_KEEP_F16_HEADCRISPASR_TADA_KEEP_F16_TAILCRISPASR_TADA_MAX_EXPANDED_FRAMESCRISPASR_TADA_NOISE_TEMPCRISPASR_TADA_NO_BUCKETCRISPASR_TADA_NUM_CANDIDATESCRISPASR_TADA_NUM_FM_STEPSCRISPASR_TADA_PROMPT_CACHECRISPASR_TADA_PROMPT_TEXTCRISPASR_TADA_QUANT_ALLCRISPASR_TADA_REPETITION_PENALTYCRISPASR_TADA_SCORERCRISPASR_TADA_TALKER_TIMINGCRISPASR_TADA_TEMPERATURECRISPASR_TADA_TOP_KCRISPASR_TADA_TOP_PCRISPASR_TADA_VULKAN_NATIVE
TitaNet speaker
CRISPASR_TITANET_BENCHCRISPASR_TITANET_DUMPCRISPASR_TITANET_DUMP_MELCRISPASR_TITANET_FORCE_SCALARCRISPASR_TITANET_GGMLCRISPASR_TITANET_GPUCRISPASR_TITANET_LEGACYCRISPASR_TITANET_REF_MEL
Three compute paths exist and all are kept working; the default is the fastest one measured per platform.
| path | selected by | measured, M1, 2 s segment |
|---|---|---|
| legacy (Accelerate / hand-rolled) | default where HAVE_ACCELERATE | 71.7 ms |
| ggml graph, CPU | default elsewhere; CRISPASR_TITANET_GGML=1 | 277.3 ms |
| ggml graph, GPU | CRISPASR_TITANET_GGML=1 CRISPASR_TITANET_GPU=1 | 31.9 ms (but see below) |
All three agree to cosine 1.000000 with each other and 0.999996 against
NVIDIA's nemo_en_titanet_large.onnx export fed the same mel — so the choice is
purely about speed.
⚠ CRISPASR_TITANET_GPU=1 is opt-in because it loses on real workloads
despite winning the micro-benchmark. Diarization embeds one segment per call
at variable lengths, so every call reshapes the graph and the GPU allocator
re-reserves; and CRISPASR_SPEAKER_EMBED_WORKERS runs several embedders at once,
which contend for the one GPU. End-to-end on a 600 s clip, 47 segments:
workers=4, legacy 9994 ms <- default, fastest
workers=1, legacy 12673 ms
workers=1, GPU 15275 ms
workers=4, GPU 49866 ms
Keep it for evaluating a discrete GPU (where the balance may differ) or for
CRISPASR_SPEAKER_EMBED_WORKERS=1 on a machine with weak CPU cores. Bucketing
segment lengths so the graph shape stops changing is the work that would make
this path win generally.
CRISPASR_TITANET_DUMP_MEL=<path> writes the computed mel as [T][n_mels]
float32 — the counterpart to CRISPASR_TITANET_REF_MEL. Feeding that dump to an
upstream ONNX export separates the front-end from the network, which a single
end-to-end cosine cannot do.
VibeVoice
CRISPASR_VIBEVOICE_BENCHCRISPASR_VIBEVOICE_DEBUGCRISPASR_VIBEVOICE_DUMP_DIRCRISPASR_VIBEVOICE_ENCODER_CHUNK_SECONDSCRISPASR_VIBEVOICE_ENCODER_CONTEXT_SECONDSCRISPASR_VIBEVOICE_LM_BUCKETSCRISPASR_VIBEVOICE_NO_LM_BUCKETSCRISPASR_VIBEVOICE_PRED_SCHEDCRISPASR_VIBEVOICE_QUANT_ALLCRISPASR_VIBEVOICE_REF_FEATURESCRISPASR_VIBEVOICE_REUSE_PRED_GRAPHCRISPASR_VIBEVOICE_TTS_CFG_SCALECRISPASR_VIBEVOICE_TTS_DUMPCRISPASR_VIBEVOICE_TTS_DUMP_DECODERCRISPASR_VIBEVOICE_TTS_DUMP_PERFRAMECRISPASR_VIBEVOICE_TTS_FLASH_ATTNCRISPASR_VIBEVOICE_TTS_LATENTSCRISPASR_VIBEVOICE_TTS_NOISECRISPASR_VIBEVOICE_TTS_SEEDCRISPASR_VIBEVOICE_TTS_TRACECRISPASR_VIBEVOICE_TTS_TRACE_FRAMECRISPASR_VIBEVOICE_VAE_BACKENDCRISPASR_VIBEVOICE_VOICE_AUDIO
VoxCPM2
CRISPASR_VOXCPM2_BENCHCRISPASR_VOXCPM2_CFG_INTERVALCRISPASR_VOXCPM2_CFG_INTERVAL_DEBUGCRISPASR_VOXCPM2_CFG_VALUECRISPASR_VOXCPM2_CPU_ONLYCRISPASR_VOXCPM2_INFERENCE_STEPSCRISPASR_VOXCPM2_MAX_LENCRISPASR_VOXCPM2_USE_REFCRISPASR_VOXCPM2_VAE_MAX_SAMPLES- maximum 16 kHz input samples accepted by onevoxcpm2-vaeupscaling call (default960000, or 60 seconds). Split longer audio, or raise this only when enough RAM/VRAM is available.
Voxtral / Voxtral-TTS
CRISPASR_VOXTRAL_BENCHCRISPASR_VOXTRAL_FUSED_QKVCRISPASR_VOXTRAL_TTS_CODEC_FROM_FILECRISPASR_VOXTRAL_TTS_DIFF_DUMPCRISPASR_VOXTRAL_TTS_SEMANTIC_CBCRISPASR_VOXTRAL_TTS_TEXTCRISPASR_VOXTRAL_TTS_VOICE
Voxtral-4B
CRISPASR_VOXTRAL4B_BENCHCRISPASR_VOXTRAL4B_FUSED_QKVCRISPASR_VOXTRAL4B_STREAM_BATCH_ENCODERCRISPASR_VOXTRAL4B_STREAM_CHUNK_MSCRISPASR_VOXTRAL4B_STREAM_DEBUGCRISPASR_VOXTRAL4B_STREAM_DECODER_THREADCRISPASR_VOXTRAL4B_STREAM_DIFFCRISPASR_VOXTRAL4B_STREAM_LIVECRISPASR_VOXTRAL4B_STREAM_TIMING
Wav2Vec2
CRISPASR_WAV2VEC2_BENCHCRISPASR_WAV2VEC2_DUMP_DIRCRISPASR_WAV2VEC2_VERBOSE
WavTokenizer
CRISPASR_WAVTOK_BENCHCRISPASR_WAVTOK_DUMP_DIRCRISPASR_WAVTOK_FIXED_CODES
Zonos
CRISPASR_ZONOS_CPP_DUMP_DIRCRISPASR_ZONOS_DECODE_CHUNKCRISPASR_ZONOS_DECODE_CTXCRISPASR_ZONOS_DIFF_N_STEPSCRISPASR_ZONOS_FASTCONVCRISPASR_ZONOS_SPEAKER_EMB_PATHCRISPASR_ZONOS_TTS_BENCHCRISPASR_ZONOS_TTS_TEXT