# transcribe.cpp: C++ speech-to-text inference across 20 ASR model families on a shared ggml backend

> transcribe.cpp is a C/C++ inference library that runs Whisper, Parakeet, Moonshine, Voxtral, Granite Speech and other ASR families through a single ggml runtime, with Metal, Vulkan and CUDA GPU support. The README header counts 16 model families while the catalog table in the same document lists 20, and the Python binding package carries a development status classifier of Planning despite the project being at version 0.3.1.

**handy-computer/transcribe.cpp** —  ggml speech-to-text inference for 16+ model families

- Repository: https://github.com/handy-computer/transcribe.cpp
- Website: https://huggingface.co/handy-computer
- Stars: 2,003 · Forks: 118
- Language: C++
- License: MIT
- Published: 2026-10-11 · Updated: 2026-10-11 · Language: en
- Canonical page: https://hysenlabs.com/projects/handy-computer-transcribe-cpp

## A single C/C++ interface across 20 ASR model families, without switching runtimes

The typical approach to running multiple speech recognition models in production involves a separate inference runtime for each model architecture. Whisper runs in one framework, Parakeet in another, Moonshine in a third. transcribe.cpp collapses that into a single C/C++ library: every model family it supports is converted to the GGUF format and runs on the ggml inference engine, so the calling code does not change when the model does.

The project targets C++ application developers who need to embed ASR into a larger system without pulling in a Python runtime, and engineers who want GPU-accelerated inference on Apple Silicon, Linux, or Windows without managing multiple model-specific Python environments.

The library ships three GPU acceleration paths (Metal for Apple Silicon, Vulkan for Linux and Windows, CUDA where available) and a tinyBLAS-accelerated CPU path. Python and Rust bindings are available for applications that call into the native library from those languages.

## ggml runtime, GGUF model format, and how the GPU backends are selected

transcribe.cpp is built on the ggml inference library (the same engine used by llama.cpp and similar projects). Each supported model family is stored as a GGUF file, the binary model format introduced by the ggml organization to standardize quantization, metadata and portability.

GPU acceleration is controlled at build time. Metal is enabled automatically on Apple Silicon without any flag or dependency beyond a standard macOS SDK. Vulkan requires additional system libraries on Linux and Windows. CUDA support follows the standard ggml CUDA pattern. For machines without a supported GPU, the CPU path uses tinyBLAS for matrix operations.

The library supports both streaming and batch inference, though which mode is available depends on the model family. Streaming is only offered by a subset of the 20 families in the catalog. That constraint shapes which model a developer can choose when low-latency incremental output is required.

## The model catalog: 20 families in the table, 16 in the README header

The README contains an internal discrepancy worth knowing before you read the docs. The introductory paragraph states "16 model families and 60+ variants," but counting the rows in the catalog table directly below it gives 20 ASR families: Canary, Canary-Qwen 2.5B, Cohere Transcribe, Fun-ASR-Nano, GigaAM-v3, Granite Speech 4/4.1, Granite Speech 5.0 TurboCTC, MedASR, Moonshine, Moonshine Streaming, MOSS-Transcribe-Diarize, Multitalker Parakeet Streaming 0.6B v1, Nemotron 3.5 ASR Streaming 0.6B, Nemotron Speech Streaming EN 0.6B, Parakeet, Qwen3-ASR, SenseVoice Small, Voxtral (2507), Voxtral Realtime (2602), and Whisper. Counting the table's variant columns puts the total variant count above 70 as well, making both figures in the prose understatements of the current catalog.

The authoritative source for model metadata, accuracy numbers, and performance benchmarks is catalog.db, a SQLite database bundled with each published version. A SHA-256 checksum ships alongside it. Rebuild it from source with:

```bash
uv run scripts/catalog/db.py --out catalog.db
```

The exact accuracy and speed matrices required for publication are defined in catalog/_benchmark_profiles.json. Running uv run scripts/catalog/check.py --publication-profile enforces those gates. An ordinary catalog check reports the migration backlog without failing on stricter publication requirements.

## Building from source and running on Vulkan or Metal

The core build uses CMake. Clone the repository and run the two-step build:

```bash
cmake -B build
cmake --build build
```

On Apple Silicon, that is all that is needed: Metal support is compiled in automatically. For Vulkan on Ubuntu or Debian, the necessary system packages must be installed first:

```bash
sudo apt install build-essential cmake libvulkan-dev glslc libopenblas-dev
```

After the build completes, the examples/ directory holds several entry points. examples/cli/ is the command-line interface and the most direct way to confirm the build works: point it at a GGUF model file downloaded from the handy-computer organization on Hugging Face and pass an audio file. examples/hello/ and examples/hello_stream/ demonstrate batch and streaming usage respectively.

Models are not bundled with the library. Per-variant download links live in each model's card under docs/models/, and the docs pages are also generated from the catalog, so the quantization table and WER figures in each card come directly from catalog.db rather than being hand-edited.

## Capability gaps: streaming, diarization and translation cover only a subset of families

Not every model family supports every capability the library exposes. Streaming is available in Moonshine Streaming, the Parakeet family, Multitalker Parakeet Streaming, Nemotron 3.5 ASR Streaming, Nemotron Speech Streaming EN, and Voxtral Realtime, plus the Streaming Sortformer Diarizer. Most families provide only batch inference.

Speaker diarization is restricted to Granite Speech 4/4.1, MOSS-Transcribe-Diarize, Multitalker Parakeet Streaming, and the dedicated Streaming Sortformer Diarizer (which is a diarization-only model, not a transcription one). Translation output is available in Canary, Granite Speech 4/4.1, Voxtral (2507), and Whisper. Most ASR families in the catalog offer none of these three capabilities, supporting only standard batch transcription output.

For an application that needs streaming AND speaker diarization, the only family that offers both is Multitalker Parakeet Streaming 0.6B v1. If the target model for accuracy reasons is one of the plain transcription families, the architecture forces a two-pass approach. That trade-off between model capability and operational need is not documented as a constraint in the README, but counting the capability columns makes it clear.

## Python binding at Planning status and Rust FFI crate transcribe-cpp-sys

The Python package is named transcribe-cpp-native and is described in pyproject.toml as "the default native provider package for the transcribe-cpp Python bindings." The binding uses ctypes rather than a compiled Python extension, so the wheel contains only the native library directory and zero Python bytecode.

Despite the project being at version 0.3.1, pyproject.toml's classifiers list Development Status :: 1 - Planning, the lowest rung on the PyPI development status scale. That single line is the honest indicator of where the Python API surface stands. Wheels are published for three platform profiles: macOS arm64 (Metal, CPU), manylinux and Windows (CPU, Vulkan), and sdist which builds from source. Python 3.9 or later is required.

The Rust binding lives in the transcribe-cpp-sys crate at version 0.3.1 with a minimum Rust version of 1.74. It is a sys-crate (raw FFI) and the workspace member at bindings/rust/ provides the safe wrapper. The crate carries the whole C++ source tree in its package so a cargo build compiles the native library from source on any target machine.

## Model-specific Python runtimes as the alternative approach

The alternative to transcribe.cpp is to use each model family's own Python reference runtime: NVIDIA NeMo for the Parakeet and NeMotron families, the Transformers library for Whisper, and the respective authors' own inference code for newer families like Voxtral and GigaAM. That approach requires no C++ build chain, and each runtime is maintained by the model's originating team, so updates and new quantization options follow the original source.

The trade-off is fragmentation. Switching from Parakeet to Moonshine means switching inference frameworks, model loading code, and potentially Python environments. transcribe.cpp's value is that the C++ surface stays constant. The caller loads a different GGUF file and the rest of the code does not change.

For Apple Silicon in particular, the Python runtimes for many of these models do not expose Metal acceleration with the same completeness that transcribe.cpp's Metal backend provides, because ggml targets Apple Silicon specifically rather than routing through CoreML or MPS on a per-model basis.

The repository was last pushed on 2026-10-06, and the project ships under the MIT license; third-party notices are in THIRD-PARTY-LICENSES.md.

## Conclusion

transcribe.cpp suits C++ projects that need a single inference interface across multiple ASR model families, particularly on Apple Silicon where Metal requires no build-time configuration. The wrong choice for Python-first workflows today, because the transcribe-cpp-native package carries a development status of Planning in its pyproject.toml, or for projects that need only Whisper and want a narrower build target. Before committing, download catalog.db from the latest version assets and run uv run scripts/catalog/check.py --publication-profile to verify your model variant passes its WER benchmarks.

## FAQ

### How do I install transcribe.cpp?

Build it from source with cmake -B build and cmake --build build. On Apple Silicon, Metal is enabled automatically. On Linux with a Vulkan GPU, install build-essential, cmake, libvulkan-dev, glslc and libopenblas-dev before building. The Python package transcribe-cpp-native installs as a wheel with a pre-built native library for macOS arm64, manylinux and Windows.

### What ASR model families does transcribe.cpp support?

The catalog table in the README lists 20 ASR families including Whisper, Parakeet, Moonshine, Granite Speech, Voxtral, GigaAM-v3, Canary, Cohere Transcribe, Qwen3-ASR, SenseVoice Small and others. The introductory text states 16 model families, but the table itself shows 20.

### Does transcribe.cpp support real-time streaming transcription?

Streaming transcription is available only in certain model families: Moonshine Streaming, Parakeet, Multitalker Parakeet Streaming, Nemotron 3.5 ASR Streaming, Nemotron Speech Streaming EN, and Voxtral Realtime. Most families in the catalog support batch inference only.

### Is there a Python API for transcribe.cpp?

Yes, the package is named transcribe-cpp-native and uses ctypes bindings rather than a compiled Python extension. pyproject.toml classifies it as Development Status 1 - Planning, and requires Python 3.9 or later. The separate transcribe-cpp package at bindings/python provides the higher-level Python API.

### How are transcribe.cpp model accuracy figures verified?

Every model published under handy-computer on Hugging Face is WER-tested against its reference implementation before publication. Accuracy and speed requirements are defined in catalog/_benchmark_profiles.json and enforced by running uv run scripts/catalog/check.py --publication-profile. The results are stored in catalog.db, a SQLite file that ships with each version alongside a SHA-256 checksum.

## Sources

- [handy-computer/transcribe.cpp on GitHub](https://github.com/handy-computer/transcribe.cpp)
- [License: MIT](https://github.com/handy-computer/transcribe.cpp/blob/main/LICENSE)
- [Project website](https://huggingface.co/handy-computer)
- [README](https://github.com/handy-computer/transcribe.cpp/blob/main/README.md)
- [Releases](https://github.com/handy-computer/transcribe.cpp/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/handy-computer-transcribe-cpp
