parakeet-rs

Library Listed

Fast ASR & Speaker Diarization with NVIDIA Parakeet via ONNX

Checked · Sources

Downloads
51,716
Dependents
8
Stars
421
Forks
65
Contributors
17
Commits
466
Latest release
0.4.4 ·

About

From the project README ·

Fast speech recognition and diarization with NVIDIA's Parakeet models, on ONNX Runtime or pure Rust with burn.

Models

ModelTypeLangDownloadExample
CTCOfflineengparakeet-ctc-0.6braw
TDTOffline, auto language25parakeet-tdt-0.6b-v3raw
Parakeet UltraOffline, Moondream's tuned TDT25parakeet-ultraraw
OrukeetOffline, TDT fine tune, int825see beloworukeet
EOUStreaming, end of utteranceengrealtime_eou_120m-v1-onnxstreaming
NemotronStreaming, verbatimengnemotron-speech-streaming-en-0.6bstreaming
Nemotron 3.5Streaming40nemotron-3.5-asr-streaming-0.6b-onnxstreaming
UnifiedOffline + streamingengparakeet-unified-en-0.6bunified
UnifiedOffline + streaming25nemotron-labs-unified-asr-0.6bunified
MultitalkerStreaming, per speakerengmultitalker-parakeet-streaming-0.6b-v1multitalker
Multitalker TDTOffline, per speaker, overlaps (how)25multitalker-tdt-0.6b-v3multitalker_tdt
Cohere TranscribeOffline, long form14onnx-communitycohere
Nemotron-3 DiarizationWho speaks when, up to 8anynemotron-3-diarizationdiarization

Download a folder and pass it to from_pretrained:

hf download altunenes/parakeet-rs --include "parakeet-tdt-0.6b-v3/*" --local-dir .
Read the full README

Multitalker and Multitalker TDT also need the diarization model. Some folders have int8 too. Or export them yourself from NeMo with scripts/export_*.py (ONNX opset 23); Cohere comes from Optimum.

Usage

ONNX Runtime (the default backend) needs one environment per process, shared by every model:

use parakeet_rs::{ExecutionConfig, ParakeetTDT, TimestampMode, Transcriber};

let env = parakeet_rs::ort::init().build()?;
let config = ExecutionConfig::new().with_environment(env);

let mut parakeet = ParakeetTDT::from_pretrained("./tdt", Some(config.clone()))?;
let result = parakeet.transcribe_samples(audio, 16000, 1, Some(TimestampMode::Sentences))?;
println!("{}", result.text);

for token in result.tokens {
    println!("[{:.3}s - {:.3}s] {}", token.start, token.end, token.text);
}

CTC is the same with Parakeet instead of ParakeetTDT. Every other model:

EOU (streaming)

use parakeet_rs::ParakeetEOU;

let mut parakeet = ParakeetEOU::from_pretrained("./eou", Some(config.clone()))?;

// 160 ms chunks, 16kHz mono
const CHUNK_SIZE: usize = 2560;
for chunk in audio.chunks(CHUNK_SIZE) {
    let text = parakeet.transcribe(chunk, false)?;
    print!("{}", text);
}

Nemotron (streaming, eng or 40)

Same API for both; the loader detects which one the folder holds. English is verbatim and keeps um, uh. 3.5 has 40 languages, casing and punctuation, and drops them.

use parakeet_rs::{Nemotron, NemotronMode};

let mut model = Nemotron::from_pretrained(path, Some(config.clone()))?;

// 3.5: "auto" by default, a known language is more accurate.
if model.mode() == NemotronMode::Multilingual {
    model.set_target_lang("es-ES")?; // also: "ja-JP", "tr-TR", "auto", ...
}

// 560 ms chunks
const CHUNK_SIZE: usize = 8960;
for chunk in audio.chunks(CHUNK_SIZE) {
    let text = model.transcribe_chunk(chunk)?;
    print!("{}", text);
}

Unified (offline + streaming, eng or 25)

One model for offline and buffered streaming. The 25 language one takes the audio's language; auto by default, a known language is a bit more accurate.

use parakeet_rs::{ParakeetUnified, TimestampMode, Transcriber};

let mut model = ParakeetUnified::from_pretrained("./unified", Some(config.clone()))?;
model.set_target_lang("de")?; // 25 language model only: "fr", "pl", "auto", ...

// Offline
let result = model.transcribe_samples(audio.clone(), 16000, 1, Some(TimestampMode::Words))?;

// Streaming: 560 ms chunks, 5.6 s left context by default
let chunk = model.streaming_config().chunk_samples();
for piece in audio.chunks(chunk) {
    print!("{}", model.transcribe_chunk(piece)?);
}
print!("{}", model.flush()?);

Multitalker (streaming, per speaker, eng)

parakeet-rs = { version = "0.4", features = ["multitalker"] }
use parakeet_rs::MultitalkerASR;

let mut model = MultitalkerASR::from_pretrained(
    "./multitalker",             // encoder, decoder, tokenizer
    "nemotron3_diar_v3.onnx",    // Nemotron-3 (Sortformer v3) for diarization
    Some(config.clone()),
)?;

for chunk in audio.chunks(17920) {  // ~1.12s at 16kHz
    let results = model.transcribe_chunk(chunk)?;
    for r in &results {
        println!("[Speaker {}] {}", r.speaker_id, r.text);
    }
}

See examples/multitalker.rs for latency modes.

Multitalker TDT (offline, per speaker, 25)

parakeet-tdt-0.6b-v3 fine tuned with speaker kernels: one transcript per speaker, even when they talk over each other. Any audio length.

parakeet-rs = { version = "0.4", features = ["sortformer"] }
use parakeet_rs::MultitalkerTDT;

let mut model = MultitalkerTDT::from_pretrained(
    "./multitalker-tdt",         // encoder, decoder_joint, vocab.txt
    "nemotron3_diar_v3.onnx",    // Nemotron-3 (Sortformer v3) for diarization
    Some(config.clone()),
)?;

for u in model.transcribe(&audio, 16000, 1)? {
    println!("[{:.2} - {:.2}] Speaker {}: {}", u.start, u.end, u.speaker_id, u.text);
}

cpWER with 2 overlapping speakers, plain TDT + diarization → Multitalker TDT: English (LibriSpeechMix) 36.7% → 4.4%, six other languages (MLS mixtures) 39.0% → 10.7%. Single speakers stay as good as plain TDT. Details in the blog post.

Cohere Transcribe (offline, 14)

Yes, "parakeets🦜" talk about more than just NVIDIA :-P

parakeet-rs = { version = "0.4", features = ["cohere"] }
use parakeet_rs::CohereASR;

let mut model = CohereASR::from_pretrained("./cohere", Some(config.clone()))?;

// 16kHz mono, long audio is fine
let text = model.transcribe_audio(&audio, "en", true, false)?; // lang, pnc, itn
println!("{}", text);

Files: encoder_model.onnx (+ .onnx_data*), decoder_model_merged.onnx (+ .onnx_data), tokenizer.json (FP32, FP16, INT8, INT4 variants available).

Nemotron-3 Diarization (Sortformer v3, up to 8 speakers)

parakeet-rs = { version = "0.4", features = ["sortformer"] }
use parakeet_rs::sortformer::{DiarizationConfig, Sortformer, StreamingProfile};

let mut diarizer = Sortformer::with_config(
    "nemotron3_diar_v3.onnx",
    Some(config.clone()),
    DiarizationConfig::default(),
)?;
let segments = diarizer.diarize(audio, 16000, 1)?;
for seg in segments {
    println!("speaker_{} [{:.2}s - {:.2}s]", seg.speaker_id,
        seg.start as f64 / 16_000.0, seg.end as f64 / 16_000.0);
}

// Streaming: diarize_chunk() / feed() keep state across calls.
let segments = diarizer.diarize_chunk(&audio_chunk_16k_mono)?;

// Latency presets from NVIDIA's model card:
// offline() 30.4s (default), low_latency() 1.04s, very_low_latency() 0.64s, ultra_low_latency() 0.32s
diarizer.set_profile(StreamingProfile::low_latency())?;

examples/diarization.rs (pass low, very-low or ultra for the presets), examples/streaming_diarization.rs for live feed/flush, and scripts/export_diar_sortformer.py to export with custom streaming parameters.

Orukeet (TDT fine tune, int8)

The pinned Hugging Face INT8 export works with ParakeetTDT. The downloader verifies a release manifest and all required file hashes, including licenses, then prints the cached model directory:

python3 -m pip install huggingface-hub
model_dir=$(python3 scripts/download_orukeet.py)
cargo run --release --example orukeet -- "$model_dir" audio.wav
# After installation, no network is needed:
model_dir=$(python3 scripts/download_orukeet.py --offline)

It runs on the TDT code, audio stays local. The ~672 MB weights are CC BY-SA 4.0 (see the downloaded LICENSE-WEIGHTS); NOTICE.md keeps the NVIDIA attribution. The model card's accuracy numbers are from NeMo, not from this runtime.

GPU and backends

GPU with ONNX Runtime (falls back to CPU if it fails):

parakeet-rs = { version = "0.4", features = ["cuda"] }  # or tensorrt, webgpu, directml, migraphx or other ort supported EPs (check cargo features)
use parakeet_rs::{Parakeet, ExecutionConfig, ExecutionProvider};

let config = ExecutionConfig::new()
    .with_environment(parakeet_rs::ort::init().build()?)
    .with_execution_provider(ExecutionProvider::Cuda);
let mut parakeet = Parakeet::from_pretrained(".", Some(config))?;

Advanced session configuration via ort SessionBuilder:

let config = ExecutionConfig::new()
    .with_custom_configure(|builder| builder.with_memory_pattern(false));

If your app also uses ort directly, use the same environment for both: ONNX Runtime allows only one per process. parakeet_rs::ort is the ort version parakeet-rs is built with.

Pure Rust backend (burn)

Every model also runs on burn, without ONNX Runtime, on CPU or GPU. Same fp32 model files, same transcripts. Cohere's fp32 export is about 8.4 GB, all in memory. Details: v0.4.0 release notes

parakeet-rs = { version = "0.4", default-features = false, features = ["metal"] }  # "wgpu" for other GPUs, "burn" for CPU only
let config = ExecutionConfig::new().with_execution_provider(ExecutionProvider::BurnWgpu);
let mut parakeet = ParakeetTDT::from_pretrained("./tdt", Some(config))?;

Other GPU features: vulkan, burn-cuda and burn-rocm. For burn on the CPU, apple-amx (Apple Silicon) or x86-v4 (AVX-512) speed up matrix multiplication. See examples/burn.rs.

Notes

  • Audio: 16kHz mono WAV (16-bit PCM or 32-bit float)
  • CTC and TDT take up to about 4 to 5 minutes of audio. For longer files use a streaming model, Multitalker TDT, or split it
  • Token timestamps: CTC, TDT

License

Code: MIT OR Apache-2.0

FYI: The Parakeet ONNX models (downloaded separately from HuggingFace) by NVIDIA. This library does not distribute the models.

Runs on
CUDA, WebGPU, Metal, Vulkan
What shows it
  • CUDA: parakeet-rs feature cuda
  • WebGPU: parakeet-rs feature webgpu
  • Metal: parakeet-rs feature metal
  • Vulkan: parakeet-rs feature vulkan
Native code
Optional
  • Binds native code: ort-sys (feature api-24)
Python bindings
No Python binding crate found
License
Apache-2.0 OR MIT

Compare with similar projects

Order: strongest tier first, then most downloads, then name, with unmeasured values last. A library counts downloads over 30 days. An app counts binary downloads per release. An app with none counts its crate downloads over 30 days. ML Rust runs this catalogue, so its closest project always gets a row.

parakeet-rs beside the projects that share a topic with it
ProjectDownloadsDependentsStarsLatest releaseRuns on (GPU)Native codeLicense
parakeet-rs This page Listed

Fast ASR & Speaker Diarization with NVIDIA Parakeet via ONNX

51,716 downloads over 30 days 8 421 0.4.4 CUDA, WebGPU, Metal, Vulkan Binds native code: ort-sys (feature api-24) Apache-2.0 OR MIT
sherpa-onnx Featured

Safe Rust wrapper for sherpa-onnx speech recognition toolkit

Also in Run and serve models.

259,599 downloads over 30 days 28 15,834 2.0.1 GPU support unknown Binds native code: sherpa-onnx, sherpa-onnx-sys Apache-2.0

Speaker diarization using pyannote in Rust

Also in Speech and audio.

4,394 downloads over 30 days 4 131 0.3.4 GPU support unknown Binds native code: knf-rs-sys, ort-sys MIT
silero Listed

Production-oriented Rust wrapper for the Silero VAD ONNX model.

Also in Run and serve models.

1,888 downloads over 30 days 3 6 0.7.0 CUDA, ROCm Binds native code: ort-sys (feature coreml) Apache-2.0 OR MIT

Pure Rust implementation of Qwen3 ASR (Automatic Speech Recognition) with libtorch and MLX backends

Also in Speech and audio.

21 downloads over 30 days 0 254 0.2.0 CUDA Binds native code: torch-sys (feature tch-backend). Build uses a native toolchain: cmake Apache-2.0

Rust port of KittenTTS — ultra-lightweight ONNX-based text-to-speech

Also in Run and serve models.

3 downloads over 30 days 0 314 0.2.2 CUDA Binds native code: audiopus_sys, mp3lame-sys, ort-sys Apache-2.0
voxr New

Audio and speech on boostr: compressed-audio decode, resampling, DSP and grapheme to phoneme, with speech synthesis (Kokoro, VITS), voice cloning (VoxCPM2), transcription with word timings (Whisper), voice activity (Silero) and audio-text scoring (CLAP), on CPU or CUDA.

Also in Speech and audio.

642 downloads over 30 days 2 2 0.9.1 CUDA No native code found Apache-2.0
Why ListedNo archive, New or Featured rule places it, so it is Listed.

What it lacks for Featured

  • It has 8 active dependents and 8 new dependents in 365 days. Featured needs 11 active dependents or 9 new dependents in 365 days. The repository route reads 421 stars, 65 forks and 17 contributors. It needs 4,539 stars, 434 forks and 79 contributors together.

What else the check found

  • The last activity is on 31 Oct 2026, 9 days ago. The rules expect an update within 900 days. Dormancy rule

Exact rules: Listed, Featured library. The check on applied thresholds version 9.

Every rule outcome, as the check records it
  • expected-interval: version 0.4.4 base 450, doubled for 51716 downloads per month: E = 900 days
  • dormancy: last activity 2026-10-31, 9 days ago, E = 900: active
  • featured: not featured: active_users 8 < 11 and new_adopters 8 < 9 and repository route stars 421 (needs 4539), forks 65 (needs 434), contributors 17 (needs 79)
  • listed: listed: no archive, new or featured rule applies

Measurements and sources

Each signal row shows the raw value, its source and the fetch date. The Sources list gathers every distinct source on this page. Movement needs more history.

Sources6 sources
Adoption8 active dependents, 8 new dependents in 365 days1 not measured
Adoption measurements
SignalValueSourceFetchedCounts
Active dependents8crates.io database dumpYes
New dependents (365 days)8crates.io database dumpYes
Peak active dependents7.5crates.io database dumpYes
Active dependents as a share of the peak1crates.io database dumpYes
Binary downloads per releaseNot measuredYes
MaintenanceLatest human commit: 9 days ago3 not measured
Maintenance measurements
SignalValueSourceFetchedCounts
Latest human commit2026-10-31GitHub repositoryYes
Latest release2026-10-31crates.io database dumpYes
First release2025-10-15crates.io database dumpYes
Latest version0.4.4crates.io database dumpYes
Days the oldest outside issue waits for a reply0GitHub repositoryYes
Maintainer replies over 365 days109GitHub repositoryYes
Repository archivedfalseGitHub repositoryYes
Repository gonefalseGitHub repositoryYes
Release commit or manifest in the repotruecrates.io packageYes
Published docstruecrates.io database dumpYes
Latest release fails cargo checkNot measuredYes
Build check dateNot measuredYes
Build check toolchainNot measuredYes
SecurityUnpatched vulnerabilities: none
Security measurements
SignalValueSourceFetchedCounts
Unpatched vulnerabilities past the grace windownoneRustSec advisory databaseYes
RustSec unmaintained advisorynoneRustSec advisory databaseYes
Deprecation noticenonecrates.io database dumpYes
Deprecated requirementnonecrates.io database dumpYes
Distribution34 releases, 51,716 downloads over 30 days5 not measured
Distribution measurements
SignalValueSourceFetchedCounts
Releases34crates.io database dumpYes
Downloads over 30 days51716crates.io database dumpYes
Binary downloads over the last 3 releasesNot measuredYes
Homebrew installs on request over 365 daysNot measuredYes
Repology repository familiesNot measuredYes
Docker pull growth over 90 daysNot measuredYes
Docker pulls at the growth baselineNot measuredYes
Every version a prereleasefalsecrates.io database dumpYes
Every version 0.0.xfalsecrates.io database dumpYes
Every version yankedfalsecrates.io database dumpYes
Crate deleted from crates.iofalsecrates.io database dumpYes
Repository421 stars, 65 forks, 17 contributors, 466 commits. Stars alone never qualify a project.
Repository measurements
SignalValueSourceFetchedCounts
GitHub stars421GitHub repositoryYes — one part of the repository route
GitHub forks65GitHub repositoryYes — one part of the repository route
Contributors with a GitHub account17GitHub contributorsYes — one part of the repository route
Commits on the default branch466GitHub repositoryNo
Repository's main crate left out of the entrynonecrates.io database dumpYes
Facts that never count
Facts that never count measurements
SignalValueSourceFetchedCounts
LicenseApache-2.0 OR MITcrates.io database dumpNo
Runs on, from listed crates and their direct dependenciesCUDA, WebGPU, Metal, Vulkancrates.io database dumpNo
What shows each backendCUDA: parakeet-rs feature cuda; WebGPU: parakeet-rs feature webgpu; Metal: parakeet-rs feature metal; Vulkan: parakeet-rs feature vulkancrates.io database dumpNo
Native code, from listed crates and their dependenciesBinds native code: ort-sys (feature api-24)crates.io database dumpNo
Python bindings, from direct dependencies of listed cratesNo Python binding crate foundcrates.io database dumpNo
Crates that depend on a listed crate directly8crates.io database dumpNo

Corrections and review history

Report a correction

No correction applies to this entry.

Judgments

A judgment enters only through an approved issue and a merged pull request.

No judgment applies to this entry.