transcribe-cpp
Library New
Rust bindings for transcribe.cpp, a C/C++ speech-to-text library built on ggml
- Downloads
- 50,251
- Dependents
- 3
- Stars
- 2,149
- Forks
- 154
- Contributors
- 15
- Commits
- 573
- Latest release
- 0.4.1 ·
About
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
| Family | Variants | Available capabilities | Docs |
|---|---|---|---|
| Canary | canary-180m-flash, canary-1b, canary-1b-flash, canary-1b-v2 | translate | docs/models/canary.md |
| Canary-Qwen 2.5B | canary-qwen-2.5b | - | docs/models/canary-qwen-2.5b.md |
| Cohere Transcribe | cohere-transcribe-03-2026, cohere-transcribe-arabic-07-2026 | - | docs/models/cohere.md |
| Fun-ASR-Nano | fun-asr-mlt-nano-2512, fun-asr-nano-2512 | - | docs/models/fun-asr-nano.md |
| GigaAM-v3 | gigaam-v3-ctc, gigaam-v3-e2e-ctc, gigaam-v3-e2e-rnnt, gigaam-v3-rnnt | token timestamps | docs/models/gigaam.md |
| Granite Speech 4 / 4.1 | granite-4.0-1b-speech, granite-speech-4.1-2b, granite-speech-4.1-2b-nar, granite-speech-4.1-2b-plus | diarize, translate, word timestamps | docs/models/granite-speech.md |
| Granite Speech 5.0 TurboCTC | granite-speech-5.0-470m-turboctc, granite-speech-5.0-470m-turboctc-nc | - | docs/models/granite-speech-5.0-turboctc.md |
| MedASR | medasr | token timestamps | docs/models/medasr.md |
| Moonshine | moonshine-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 Streaming | moonshine-streaming-medium, moonshine-streaming-small, moonshine-streaming-tiny | streaming | docs/models/moonshine-streaming.md |
| MOSS-Transcribe-Diarize | moss-transcribe-diarize | diarize, segment timestamps | docs/models/moss-transcribe-diarize.md |
| Multitalker Parakeet Streaming 0.6B v1 | multitalker-parakeet-streaming-0.6b-v1 | diarize, streaming, token timestamps | docs/models/multitalker-parakeet-streaming-0.6b-v1.md |
| Nemotron 3.5 ASR Streaming 0.6B | nemotron-3.5-asr-streaming-0.6b | streaming, token timestamps | docs/models/nemotron-3.5-asr-streaming-0.6b.md |
| Nemotron Speech Streaming EN 0.6B | nemotron-speech-streaming-en-0.6b | streaming, token timestamps | docs/models/nemotron-speech-streaming-en-0.6b.md |
| Parakeet | parakeet-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-2 | streaming, token timestamps | docs/models/parakeet.md |
| Qwen3-ASR | qwen3-asr-0.6b, qwen3-asr-1.7b | - | docs/models/qwen3-asr.md |
| SenseVoice Small | sensevoice-small | - | docs/models/sensevoice-small.md |
| Voxtral (2507) | voxtral-mini-3b-2507, voxtral-small-24b-2507 | translate | docs/models/voxtral.md |
| Voxtral Realtime (2602) | voxtral-mini-4b-realtime-2602 | streaming | docs/models/voxtral-realtime.md |
| Whisper | whisper-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-25 | segment timestamps, translate | docs/models/whisper.md |
Speaker diarization models (no transcription; verified by DER/JER rather than WER):
| Family | Variants | Available capabilities | Docs |
|---|---|---|---|
| Streaming Sortformer Diarizer 4spk v2.1 | diar_streaming_sortformer_4spk-v2.1 | diarize, streaming | docs/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):
| Family | Variants | Available capabilities | Docs |
|---|---|---|---|
| VoxLingua107 ECAPA-TDNN (language ID) | lang-id-voxlingua107-ecapa | language ID (107 languages) | docs/models/lang-id-voxlingua107-ecapa.md |
Voice activity detection models (no transcription; see docs/vad.md):
| Family | Variants | Available capabilities | Docs |
|---|---|---|---|
| Silero VAD v6.2 | silero-vad-v6.2 | streaming, voice activity detection | docs/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:
| Language | Path |
|---|---|
| Python | bindings/python |
| TypeScript / JavaScript | bindings/typescript |
| Rust | bindings/rust/transcribe-cpp |
| Swift / ObjC | bindings/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.
Compatibility
- 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.
| Project | Downloads | Dependents | Stars | Latest release | Runs on (GPU) | Native code | License |
|---|---|---|---|---|---|---|---|
|
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 |
|
jpreprocess Listed
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 |
|
cohere-transcribe-rs Listed
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 daysdormancy: last activity 2026-10-27, 13 days ago, E = 600: activenew: new: first release 2026-06-09 is under 180 days old
Crates2 crates
- transcribe-cpp Primary
- transcribe-cpp-sys
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
- Description: the crates.io description
- crates.io database dump, fetched
- RustSec advisory database, fetched
- GitHub repository, fetched
- crates.io package, fetched
- GitHub contributors, fetched
Adoption3 active dependents, 3 new dependents in 365 days1 not measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Active dependents | 3 | crates.io database dump | Yes | |
| New dependents (365 days) | 3 | crates.io database dump | Yes | |
| Peak active dependents | 2.5 | crates.io database dump | Yes | |
| Active dependents as a share of the peak | 1 | crates.io database dump | Yes | |
| Binary downloads per release | Not measured | Yes |
MaintenanceLatest human commit: 13 days ago3 not measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Latest human commit | 2026-10-27 | GitHub repository | Yes | |
| Latest release | 2026-10-22 | crates.io database dump | Yes | |
| First release | 2026-06-09 | crates.io database dump | Yes | |
| Latest version | 0.4.1 | crates.io database dump | Yes | |
| Days the oldest outside issue waits for a reply | 111 | GitHub repository | Yes | |
| Maintainer replies over 365 days | 0 | GitHub repository | Yes | |
| Repository archived | false | GitHub repository | Yes | |
| Repository gone | false | GitHub repository | Yes | |
| Release commit or manifest in the repo | true | crates.io package | Yes | |
| Published docs | true | crates.io database dump | Yes | |
| Latest release fails cargo check | Not measured | Yes | ||
| Build check date | Not measured | Yes | ||
| Build check toolchain | Not measured | Yes |
SecurityUnpatched vulnerabilities: none
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Unpatched vulnerabilities past the grace window | none | RustSec advisory database | Yes | |
| RustSec unmaintained advisory | none | RustSec advisory database | Yes | |
| Deprecation notice | none | crates.io database dump | Yes | |
| Deprecated requirement | none | crates.io database dump | Yes |
Distribution25 releases, 50,251 downloads over 30 days5 not measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Releases | 25 | crates.io database dump | Yes | |
| Downloads over 30 days | 50251 | crates.io database dump | Yes | |
| Binary downloads over the last 3 releases | Not measured | Yes | ||
| Homebrew installs on request over 365 days | Not measured | Yes | ||
| Repology repository families | Not measured | Yes | ||
| Docker pull growth over 90 days | Not measured | Yes | ||
| Docker pulls at the growth baseline | Not measured | Yes | ||
| Every version a prerelease | false | crates.io database dump | Yes | |
| Every version 0.0.x | false | crates.io database dump | Yes | |
| Every version yanked | false | crates.io database dump | Yes | |
| Crate deleted from crates.io | false | crates.io database dump | Yes |
Repository2,149 stars, 154 forks, 15 contributors, 573 commits. Stars alone never qualify a project.
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| GitHub stars | 2149 | GitHub repository | Yes — one part of the repository route | |
| GitHub forks | 154 | GitHub repository | Yes — one part of the repository route | |
| Contributors with a GitHub account | 15 | GitHub contributors | Yes — one part of the repository route | |
| Commits on the default branch | 573 | GitHub repository | No | |
| Repository's main crate left out of the entry | none | crates.io database dump | Yes |
Facts that never count
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| License | MIT | crates.io database dump | No | |
| Runs on, from listed crates and their direct dependencies | CUDA, Metal, ROCm, Vulkan | crates.io database dump | No | |
| What shows each backend | 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 | crates.io database dump | No | |
| Native code, from listed crates and their dependencies | Binds native code: transcribe, transcribe-cpp-sys, transcribe_cpp. Build uses a native toolchain: cmake | crates.io database dump | No | |
| Python bindings, from direct dependencies of listed crates | No Python binding crate found | crates.io database dump | No | |
| Crates that depend on a listed crate directly | 3 | crates.io database dump | No |
Corrections and review history
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.