Fast inference for CrisperWhisper speech recognition models
Project description
CrisperWhisper 2.0
The most accurate verbatim speech recognition you can run in production: controllable, multilingual, and timed to the word.
Release post · Paper · Full documentation · Models · Benchmark
Most speech-to-text systems never actually decide whether to write down what was said or what was meant. They inherit that choice from their training data and apply it inconsistently. CrisperWhisper 2.0 makes it an explicit, controllable choice. One recording, two transcripts:
Verbatim, exactly what was said, in one consistent format:
[um] so we we need to, to reschedule the th- thursday meeting to [uh] march third at nine thirty [laughter]Intended, the clean version the speaker meant, with numbers, dates, and emails formatted the way you'd write them:
So we need to reschedule the Thursday meeting to March 3 at 9:30.
On top of that:
- Word-level timings. Around 30 ms mean boundary error on read speech and 41 ms on conversational speech, the most precise word timing of any system we benchmarked, on both.
- Verbatimize. Upgrade transcripts you already have: given audio plus a trusted clean transcript, the model reproduces your content word-for-word and inserts only the disfluencies and vocal events actually present in the audio (rare-word recall jumps from 6.8% to 96.1% vs. re-transcribing). This turns the world's abundant clean corpora into verbatim ones, ready for TTS data, clinical speech analysis, and dataset construction.
- Multilingual. Verbatim and intended modes work across most languages Whisper supports. CrisperWhisper 2.0 tops the Nyra Verbatim Speech Benchmark leaderboard for disfluency F1 across ten languages, ahead of every closed-source alternative we tested.
- Seamless longform. Audio of any length, transcribed without the usual chunk-boundary artifacts: each window continues from the words already transcribed (conditional continuation), so there are no duplicated or dropped words at the seams and no fragile timestamp-token bookkeeping.
- Production inference. A CTranslate2 runtime with speculative decoding and built-in mitigation of Whisper's looping-hallucination failure mode.
Performance
The Nyra Verbatim Speech Benchmark scores fillers, repetitions, cut-offs, and vocal sounds as separate, typed metrics. Its headline number is disfluency F1: how reliably a system writes down the disfluencies that were actually spoken, without inventing ones that weren't. Averaged over ten languages:
| # | System | Disfluency F1 |
|---|---|---|
| 1 | CrisperWhisper 2.0 Pro | 93.5 |
| 2 | CrisperWhisper 2.0 | 87.8 |
| 3 | ElevenLabs Scribe v2 | 79.2 |
| 4 | Microsoft MAI-Transcribe-1.5 | 77.5 |
| 5 | CrisperWhisper 1.0* | 64.8 |
| 6 | Inworld STT | 59.5 |
| 7 | xAI Grok Speech-to-Text | 42.8 |
| 8 | Deepgram Nova-3 | 37.8 |
| 9 | Fish Audio ASR | 35.0 |
| 10 | AssemblyAI Universal-3 Pro | 30.5 |
* CrisperWhisper 1.0 is English/German-only; its average covers those two languages. English and German use human-labeled evaluation sets; the other eight languages use synthetic verbatim sets. Per-language breakdowns and how the metric is computed are in the benchmark post.
Word-timing accuracy
Mean absolute word-boundary error on read speech (TIMIT), lower is better:
| # | System | Boundary error |
|---|---|---|
| 1 | CrisperWhisper 2.0 | 29.6 ms |
| 2 | xAI Grok Speech-to-Text | 37.1 ms |
| 3 | CTC-seg | 49.3 ms |
| 4 | ElevenLabs Scribe v2 | 51.3 ms |
| 5 | NeMo-FA | 60.0 ms |
| 6 | Deepgram Nova-3 | 63.3 ms |
| 7 | WhisperX | 64.8 ms |
| 8 | Cartesia Ink-Whisper | 69.4 ms |
| 9 | Canary | 85.5 ms |
Scored on exactly the words each system gets right. How the timings are extracted from supervised cross-attention, plus results on conversational speech, are in the aligner post.
Install
# NVIDIA GPU (Linux): fastest, includes speculative decoding.
# An NVIDIA driver is all you need; CUDA libraries arrive via pip.
pip install "crisperwhisper[ct2]"
# Pure PyTorch: runs anywhere torch does (macOS, Windows, CPU)
pip install "crisperwhisper[transformers]"
Quickstart
from crisperwhisper import CrisperWhisperModel
model = CrisperWhisperModel() # nyralabs/CrisperWhisper2.0_large
# or pick a size: CrisperWhisperModel("turbo") # turbo / medium / small
# Verbatim transcription (default): every filler, repetition, stutter,
# false start, and vocal event
result = model.transcribe("meeting.wav", language="en")
print(result.text)
# Intended: the clean, readable version
clean = model.transcribe("meeting.wav", language="en", mode="intended")
# Word-level timestamps
result = model.transcribe("meeting.wav", language="en", word_timestamps=True)
for w in result.words:
print(f"{w.start:6.2f}-{w.end:6.2f} {w.word}")
# Verbatimize: upgrade an existing clean transcript with the
# disfluencies that are actually in the audio
result = model.verbatimize("clip.wav", "I think we should ship it Friday.")
Audio longer than 30 seconds is handled automatically (see
longform below). The first load of a model
downloads it from HuggingFace and, on the ct2 backend, converts it once
into a local cache.
Models
| Shorthand | HuggingFace ID | Notes |
|---|---|---|
"large" (default) |
nyralabs/CrisperWhisper2.0_large |
Best open quality |
"turbo" |
nyralabs/CrisperWhisper2.0_turbo |
Near-large quality, fastest; also the recommended speculative draft |
"medium" |
nyralabs/CrisperWhisper2.0_medium |
|
"small" |
nyralabs/CrisperWhisper2.0_small |
Smallest |
"large_pro" / "turbo_pro" / "medium_pro" / "small_pro" |
nyralabs/CrisperWhisper2.0_<size>_pro |
Pro: our best models, with improved performance, hotword boosting, trained on additional proprietary data |
The standard models are released under a non-commercial research license and are available for commercial licensing. The Pro models are available under commercial license only. For both, get in touch.
Faster inference: speculative decoding (ct2)
A small draft model proposes tokens and the main model verifies them. Same output, 1.3 to 1.4x faster:
model = CrisperWhisperModel("large", draft_model="turbo")
result = model.transcribe("meeting.wav", language="en",
speculative_decoding=True)
What else is in the box
Everything below works out of the box and is covered in depth in DOCS.md:
| Option | What it does |
|---|---|
mode="verbatim" / "intended" |
Choose what-was-said vs. what-was-meant per call |
word_timestamps=True |
Per-word start/end times from supervised cross-attention alignment |
hotwords=[...] |
Bias recognition toward names and rare terms (Pro models only) |
model.transcribe_dual(...) |
Verbatim and intended in one pass (ct2) |
model.verbatimize(audio, transcript) |
Insert real disfluencies into a trusted clean transcript |
model.forced_align(audio, text) |
Timings for a transcript you already have |
| Longform | Audio >30s transcribed seamlessly via conditional continuation, with no chunk-boundary duplicates, drops, or stitching |
| Hallucination mitigation | On by default: detects and suppresses Whisper's looping-repetition failure mode during decoding |
compute_type="float16" / "int8_float16" |
Quantization |
How it works
Each mechanism has a deep-dive post:
- Measuring verbatimness: the Nyra Verbatim Speech Benchmark. Typed metrics for fillers, repetitions, cut-offs, and vocal sounds instead of one opaque WER number.
- How we unlocked multilingual style-controlled transcription at scale. Verbatim/intended control across languages.
- Turning emergent cross-attention into a precise aligner. Supervising Whisper's alignment heads for word boundaries around 30 ms.
- Longform transcription with conditional continuation. Resolving window seams with the words already transcribed instead of fragile timestamp tokens.
- Closing the verbatim data gap with Verbatimize. Upgrading clean corpora into verbatim ones at scale.
- Faster inference and mitigating hallucinations. The CTranslate2 stack, speculative decoding, and the anti-looping decoder.
Documentation
DOCS.md covers the full API: backends and their trade-offs,
every transcribe() option, dual-mode transcription, forced alignment,
longform strategies, speculative-K tuning, hallucination-repair thresholds,
quantization, model conversion, and the result object.
License
The inference code in this repository is MIT-licensed (see
LICENSE): use it freely, commercially or otherwise.
crisperwhisper/features.py is vendored from
faster-whisper (MIT, SYSTRAN).
The model weights are not MIT. They are released under the Nyra Health Non-Commercial Research License: free for research and other non-commercial use; any commercial use requires a commercial license. The Pro models are available under commercial license only. For commercial licensing of either, contact Nyra.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file crisperwhisper-0.1.2.tar.gz.
File metadata
- Download URL: crisperwhisper-0.1.2.tar.gz
- Upload date:
- Size: 111.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fbc147c8897d6ec432925c399b7b29b14e12a05cd44b30bf08620b6786e3c995
|
|
| MD5 |
8e2b9b32ea5fa1b10422c9543b163b82
|
|
| BLAKE2b-256 |
d06939abb36e2fd0faa9a53de4ae4f459cdb5e4b8259468aa241ce0133084238
|
Provenance
The following attestation bundles were made for crisperwhisper-0.1.2.tar.gz:
Publisher:
publish.yml on nyrahealth/CrisperWhisper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crisperwhisper-0.1.2.tar.gz -
Subject digest:
fbc147c8897d6ec432925c399b7b29b14e12a05cd44b30bf08620b6786e3c995 - Sigstore transparency entry: 2173551928
- Sigstore integration time:
-
Permalink:
nyrahealth/CrisperWhisper@897e9829f22a3ebe20366f624c7a43f7644a519a -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/nyrahealth
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@897e9829f22a3ebe20366f624c7a43f7644a519a -
Trigger Event:
push
-
Statement type:
File details
Details for the file crisperwhisper-0.1.2-py3-none-any.whl.
File metadata
- Download URL: crisperwhisper-0.1.2-py3-none-any.whl
- Upload date:
- Size: 94.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2dbeb30297d0493d7eb9abbeed8b40d439d103e897dddb42d2c60393ef7b68ac
|
|
| MD5 |
3818ad0c464422d64eca675bfddde452
|
|
| BLAKE2b-256 |
fdbb457aa83bc3fb4ebbc65f870b8c6533999bb4621273183591b941d69b41e0
|
Provenance
The following attestation bundles were made for crisperwhisper-0.1.2-py3-none-any.whl:
Publisher:
publish.yml on nyrahealth/CrisperWhisper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crisperwhisper-0.1.2-py3-none-any.whl -
Subject digest:
2dbeb30297d0493d7eb9abbeed8b40d439d103e897dddb42d2c60393ef7b68ac - Sigstore transparency entry: 2173552008
- Sigstore integration time:
-
Permalink:
nyrahealth/CrisperWhisper@897e9829f22a3ebe20366f624c7a43f7644a519a -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/nyrahealth
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@897e9829f22a3ebe20366f624c7a43f7644a519a -
Trigger Event:
push
-
Statement type: