transcribe-cpp

Library New

Rust bindings for transcribe.cpp, a C/C++ speech-to-text library built on ggml

Checked · Sources

Downloads
50,251
Dependents
3
Stars
2,149
Forks
154
Contributors
15
Commits
573
Latest release
0.4.1 ·

About

From the project README ·

C/C++ speech-to-text inference library. Runs diverse STT model families via GGUF models on the ggml runtime, with Metal, Vulkan, and CUDA backends for fast GPU inference plus a tinyBLAS-accelerated CPU path.

16 model families and 60+ variants, streaming and batch. Every transcription model we publish under handy-computer is numerically verified and WER-tested against its reference implementation

Supported models:

Read the full README
FamilyVariantsAvailable capabilitiesDocs
Canarycanary-180m-flash, canary-1b, canary-1b-flash, canary-1b-v2translatedocs/models/canary.md
Canary-Qwen 2.5Bcanary-qwen-2.5b-docs/models/canary-qwen-2.5b.md
Cohere Transcribecohere-transcribe-03-2026, cohere-transcribe-arabic-07-2026-docs/models/cohere.md
Fun-ASR-Nanofun-asr-mlt-nano-2512, fun-asr-nano-2512-docs/models/fun-asr-nano.md
GigaAM-v3gigaam-v3-ctc, gigaam-v3-e2e-ctc, gigaam-v3-e2e-rnnt, gigaam-v3-rnnttoken timestampsdocs/models/gigaam.md
Granite Speech 4 / 4.1granite-4.0-1b-speech, granite-speech-4.1-2b, granite-speech-4.1-2b-nar, granite-speech-4.1-2b-plusdiarize, translate, word timestampsdocs/models/granite-speech.md
Granite Speech 5.0 TurboCTCgranite-speech-5.0-470m-turboctc, granite-speech-5.0-470m-turboctc-nc-docs/models/granite-speech-5.0-turboctc.md
MedASRmedasrtoken timestampsdocs/models/medasr.md
Moonshinemoonshine-base, moonshine-base-ar, moonshine-base-ja, moonshine-base-ko, moonshine-base-uk, moonshine-base-vi, moonshine-base-zh, moonshine-tiny, moonshine-tiny-ar, moonshine-tiny-ja, moonshine-tiny-ko, moonshine-tiny-uk, moonshine-tiny-vi, moonshine-tiny-zh-docs/models/moonshine.md
Moonshine Streamingmoonshine-streaming-medium, moonshine-streaming-small, moonshine-streaming-tinystreamingdocs/models/moonshine-streaming.md
MOSS-Transcribe-Diarizemoss-transcribe-diarizediarize, segment timestampsdocs/models/moss-transcribe-diarize.md
Multitalker Parakeet Streaming 0.6B v1multitalker-parakeet-streaming-0.6b-v1diarize, streaming, token timestampsdocs/models/multitalker-parakeet-streaming-0.6b-v1.md
Nemotron 3.5 ASR Streaming 0.6Bnemotron-3.5-asr-streaming-0.6bstreaming, token timestampsdocs/models/nemotron-3.5-asr-streaming-0.6b.md
Nemotron Speech Streaming EN 0.6Bnemotron-speech-streaming-en-0.6bstreaming, token timestampsdocs/models/nemotron-speech-streaming-en-0.6b.md
Parakeetparakeet-ctc-0.6b, parakeet-ctc-1.1b, parakeet-primeline, parakeet-rnnt-0.6b, parakeet-rnnt-1.1b, parakeet-tdt-0.6b-v2, parakeet-tdt-0.6b-v3, parakeet-tdt-1.1b, parakeet-tdt_ctc-1.1b, parakeet-tdt_ctc-110m, parakeet-ultra, parakeet-unified-en-0.6b, orukeet, phonon-2streaming, token timestampsdocs/models/parakeet.md
Qwen3-ASRqwen3-asr-0.6b, qwen3-asr-1.7b-docs/models/qwen3-asr.md
SenseVoice Smallsensevoice-small-docs/models/sensevoice-small.md
Voxtral (2507)voxtral-mini-3b-2507, voxtral-small-24b-2507translatedocs/models/voxtral.md
Voxtral Realtime (2602)voxtral-mini-4b-realtime-2602streamingdocs/models/voxtral-realtime.md
Whisperwhisper-base, whisper-base.en, whisper-large, whisper-large-v2, whisper-large-v3, whisper-large-v3-turbo, whisper-medium, whisper-medium.en, whisper-small, whisper-small.en, whisper-tiny, whisper-tiny.en, breeze-asr-25segment timestamps, translatedocs/models/whisper.md

Speaker diarization models (no transcription; verified by DER/JER rather than WER):

FamilyVariantsAvailable capabilitiesDocs
Streaming Sortformer Diarizer 4spk v2.1diar_streaming_sortformer_4spk-v2.1diarize, streamingdocs/models/diar_streaming_sortformer_4spk-v2.1.md

Language ID models (no transcription; verified by top-1 decision parity on FLEURS; see docs/langid.md):

FamilyVariantsAvailable capabilitiesDocs
VoxLingua107 ECAPA-TDNN (language ID)lang-id-voxlingua107-ecapalanguage ID (107 languages)docs/models/lang-id-voxlingua107-ecapa.md

Voice activity detection models (no transcription; see docs/vad.md):

FamilyVariantsAvailable capabilitiesDocs
Silero VAD v6.2silero-vad-v6.2streaming, voice activity detectiondocs/models/silero-vad-v6.2.md

Per-variant model cards live under docs/models/.

Model catalog

catalog/ is the source of truth for model metadata, accuracy, and performance. Each release includes a queryable catalog.db and SHA-256 checksum. Rebuild it locally with uv run scripts/catalog/db.py --out catalog.db. The exact accuracy and published speed matrices and standard benchmark recipes required for publication live in catalog/_benchmark_profiles.json. Run uv run scripts/catalog/check.py --publication-profile to enforce it; the ordinary catalog check reports the migration backlog without failing.

Published tables are generated from it rather than hand-written. A model doc delegates a region with a marker, and scripts/catalog/render.py rewrites only what sits between the pair:

<!-- catalog:downloads -->
| Quantization | Download | Size | WER (LibriSpeech test-clean) |
...
<!-- /catalog -->

The Hugging Face card specs under scripts/hf_cards/ hold editorial copy only (summary, tags, validation pin, prose notes). scripts/hf_cards/generate.py reads the spec and the catalog record together, so repos, licence, languages, capabilities, the quant table, and per-rig speedups are never written into a YAML by hand.

uv run scripts/catalog/format.py --check  # canonical record layout
uv run scripts/catalog/check.py           # schema, integrity, pairing
uv run scripts/catalog/render.py          # rewrite the marked doc regions
uv run scripts/catalog/render.py --check

Build

cmake -B build
cmake --build build

Metal is enabled automatically on Apple Silicon. For Vulkan (Linux/Windows):

# Ubuntu/Debian
sudo apt install build-essential cmake libvulkan-dev glslc libopenblas-dev

# Fedora
sudo dnf install vulkan-headers openblas-devel glslc spirv-headers-devel vulkan-loader-devel

cmake -B build -DTRANSCRIBE_VULKAN=ON
cmake --build build

On Windows, see the complete build guide for Vulkan SDK setup, Visual Studio commands, and the short-build-root fallback for unusually deep checkouts.

For CUDA (Linux + NVIDIA GPU):

# requires the CUDA toolkit (nvcc) on PATH
cmake -B build -DTRANSCRIBE_CUDA=ON
cmake --build build

For HIP/ROCm (Linux + AMD GPU), which needs ROCm 6.1 or newer:

cmake -B build -DTRANSCRIBE_HIP=ON -DAMDGPU_TARGETS=gfx1201
cmake --build build

Replace gfx1201 with your GPU architecture — rocminfo | grep gfx prints it. Pass a semicolon-separated list for several architectures. ROCm devices report as the rocm backend kind, are picked up by the default auto backend, and can be required explicitly with --backend rocm.

libopenblas-dev is optional but recommended. It accelerates the host-side decoder ~10-15x. Without it the build falls back to a scalar path automatically.

tinyBLAS (Justine Tunney's llamafile_sgemm kernels) is on by default.

To build the quantization tool:

cmake -B build -DTRANSCRIBE_BUILD_TOOLS=ON
cmake --build build

Models

Pre-built GGUFs for all supported models are hosted on Hugging Face under handy-computer. Each per-model doc (linked in the table above) includes direct download links for every quant. Convert from source only if you need a different dtype or a checkpoint that isn't pre-built.

Convert to GGUF

The converter loads directly from NVIDIA's NeMo checkpoints via ASRModel.from_pretrained. Requires uv; the parakeet env ships NeMo and its deps.

uv run --project scripts/envs/parakeet \
  scripts/convert-parakeet.py nvidia/parakeet-tdt-0.6b-v2

This writes models/parakeet-tdt-0.6b-v2/parakeet-tdt-0.6b-v2-F32.gguf following the llama.cpp-style <slug>-<QUANT>.gguf naming convention. Pass a local .nemo path or extracted directory for offline conversion.

Quantize

The transcribe-quantize tool produces smaller models from the reference GGUF. Available presets: F16, Q8_0, Q6_K, Q5_K_M, Q4_K_M.

build/bin/transcribe-quantize \
  models/parakeet-tdt-0.6b-v2/parakeet-tdt-0.6b-v2-F32.gguf \
  models/parakeet-tdt-0.6b-v2/parakeet-tdt-0.6b-v2-Q4_K_M.gguf \
  --quant Q4_K_M

Usage

build/bin/transcribe-cli -m models/parakeet-tdt-0.6b-v2/parakeet-tdt-0.6b-v2-F32.gguf samples/jfk.wav

Input must be 16 kHz mono WAV. Use ffmpeg or sox to convert other formats:

ffmpeg -i input.mp3 -ar 16000 -ac 1 output.wav

On the CPU and on Metal (Apple silicon), model weights are memory-mapped from the GGUF file rather than copied into process memory: they live in the page cache, which the OS can reclaim and share between processes, and loading is faster. Don't truncate or rewrite a model file in place while a program has it loaded; write a new file and rename it over the old one. --no-mmap (transcribe_model_load_params::no_mmap, or TRANSCRIBE_NO_MMAP=1) copies the weights instead.

Models whose FFN gate and up weights are stored back to back (every packed variant: granite, canary-qwen, qwen3-asr, voxtral, voxtral-realtime, moss, funasr-nano) are fused at load time by pointing one tensor at those bytes instead of packing a second copy, so the fusion usually costs no extra weight memory. It falls back to the copying path when the device layout does not allow that (tensor storage padded or the mapping split, e.g. a file larger than the device's max buffer size). TRANSCRIBE_NO_GATE_UP_ALIAS=1 forces the copying path.

Bindings

Official bindings wrap the C API for other languages:

LanguagePath
Pythonbindings/python
TypeScript / JavaScriptbindings/typescript
Rustbindings/rust/transcribe-cpp
Swift / ObjCbindings/swift

See docs/bindings.md for how the bindings are generated and kept in sync with the header. Upgrading from 0.1? Read the 0.2 migration guide, including the new exact-device selection API and the changed meaning of CLI --device 0.

Tests

cd build && ctest

Some tests require a real model file. Enable them with:

cmake -B build -DTRANSCRIBE_BUILD_REAL_MODEL_TESTS=ON
cmake --build build
TRANSCRIBE_PARAKEET_GGUF=path/to/model.gguf ctest --test-dir build

For the model-family smoke-test, numerical-validation, and benchmark pattern expected of new ports, see docs/model-family-testing.md.

Sponsors & Supporting Organizations

Mozilla AI & BiR Program

A huge thanks to Mozilla AI and their BiR Program. This whole project started out as an idea, not even an implementation direction. It was a research project in how to accelerate transcription models across all platforms as easily as possible. The BiR program and Davide helped support the research, and my eventual direction to choose to implement and inference engine backed by ggml. And also experimenting with automated model porting using agentic programming tools.

Hugging Face

Hugging Face provided the project extra storage so we can host all of the models which we support. We want to provide canonical references for as many models as reasonably possible, the support from Hugging Face helps to enable this.

Modal

Modal helped to provide GPU credits so the project can test and validate the projects implementations match the transformers or nemo reference source. This is critical to ensuring that we have as close to a production grade inference engine that works everywhere. We believe it is critical to have accurate transcriptions and the only way to ensure this is through long running WER checks which Modal helps to provide. Every model published under handy-computer on hugggingface has had the WER checked, so you can trust the results. And if there are any regressions, you bet we will be fixing them.

Blacksmith

Blacksmith provides many of the CI runners for this project. That helps to keep transcribe.cpp well tested and ensure our releases are as smooth as possible. The CI is quick and a drop in replacement for the standard Github Actions runners. I ran into limits very fast with them and super happy upon reaching out to Blacksmith they were able to provide runners for the project.

Project layout

include/transcribe.h       Public C API (single header)
src/                       Library internals (C++17)
src/arch/parakeet/         Parakeet family implementation
src/arch/cohere/           Cohere Transcribe family implementation
examples/cli/              CLI binary source
tools/transcribe-quantize/ Quantization tool source
bindings/                  Python, TypeScript, Rust, and Swift bindings
docs/                      Porting and validation guidance
scripts/                   Python converter + test tooling
ggml/                      Vendored ggml (see ggml/UPSTREAM for its recipe)
patches/ggml/              Downstream patches applied by scripts/sync-ggml.sh
src/third_party/miniz/     Vendored miniz deflate codec (see its UPSTREAM file)
samples/                   Test audio files
tests/                     Unit and smoke tests

License

transcribe.cpp is MIT-licensed. See LICENSE for details. Vendored third-party components (ggml, miniz — both MIT) are attributed in THIRD-PARTY-LICENSES.md.

Runs on
CUDA, Metal, ROCm, Vulkan
What shows it
  • CUDA: transcribe-cpp feature cuda, transcribe-cpp-sys feature cuda
  • Metal: transcribe-cpp feature metal, transcribe-cpp-sys feature metal
  • ROCm: transcribe-cpp feature rocm, transcribe-cpp-sys feature rocm
  • Vulkan: transcribe-cpp feature vulkan, transcribe-cpp-sys feature vulkan
Native code
Required
  • Binds native code: transcribe, transcribe-cpp-sys, transcribe_cpp
  • Build uses a native toolchain: cmake
Python bindings
No Python binding crate found
License
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.

transcribe-cpp beside the projects that share a topic with it
ProjectDownloadsDependentsStarsLatest releaseRuns on (GPU)Native codeLicense
transcribe-cpp This page New

Rust bindings for transcribe.cpp, a C/C++ speech-to-text library built on ggml

50,251 downloads over 30 days 3 2,149 0.4.1 CUDA, Metal, ROCm, Vulkan Binds native code: transcribe, transcribe-cpp-sys, transcribe_cpp. Build uses a native toolchain: cmake MIT
whisper-rs Featured

Rust bindings for whisper.cpp

466,717 downloads over 30 days 98 Not measured 0.16.0 CUDA, Metal, Vulkan Binds native code: piper, piper1-rs-sys, whisper, whisper-rs-sys. Build uses a native toolchain: bindgen, cmake Unlicense
sherpa-onnx Featured

Safe Rust wrapper for sherpa-onnx speech recognition toolkit

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

Japanese text preprocessor for Text-to-Speech application (OpenJTalk rewrite in rust language).

14,491 downloads over 30 days 7 61 0.15.0 GPU support unknown No native code found BSD-3-Clause
msedge-tts Listed

This library is a wrapper of MSEdge Read aloud function API. You can use it to synthesize text to speech with many voices MS provided.

5,349 downloads over 30 days 3 27 0.4.1 GPU support unknown No native code found Apache-2.0 OR MIT

Rust implementation for the CohereLabs/cohere-transcribe-03-2026 speech-to-text model. Includes a CLI and an OpenAI-compatible API server.

0 downloads over 30 days 0 101 0.1.1 CUDA Binds native code: torch-sys (feature tch-backend). Build uses a native toolchain: cmake 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.

642 downloads over 30 days 2 2 0.9.1 CUDA No native code found Apache-2.0
Why NewIts first release on 9 Jun 2026 is under 180 days old.

The check tests the Featured gates once the first release passes this age limit.

What else the check found

  • The last activity is on 27 Oct 2026, 13 days ago. The rules expect an update within 600 days. Dormancy rule

Exact rules: New. The check on applied thresholds version 9.

Every rule outcome, as the check records it
  • expected-interval: version 0.4.1 base 300, doubled for 50251 downloads per month: E = 600 days
  • dormancy: last activity 2026-10-27, 13 days ago, E = 600: active
  • new: new: first release 2026-06-09 is under 180 days old
Crates2 crates

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
Adoption3 active dependents, 3 new dependents in 365 days1 not measured
Adoption measurements
SignalValueSourceFetchedCounts
Active dependents3crates.io database dumpYes
New dependents (365 days)3crates.io database dumpYes
Peak active dependents2.5crates.io database dumpYes
Active dependents as a share of the peak1crates.io database dumpYes
Binary downloads per releaseNot measuredYes
MaintenanceLatest human commit: 13 days ago3 not measured
Maintenance measurements
SignalValueSourceFetchedCounts
Latest human commit2026-10-27GitHub repositoryYes
Latest release2026-10-22crates.io database dumpYes
First release2026-06-09crates.io database dumpYes
Latest version0.4.1crates.io database dumpYes
Days the oldest outside issue waits for a reply111GitHub repositoryYes
Maintainer replies over 365 days0GitHub 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
Distribution25 releases, 50,251 downloads over 30 days5 not measured
Distribution measurements
SignalValueSourceFetchedCounts
Releases25crates.io database dumpYes
Downloads over 30 days50251crates.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
Repository2,149 stars, 154 forks, 15 contributors, 573 commits. Stars alone never qualify a project.
Repository measurements
SignalValueSourceFetchedCounts
GitHub stars2149GitHub repositoryYes — one part of the repository route
GitHub forks154GitHub repositoryYes — one part of the repository route
Contributors with a GitHub account15GitHub contributorsYes — one part of the repository route
Commits on the default branch573GitHub repositoryNo
Repository's main crate left out of the entrynonecrates.io database dumpYes
Facts that never count
Facts that never count measurements
SignalValueSourceFetchedCounts
LicenseMITcrates.io database dumpNo
Runs on, from listed crates and their direct dependenciesCUDA, Metal, ROCm, Vulkancrates.io database dumpNo
What shows each backendCUDA: transcribe-cpp feature cuda, transcribe-cpp-sys feature cuda; Metal: transcribe-cpp feature metal, transcribe-cpp-sys feature metal; ROCm: transcribe-cpp feature rocm, transcribe-cpp-sys feature rocm; Vulkan: transcribe-cpp feature vulkan, transcribe-cpp-sys feature vulkancrates.io database dumpNo
Native code, from listed crates and their dependenciesBinds native code: transcribe, transcribe-cpp-sys, transcribe_cpp. Build uses a native toolchain: cmakecrates.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 directly3crates.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.