Skip to content

Repository files navigation

transcribe.cpp

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 model we publish under handy-computer is numerically verified and WER-tested against its reference implementation

Supported models:

FamilyVariantsDocs
Parakeet11 variants: TDT, RNN-T, CTC, TDT+CTC (110M–1.1B), incl. German parakeet-primelinedocs/models/parakeet.md
Canarycanary-1b, canary-1b-v2, canary-1b-flash, canary-180m-flashdocs/models/canary.md
Canary-Qwencanary-qwen-2.5b (FastConformer + Qwen3-1.7B SALM)docs/models/canary-qwen-2.5b.md
Whisper12 variants (tiny through large-v3-turbo, plus .en siblings)docs/models/whisper.md
GigaAMgigaam-v3-{e2e-rnnt,e2e-ctc,rnnt,ctc}docs/models/gigaam.md
Moonshinemoonshine-tiny, moonshine-basedocs/models/moonshine.md
Moonshine Streamingmoonshine-streaming-{tiny,small,medium}docs/models/moonshine-streaming.md
Qwen3-ASRqwen3-asr-0.6b, qwen3-asr-1.7bdocs/models/qwen3-asr.md
Cohere Transcribecohere-transcribe-03-2026docs/models/cohere-transcribe-03-2026.md
SenseVoicesensevoice-smalldocs/models/sensevoice-small.md
FunASR Nanofun-asr-nano-2512, fun-asr-mlt-nano-2512docs/models/fun-asr-nano.md
Nemotron Speech Streamingnemotron-speech-streaming-en-0.6bdocs/models/nemotron-speech-streaming-en-0.6b.md
Nemotron 3.5 ASR Streamingnemotron-3.5-asr-streaming-0.6b (multilingual, 40 locales)docs/models/nemotron-3.5-asr-streaming-0.6b.md
Multitalker Parakeet Streamingmultitalker-parakeet-streaming-0.6b-v1 (single-speaker ASR path only)docs/models/multitalker-parakeet-streaming-0.6b-v1.md
Granite Speech 4 / 4.1granite-4.0-1b-speech, granite-speech-4.1-2b{,-plus,-nar}docs/models/granite-speech.md
Voxtralvoxtral-mini-3b-2507, voxtral-small-24b-2507 (audio-LLM; transcription + translation)docs/models/voxtral.md
Voxtral Realtimevoxtral-mini-4b-realtime-2602 (streaming audio-LLM)docs/models/voxtral-realtime.md
MedASRmedasr (Conformer + CTC, English medical-dictation, gated)docs/models/medasr.md
MOSS Transcribe-Diarizemoss-transcribe-diarize (audio-LLM; English + Chinese ASR with inline speaker diarization)docs/models/moss-transcribe-diarize.md
Sortformerdiar_streaming_sortformer_4spk-v2.1 (streaming speaker diarizer, up to 4 speakers; no transcription)docs/models/diar_streaming_sortformer_4spk-v2.1.md

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

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
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

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.

About

ggml speech-to-text inference for 16+ model families

Topics

Resources

Contributing

Stars

1.9k stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - handy-computer/transcribe.cpp: ggml speech-to-text inference for 16+ model families · GitHub
Skip to content

Repository files navigation

transcribe.cpp

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 model we publish under handy-computer is numerically verified and WER-tested against its reference implementation

Supported models:

FamilyVariantsDocs
Parakeet11 variants: TDT, RNN-T, CTC, TDT+CTC (110M–1.1B), incl. German parakeet-primelinedocs/models/parakeet.md
Canarycanary-1b, canary-1b-v2, canary-1b-flash, canary-180m-flashdocs/models/canary.md
Canary-Qwencanary-qwen-2.5b (FastConformer + Qwen3-1.7B SALM)docs/models/canary-qwen-2.5b.md
Whisper12 variants (tiny through large-v3-turbo, plus .en siblings)docs/models/whisper.md
GigaAMgigaam-v3-{e2e-rnnt,e2e-ctc,rnnt,ctc}docs/models/gigaam.md
Moonshinemoonshine-tiny, moonshine-basedocs/models/moonshine.md
Moonshine Streamingmoonshine-streaming-{tiny,small,medium}docs/models/moonshine-streaming.md
Qwen3-ASRqwen3-asr-0.6b, qwen3-asr-1.7bdocs/models/qwen3-asr.md
Cohere Transcribecohere-transcribe-03-2026docs/models/cohere-transcribe-03-2026.md
SenseVoicesensevoice-smalldocs/models/sensevoice-small.md
FunASR Nanofun-asr-nano-2512, fun-asr-mlt-nano-2512docs/models/fun-asr-nano.md
Nemotron Speech Streamingnemotron-speech-streaming-en-0.6bdocs/models/nemotron-speech-streaming-en-0.6b.md
Nemotron 3.5 ASR Streamingnemotron-3.5-asr-streaming-0.6b (multilingual, 40 locales)docs/models/nemotron-3.5-asr-streaming-0.6b.md
Multitalker Parakeet Streamingmultitalker-parakeet-streaming-0.6b-v1 (single-speaker ASR path only)docs/models/multitalker-parakeet-streaming-0.6b-v1.md
Granite Speech 4 / 4.1granite-4.0-1b-speech, granite-speech-4.1-2b{,-plus,-nar}docs/models/granite-speech.md
Voxtralvoxtral-mini-3b-2507, voxtral-small-24b-2507 (audio-LLM; transcription + translation)docs/models/voxtral.md
Voxtral Realtimevoxtral-mini-4b-realtime-2602 (streaming audio-LLM)docs/models/voxtral-realtime.md
MedASRmedasr (Conformer + CTC, English medical-dictation, gated)docs/models/medasr.md
MOSS Transcribe-Diarizemoss-transcribe-diarize (audio-LLM; English + Chinese ASR with inline speaker diarization)docs/models/moss-transcribe-diarize.md
Sortformerdiar_streaming_sortformer_4spk-v2.1 (streaming speaker diarizer, up to 4 speakers; no transcription)docs/models/diar_streaming_sortformer_4spk-v2.1.md

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

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
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

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.

About

ggml speech-to-text inference for 16+ model families

Topics

Resources

Contributing

Stars

1.9k stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - handy-computer/transcribe.cpp: ggml speech-to-text inference for 16+ model families · GitHub
Skip to content

Repository files navigation

transcribe.cpp

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 model we publish under handy-computer is numerically verified and WER-tested against its reference implementation

Supported models:

FamilyVariantsDocs
Parakeet11 variants: TDT, RNN-T, CTC, TDT+CTC (110M–1.1B), incl. German parakeet-primelinedocs/models/parakeet.md
Canarycanary-1b, canary-1b-v2, canary-1b-flash, canary-180m-flashdocs/models/canary.md
Canary-Qwencanary-qwen-2.5b (FastConformer + Qwen3-1.7B SALM)docs/models/canary-qwen-2.5b.md
Whisper12 variants (tiny through large-v3-turbo, plus .en siblings)docs/models/whisper.md
GigaAMgigaam-v3-{e2e-rnnt,e2e-ctc,rnnt,ctc}docs/models/gigaam.md
Moonshinemoonshine-tiny, moonshine-basedocs/models/moonshine.md
Moonshine Streamingmoonshine-streaming-{tiny,small,medium}docs/models/moonshine-streaming.md
Qwen3-ASRqwen3-asr-0.6b, qwen3-asr-1.7bdocs/models/qwen3-asr.md
Cohere Transcribecohere-transcribe-03-2026docs/models/cohere-transcribe-03-2026.md
SenseVoicesensevoice-smalldocs/models/sensevoice-small.md
FunASR Nanofun-asr-nano-2512, fun-asr-mlt-nano-2512docs/models/fun-asr-nano.md
Nemotron Speech Streamingnemotron-speech-streaming-en-0.6bdocs/models/nemotron-speech-streaming-en-0.6b.md
Nemotron 3.5 ASR Streamingnemotron-3.5-asr-streaming-0.6b (multilingual, 40 locales)docs/models/nemotron-3.5-asr-streaming-0.6b.md
Multitalker Parakeet Streamingmultitalker-parakeet-streaming-0.6b-v1 (single-speaker ASR path only)docs/models/multitalker-parakeet-streaming-0.6b-v1.md
Granite Speech 4 / 4.1granite-4.0-1b-speech, granite-speech-4.1-2b{,-plus,-nar}docs/models/granite-speech.md
Voxtralvoxtral-mini-3b-2507, voxtral-small-24b-2507 (audio-LLM; transcription + translation)docs/models/voxtral.md
Voxtral Realtimevoxtral-mini-4b-realtime-2602 (streaming audio-LLM)docs/models/voxtral-realtime.md
MedASRmedasr (Conformer + CTC, English medical-dictation, gated)docs/models/medasr.md
MOSS Transcribe-Diarizemoss-transcribe-diarize (audio-LLM; English + Chinese ASR with inline speaker diarization)docs/models/moss-transcribe-diarize.md
Sortformerdiar_streaming_sortformer_4spk-v2.1 (streaming speaker diarizer, up to 4 speakers; no transcription)docs/models/diar_streaming_sortformer_4spk-v2.1.md

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

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
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

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.

About

ggml speech-to-text inference for 16+ model families

Topics

Resources

Contributing

Stars

1.9k stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - handy-computer/transcribe.cpp: ggml speech-to-text inference for 16+ model families · GitHub
Skip to content

Repository files navigation

transcribe.cpp

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 model we publish under handy-computer is numerically verified and WER-tested against its reference implementation

Supported models:

FamilyVariantsDocs
Parakeet11 variants: TDT, RNN-T, CTC, TDT+CTC (110M–1.1B), incl. German parakeet-primelinedocs/models/parakeet.md
Canarycanary-1b, canary-1b-v2, canary-1b-flash, canary-180m-flashdocs/models/canary.md
Canary-Qwencanary-qwen-2.5b (FastConformer + Qwen3-1.7B SALM)docs/models/canary-qwen-2.5b.md
Whisper12 variants (tiny through large-v3-turbo, plus .en siblings)docs/models/whisper.md
GigaAMgigaam-v3-{e2e-rnnt,e2e-ctc,rnnt,ctc}docs/models/gigaam.md
Moonshinemoonshine-tiny, moonshine-basedocs/models/moonshine.md
Moonshine Streamingmoonshine-streaming-{tiny,small,medium}docs/models/moonshine-streaming.md
Qwen3-ASRqwen3-asr-0.6b, qwen3-asr-1.7bdocs/models/qwen3-asr.md
Cohere Transcribecohere-transcribe-03-2026docs/models/cohere-transcribe-03-2026.md
SenseVoicesensevoice-smalldocs/models/sensevoice-small.md
FunASR Nanofun-asr-nano-2512, fun-asr-mlt-nano-2512docs/models/fun-asr-nano.md
Nemotron Speech Streamingnemotron-speech-streaming-en-0.6bdocs/models/nemotron-speech-streaming-en-0.6b.md
Nemotron 3.5 ASR Streamingnemotron-3.5-asr-streaming-0.6b (multilingual, 40 locales)docs/models/nemotron-3.5-asr-streaming-0.6b.md
Multitalker Parakeet Streamingmultitalker-parakeet-streaming-0.6b-v1 (single-speaker ASR path only)docs/models/multitalker-parakeet-streaming-0.6b-v1.md
Granite Speech 4 / 4.1granite-4.0-1b-speech, granite-speech-4.1-2b{,-plus,-nar}docs/models/granite-speech.md
Voxtralvoxtral-mini-3b-2507, voxtral-small-24b-2507 (audio-LLM; transcription + translation)docs/models/voxtral.md
Voxtral Realtimevoxtral-mini-4b-realtime-2602 (streaming audio-LLM)docs/models/voxtral-realtime.md
MedASRmedasr (Conformer + CTC, English medical-dictation, gated)docs/models/medasr.md
MOSS Transcribe-Diarizemoss-transcribe-diarize (audio-LLM; English + Chinese ASR with inline speaker diarization)docs/models/moss-transcribe-diarize.md
Sortformerdiar_streaming_sortformer_4spk-v2.1 (streaming speaker diarizer, up to 4 speakers; no transcription)docs/models/diar_streaming_sortformer_4spk-v2.1.md

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

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
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

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.

About

ggml speech-to-text inference for 16+ model families

Topics

Resources

Contributing

Stars

1.9k stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - handy-computer/transcribe.cpp: ggml speech-to-text inference for 16+ model families · GitHub
Skip to content

Repository files navigation

transcribe.cpp

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 model we publish under handy-computer is numerically verified and WER-tested against its reference implementation

Supported models:

FamilyVariantsDocs
Parakeet11 variants: TDT, RNN-T, CTC, TDT+CTC (110M–1.1B), incl. German parakeet-primelinedocs/models/parakeet.md
Canarycanary-1b, canary-1b-v2, canary-1b-flash, canary-180m-flashdocs/models/canary.md
Canary-Qwencanary-qwen-2.5b (FastConformer + Qwen3-1.7B SALM)docs/models/canary-qwen-2.5b.md
Whisper12 variants (tiny through large-v3-turbo, plus .en siblings)docs/models/whisper.md
GigaAMgigaam-v3-{e2e-rnnt,e2e-ctc,rnnt,ctc}docs/models/gigaam.md
Moonshinemoonshine-tiny, moonshine-basedocs/models/moonshine.md
Moonshine Streamingmoonshine-streaming-{tiny,small,medium}docs/models/moonshine-streaming.md
Qwen3-ASRqwen3-asr-0.6b, qwen3-asr-1.7bdocs/models/qwen3-asr.md
Cohere Transcribecohere-transcribe-03-2026docs/models/cohere-transcribe-03-2026.md
SenseVoicesensevoice-smalldocs/models/sensevoice-small.md
FunASR Nanofun-asr-nano-2512, fun-asr-mlt-nano-2512docs/models/fun-asr-nano.md
Nemotron Speech Streamingnemotron-speech-streaming-en-0.6bdocs/models/nemotron-speech-streaming-en-0.6b.md
Nemotron 3.5 ASR Streamingnemotron-3.5-asr-streaming-0.6b (multilingual, 40 locales)docs/models/nemotron-3.5-asr-streaming-0.6b.md
Multitalker Parakeet Streamingmultitalker-parakeet-streaming-0.6b-v1 (single-speaker ASR path only)docs/models/multitalker-parakeet-streaming-0.6b-v1.md
Granite Speech 4 / 4.1granite-4.0-1b-speech, granite-speech-4.1-2b{,-plus,-nar}docs/models/granite-speech.md
Voxtralvoxtral-mini-3b-2507, voxtral-small-24b-2507 (audio-LLM; transcription + translation)docs/models/voxtral.md
Voxtral Realtimevoxtral-mini-4b-realtime-2602 (streaming audio-LLM)docs/models/voxtral-realtime.md
MedASRmedasr (Conformer + CTC, English medical-dictation, gated)docs/models/medasr.md
MOSS Transcribe-Diarizemoss-transcribe-diarize (audio-LLM; English + Chinese ASR with inline speaker diarization)docs/models/moss-transcribe-diarize.md
Sortformerdiar_streaming_sortformer_4spk-v2.1 (streaming speaker diarizer, up to 4 speakers; no transcription)docs/models/diar_streaming_sortformer_4spk-v2.1.md

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

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
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

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.

About

ggml speech-to-text inference for 16+ model families

Topics

Resources

Contributing

Stars

1.9k stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - handy-computer/transcribe.cpp: ggml speech-to-text inference for 16+ model families · GitHub
Skip to content

Repository files navigation

transcribe.cpp

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 model we publish under handy-computer is numerically verified and WER-tested against its reference implementation

Supported models:

FamilyVariantsDocs
Parakeet11 variants: TDT, RNN-T, CTC, TDT+CTC (110M–1.1B), incl. German parakeet-primelinedocs/models/parakeet.md
Canarycanary-1b, canary-1b-v2, canary-1b-flash, canary-180m-flashdocs/models/canary.md
Canary-Qwencanary-qwen-2.5b (FastConformer + Qwen3-1.7B SALM)docs/models/canary-qwen-2.5b.md
Whisper12 variants (tiny through large-v3-turbo, plus .en siblings)docs/models/whisper.md
GigaAMgigaam-v3-{e2e-rnnt,e2e-ctc,rnnt,ctc}docs/models/gigaam.md
Moonshinemoonshine-tiny, moonshine-basedocs/models/moonshine.md
Moonshine Streamingmoonshine-streaming-{tiny,small,medium}docs/models/moonshine-streaming.md
Qwen3-ASRqwen3-asr-0.6b, qwen3-asr-1.7bdocs/models/qwen3-asr.md
Cohere Transcribecohere-transcribe-03-2026docs/models/cohere-transcribe-03-2026.md
SenseVoicesensevoice-smalldocs/models/sensevoice-small.md
FunASR Nanofun-asr-nano-2512, fun-asr-mlt-nano-2512docs/models/fun-asr-nano.md
Nemotron Speech Streamingnemotron-speech-streaming-en-0.6bdocs/models/nemotron-speech-streaming-en-0.6b.md
Nemotron 3.5 ASR Streamingnemotron-3.5-asr-streaming-0.6b (multilingual, 40 locales)docs/models/nemotron-3.5-asr-streaming-0.6b.md
Multitalker Parakeet Streamingmultitalker-parakeet-streaming-0.6b-v1 (single-speaker ASR path only)docs/models/multitalker-parakeet-streaming-0.6b-v1.md
Granite Speech 4 / 4.1granite-4.0-1b-speech, granite-speech-4.1-2b{,-plus,-nar}docs/models/granite-speech.md
Voxtralvoxtral-mini-3b-2507, voxtral-small-24b-2507 (audio-LLM; transcription + translation)docs/models/voxtral.md
Voxtral Realtimevoxtral-mini-4b-realtime-2602 (streaming audio-LLM)docs/models/voxtral-realtime.md
MedASRmedasr (Conformer + CTC, English medical-dictation, gated)docs/models/medasr.md
MOSS Transcribe-Diarizemoss-transcribe-diarize (audio-LLM; English + Chinese ASR with inline speaker diarization)docs/models/moss-transcribe-diarize.md
Sortformerdiar_streaming_sortformer_4spk-v2.1 (streaming speaker diarizer, up to 4 speakers; no transcription)docs/models/diar_streaming_sortformer_4spk-v2.1.md

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

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
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

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.

About

ggml speech-to-text inference for 16+ model families

Topics

Resources

Contributing

Stars

1.9k stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - handy-computer/transcribe.cpp: ggml speech-to-text inference for 16+ model families · GitHub
Skip to content

Repository files navigation

transcribe.cpp

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 model we publish under handy-computer is numerically verified and WER-tested against its reference implementation

Supported models:

FamilyVariantsDocs
Parakeet11 variants: TDT, RNN-T, CTC, TDT+CTC (110M–1.1B), incl. German parakeet-primelinedocs/models/parakeet.md
Canarycanary-1b, canary-1b-v2, canary-1b-flash, canary-180m-flashdocs/models/canary.md
Canary-Qwencanary-qwen-2.5b (FastConformer + Qwen3-1.7B SALM)docs/models/canary-qwen-2.5b.md
Whisper12 variants (tiny through large-v3-turbo, plus .en siblings)docs/models/whisper.md
GigaAMgigaam-v3-{e2e-rnnt,e2e-ctc,rnnt,ctc}docs/models/gigaam.md
Moonshinemoonshine-tiny, moonshine-basedocs/models/moonshine.md
Moonshine Streamingmoonshine-streaming-{tiny,small,medium}docs/models/moonshine-streaming.md
Qwen3-ASRqwen3-asr-0.6b, qwen3-asr-1.7bdocs/models/qwen3-asr.md
Cohere Transcribecohere-transcribe-03-2026docs/models/cohere-transcribe-03-2026.md
SenseVoicesensevoice-smalldocs/models/sensevoice-small.md
FunASR Nanofun-asr-nano-2512, fun-asr-mlt-nano-2512docs/models/fun-asr-nano.md
Nemotron Speech Streamingnemotron-speech-streaming-en-0.6bdocs/models/nemotron-speech-streaming-en-0.6b.md
Nemotron 3.5 ASR Streamingnemotron-3.5-asr-streaming-0.6b (multilingual, 40 locales)docs/models/nemotron-3.5-asr-streaming-0.6b.md
Multitalker Parakeet Streamingmultitalker-parakeet-streaming-0.6b-v1 (single-speaker ASR path only)docs/models/multitalker-parakeet-streaming-0.6b-v1.md
Granite Speech 4 / 4.1granite-4.0-1b-speech, granite-speech-4.1-2b{,-plus,-nar}docs/models/granite-speech.md
Voxtralvoxtral-mini-3b-2507, voxtral-small-24b-2507 (audio-LLM; transcription + translation)docs/models/voxtral.md
Voxtral Realtimevoxtral-mini-4b-realtime-2602 (streaming audio-LLM)docs/models/voxtral-realtime.md
MedASRmedasr (Conformer + CTC, English medical-dictation, gated)docs/models/medasr.md
MOSS Transcribe-Diarizemoss-transcribe-diarize (audio-LLM; English + Chinese ASR with inline speaker diarization)docs/models/moss-transcribe-diarize.md
Sortformerdiar_streaming_sortformer_4spk-v2.1 (streaming speaker diarizer, up to 4 speakers; no transcription)docs/models/diar_streaming_sortformer_4spk-v2.1.md

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

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
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

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.

About

ggml speech-to-text inference for 16+ model families

Topics

Resources

Contributing

Stars

1.9k stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - handy-computer/transcribe.cpp: ggml speech-to-text inference for 16+ model families · GitHub
Skip to content

Repository files navigation

transcribe.cpp

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 model we publish under handy-computer is numerically verified and WER-tested against its reference implementation

Supported models:

FamilyVariantsDocs
Parakeet11 variants: TDT, RNN-T, CTC, TDT+CTC (110M–1.1B), incl. German parakeet-primelinedocs/models/parakeet.md
Canarycanary-1b, canary-1b-v2, canary-1b-flash, canary-180m-flashdocs/models/canary.md
Canary-Qwencanary-qwen-2.5b (FastConformer + Qwen3-1.7B SALM)docs/models/canary-qwen-2.5b.md
Whisper12 variants (tiny through large-v3-turbo, plus .en siblings)docs/models/whisper.md
GigaAMgigaam-v3-{e2e-rnnt,e2e-ctc,rnnt,ctc}docs/models/gigaam.md
Moonshinemoonshine-tiny, moonshine-basedocs/models/moonshine.md
Moonshine Streamingmoonshine-streaming-{tiny,small,medium}docs/models/moonshine-streaming.md
Qwen3-ASRqwen3-asr-0.6b, qwen3-asr-1.7bdocs/models/qwen3-asr.md
Cohere Transcribecohere-transcribe-03-2026docs/models/cohere-transcribe-03-2026.md
SenseVoicesensevoice-smalldocs/models/sensevoice-small.md
FunASR Nanofun-asr-nano-2512, fun-asr-mlt-nano-2512docs/models/fun-asr-nano.md
Nemotron Speech Streamingnemotron-speech-streaming-en-0.6bdocs/models/nemotron-speech-streaming-en-0.6b.md
Nemotron 3.5 ASR Streamingnemotron-3.5-asr-streaming-0.6b (multilingual, 40 locales)docs/models/nemotron-3.5-asr-streaming-0.6b.md
Multitalker Parakeet Streamingmultitalker-parakeet-streaming-0.6b-v1 (single-speaker ASR path only)docs/models/multitalker-parakeet-streaming-0.6b-v1.md
Granite Speech 4 / 4.1granite-4.0-1b-speech, granite-speech-4.1-2b{,-plus,-nar}docs/models/granite-speech.md
Voxtralvoxtral-mini-3b-2507, voxtral-small-24b-2507 (audio-LLM; transcription + translation)docs/models/voxtral.md
Voxtral Realtimevoxtral-mini-4b-realtime-2602 (streaming audio-LLM)docs/models/voxtral-realtime.md
MedASRmedasr (Conformer + CTC, English medical-dictation, gated)docs/models/medasr.md
MOSS Transcribe-Diarizemoss-transcribe-diarize (audio-LLM; English + Chinese ASR with inline speaker diarization)docs/models/moss-transcribe-diarize.md
Sortformerdiar_streaming_sortformer_4spk-v2.1 (streaming speaker diarizer, up to 4 speakers; no transcription)docs/models/diar_streaming_sortformer_4spk-v2.1.md

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

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
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

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.

About

ggml speech-to-text inference for 16+ model families

Topics

Resources

Contributing

Stars

1.9k stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages