Skip to main content
PromptQuorumBuilt for humans. Structured for AI.
Home/Power Local LLM/Whisper.cpp vs faster-whisper 2026: Local STT Benchmarks, Setup & GPU Acceleration
Voice, Speech & Multimodal

Whisper.cpp vs faster-whisper 2026: Local STT Benchmarks, Setup & GPU Acceleration

·10 min read·By Hans Kuepper · Founder of PromptQuorum · Discovery engine for open-weight & open-source AI

whisper.cpp vs faster-whisper — the two dominant local Whisper runtimes — each win decisively on their target platform. For Apple Silicon (M-series Macs), whisper.cpp with Metal acceleration is the fastest local STT option in 2026 — large-v3 runs at ~10× real-time on an M5 Pro. For NVIDIA GPU servers and Python pipelines, faster-whisper with CTranslate2 int8 quantization is the better choice, achieving ~12× real-time on an RTX 4070 with 2.5 GB VRAM for the large-v3 model. Both tools use the same underlying Whisper models from OpenAI (tiny through large-v3); the difference is runtime optimization and integration path. On CPU-only hardware, both are usable for the tiny and base models — faster-whisper has a slight edge (~20× real-time vs. ~15×) on CPU via int8.

whisper.cpp and faster-whisper are the two dominant implementations of OpenAI's Whisper speech-to-text model for local, offline transcription in 2026. whisper.cpp is a pure C/C++ port that runs on Apple Metal, CUDA, Vulkan, and CPU — making it ideal for Apple Silicon, embedded systems, and real-time voice applications. faster-whisper is a Python library using CTranslate2 that achieves ~4× the throughput of the original Whisper on NVIDIA GPUs via int8 quantization. This guide covers installation, performance benchmarks, real-time transcription setup, and a head-to-head comparison across platforms so you can pick the right tool for your pipeline.

Whisper.cpp vs faster-whisper 2026: Local STT Benchmarks, Setup & GPU Acceleration

Key Takeaways

  • whisper.cpp is the best local STT choice for Apple Silicon. The C/C++ port leverages Core ML and Apple Metal for hardware acceleration — large-v3 at ~10× real-time on M5 Pro, with no Python dependency required.
  • faster-whisper is the best local STT choice for NVIDIA GPUs and Python pipelines. CTranslate2 int8 quantization cuts VRAM by ~40% and boosts throughput by ~4× over the original OpenAI implementation — large-v3 at ~12× real-time on RTX 4070, using only ~2.5 GB VRAM.
  • Both tools use identical Whisper model weights from OpenAI. WER (word error rate) is the same for both — the difference is entirely in runtime performance and integration pathway, not transcription accuracy.
  • Whisper large-v3 gives the best accuracy at 2.5% WER on English. For most production use cases, Whisper small (3.4% WER, 2 GB RAM) or medium (2.9% WER, 5 GB RAM) offers a better speed-accuracy trade-off.
  • Real-time transcription is achievable with both tools — whisper.cpp via its --stream flag, faster-whisper via its built-in VAD (voice activity detection) pipeline. Practical latency is 0.5–2 seconds behind live speech depending on model size.
  • whisper.cpp runs on CPU, Metal, CUDA, and Vulkan — making it the practical choice for cross-platform embedded use (Raspberry Pi, Windows GPU setups, ARM servers). faster-whisper supports CPU and CUDA only (no Metal on Mac).
  • For Raspberry Pi 5 and embedded Linux, whisper.cpp tiny and base on CPU are the real-time-capable models — tiny runs comfortably faster than real-time, base around real-time with -t 4. The small model (3.4% WER) runs below real-time on the Pi 5 and is best for batch jobs. All inference is CPU (ARM NEON) — the Pi has no usable GPU path for Whisper.

Quick Facts

  • Both tools: Based on OpenAI's open-source Whisper model (MIT license). Same accuracy — different runtimes.
  • whisper.cpp: Written in C/C++ by ggerganov. Supports CPU (AVX2/NEON), CUDA, Metal (Apple), Vulkan. No Python required.
  • faster-whisper: Python library using CTranslate2. Supports CPU (int8) and CUDA. No Apple Metal support.
  • Whisper model sizes: tiny (39M), base (74M), small (244M), medium (769M), large-v3 (1.55B). All use the same ggml / CTranslate2 format.
  • Best model for most use cases: Whisper small — 3.4% WER, runs in 2 GB RAM, 6× real-time on modern CPU.
  • RTX 4070 benchmark (large-v3): faster-whisper ~12× real-time; whisper.cpp CUDA ~8× real-time. faster-whisper wins on NVIDIA.
  • M5 Pro benchmark (large-v3): whisper.cpp Metal ~10× real-time; faster-whisper CPU-only ~3× real-time. whisper.cpp wins on Apple.

Why Local Speech-to-Text?

Cloud STT services (Google Speech-to-Text, AWS Transcribe, Azure Speech) charge per audio minute — typically $0.006–$0.024/minute — and send your audio to remote servers. For privacy-sensitive applications (medical dictation, legal recordings, journalist interviews, corporate meetings), local transcription eliminates the data exposure entirely.

  • Privacy: Audio never leaves your machine, so no cloud processor is involved in transcription. Data-protection duties such as legal basis and secure storage still apply to you.
  • Cost: Zero per-minute fees. A developer transcribing 8 hours of meetings per week saves $120–480/month at cloud STT pricing.
  • Offline: Works on planes, in secure facilities, in areas without reliable internet. No API key management.
  • Latency: No upload/download round-trip. For real-time voice interfaces, local processing reduces STT latency from 300–800 ms (cloud) to 50–300 ms.
  • Customization: Fine-tune on domain-specific vocabulary. Run any model size that fits your hardware.
  • Home assistant integration: Whisper running locally means wake words and voice commands never leave your home network. See local Whisper in Home Assistant → for the add-on setup that replaces cloud STT entirely.

Whisper Model Sizes — Foundation for Both Tools

Both whisper.cpp and faster-whisper use the same Whisper model weights, converted to their respective formats (GGML for whisper.cpp, CTranslate2 for faster-whisper). Choose your model size based on your VRAM/RAM budget and accuracy requirements.

Model
Parameters
VRAM / RAM
English WER
Speed Factor (vs real-time on RTX 4070)
tiny39M~1 GB7.6%~32×
base74M~1 GB5.0%~16×
small244M~2 GB3.4%~6×
medium769M~5 GB2.9%~2×
large-v31.55B~10 GB2.5%1× (baseline)
distil-large-v3~756M~4 GB~2.6%~6×

WER (word error rate) figures from the Whisper paper on the LibriSpeech clean test set. Lower is better. Speed factors for faster-whisper int8 on RTX 4070. distil-large-v3 figures from the Distil-Whisper paper.

Whisper model sizes tiny to large-v3: WER drops from 7.6% to 2.5% while speed drops from 32x to 1x real-time.
Whisper model sizes tiny to large-v3: WER drops from 7.6% to 2.5% while speed drops from 32x to 1x real-time.

Distil-Whisper: The Faster Alternative

distil-whisper/distil-large-v3 is a distilled variant of large-v3 with ~50% fewer parameters, running ~6× faster while keeping WER within ~1% of the original. It is the right choice when transcription speed matters more than squeezing out the last fraction of accuracy. distil-large-v3 works with both faster-whisper (native CTranslate2 support) and whisper.cpp (via GGML format conversion), so it integrates into whichever runtime you already use.

  • Parameters: ~756M — roughly half of large-v3's 1.55B, fitting in ~4 GB VRAM instead of ~10 GB.
  • Speed: ~6× real-time on RTX 4070 (vs. 1× baseline for large-v3) — comparable to the medium model in speed, with large-v3-level accuracy.
  • WER: ~2.6% on English — only ~0.1% higher than large-v3's 2.5%. In practice, the difference is inaudible on typical speech.
  • Compatibility: Works with faster-whisper natively (WhisperModel("distil-large-v3", device="cuda", compute_type="int8")). For whisper.cpp, convert to GGML format using the distil-whisper GGML conversion script.
  • Best for: Batch transcription jobs, server deployments with limited VRAM, and any use case where you want large-v3 quality at medium-model speed.
  • Not for: Multilingual transcription — distil-large-v3 is English-only. For other languages, use large-v3 or medium.

whisper.cpp — The C/C++ Port

whisper.cpp (by Georgi Gerganov) is a pure C/C++ reimplementation of OpenAI's Whisper model, optimized for low-resource and cross-platform inference. It requires no Python, no CUDA toolkit, and runs on virtually any hardware — from Raspberry Pi to Apple M5 Pro to Windows CUDA setups.

  • Platform support: CPU (AVX2, AVX512, ARM NEON), Apple Metal (Core ML), CUDA (NVIDIA), Vulkan (AMD/Intel GPU), OpenCL.
  • Apple Silicon advantage: whisper.cpp exports models to Core ML format, enabling inference on the Apple Neural Engine. Large-v3 runs at ~10× real-time on M5 Pro via Metal — faster than any cloud round-trip.
  • Installation: Clone the repo, run make (or cmake). Pre-built binaries available for common platforms. No Python dependency.
  • Model download: bash ./models/download-ggml-model.sh base.en — downloads the GGML-format model file (~142 MB for base).
  • CLI example: ./main -m models/ggml-base.bin -f audio.wav — transcribes a WAV file to stdout. Add -l de for German.
  • Real-time stream mode: ./stream -m models/ggml-base.bin --step 3000 --length 10000 — transcribes from microphone in 3-second chunks.
  • Python wrapper: pywhispercpp provides a Python binding for whisper.cpp, enabling use in Python pipelines without sacrificing Metal acceleration.
  • Limitation: No native VAD (voice activity detection). Stream mode requires tuning --step and --length parameters for your use case.
bash
# Build from source (macOS / Linux)
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp
make -j4

# Download a model
bash ./models/download-ggml-model.sh large-v3

# Transcribe a file
./main -m models/ggml-large-v3.bin -f recording.wav

# Enable Metal on Apple Silicon (Core ML)
make -j4 WHISPER_COREML=1
./main -m models/ggml-large-v3-encoder.mlmodelc -f recording.wav

whisper.cpp Latest Version & Updates

The latest whisper.cpp release is v1.9.5, published October 6, 2026. It syncs the bundled ggml library to v0.26.0 with backend work across CUDA, Vulkan, Metal, SYCL, OpenCL and CPU kernels, and adds Whisper fixes such as an abort callback during language detection and an integer-overflow fix in parallel chunk offsets. whisper.cpp is also packaged officially for Debian (sid) as whisper.cpp / libwhisper-dev / libwhisper1, alongside the long-standing unofficial Snap. faster-whisper's latest tagged release is still v1.2.1 (October 31, 2025), but the repository is actively maintained: commits landed as recently as October 16, 2026. Both runtimes still load the same OpenAI Whisper weights; nothing about transcription accuracy changed in 2026.

  • whisper.cpp v1.9.5 (October 6, 2026): Syncs ggml to v0.26.0 with CUDA, Vulkan, Metal, SYCL, OpenCL, WebGPU and CPU kernel updates, adds an abort callback during language detection, fixes an integer overflow in parallel chunk offsets, and makes the CLI return the correct error code when a file fails.
  • whisper.cpp v1.9.4 (September 11, 2026): The server now returns the detected language, the encoder callback runs before language auto-detection, and Windows on ARM was added to the release job.
  • whisper.cpp v1.9.3 (August 20, 2026): Syncs ggml to v0.20.2 with backend-wide performance improvements, Metal TQ2_0 quantization support, fused CUDA/SYCL kernels, and ARM/WASI fixes.
  • whisper.cpp v1.9.0–v1.9.2 (June–August 2026): Point releases continuing the same ggml-sync and cross-backend performance line ahead of v1.9.3.
  • whisper.cpp v1.8.6 (June 2, 2026): Reimplemented ffmpeg-transcode for clearer optional FFmpeg decoding of compressed audio (MP3, M4A) plus a CI examples-path fix.
  • whisper.cpp v1.8.5 (May 2026): Streaming VAD (voice activity detection) improvements, server parameter-leak and token-timestamp fixes, and memory-leak fixes in the Ruby and VAD bindings.
  • whisper.cpp v1.8.4 (March 19, 2026): Latest ggml sync with broad performance gains, a new -g / --gpu-device flag (and GGML_CUDA device selection) to pick a GPU, and UTF-8 segment-wrapping fixes.
  • Native VAD is now built into whisper.cpp. Recent releases added a native voice-activity-detection path, narrowing a long-standing faster-whisper advantage — though faster-whisper's Silero VAD integration remains more turnkey.
  • faster-whisper v1.2.1 (October 31, 2025): Latest tagged release; pip install faster-whisper pulls it. There is no tagged release in 2026, but the main branch is active: commits from October 16, 2026 add input validation, such as an error for languages a model does not support. v1.2.0 (August 2025) added distil-large-v3.5 support.
  • CTranslate2 v4.8.3 (October 13, 2026): The inference engine under faster-whisper keeps shipping. The v4.8 line added Windows ROCm fixes, load-time hardening, and a fix for a division by zero in Whisper align() when a window has no frames.
  • No new accuracy-class Whisper model in 2026. OpenAI's newest multilingual weights remain large-v3-turbo (October 2024; 809M parameters, decoder cut from 32 to 4 layers, MIT license), which trades a small quality loss for much higher speed and runs in both tools. distil-large-v3 stays the English-only speed option. Updates to either runtime are runtime and tooling changes, not accuracy changes.

faster-whisper — The CTranslate2 Port

faster-whisper (by SYSTRAN) is a Python library that reimplements Whisper inference using CTranslate2 — a highly optimized C++ inference engine that supports int8 quantization, reducing VRAM usage and increasing throughput. On NVIDIA GPUs, faster-whisper is the fastest local Whisper implementation available.

  • Platform support: CPU (int8 quantization) and NVIDIA CUDA GPU. No Apple Metal support — runs CPU-only on Mac.
  • int8 advantage: CTranslate2 int8 quantization reduces VRAM by ~40% and increases inference speed by ~2× vs float16, with negligible WER impact (< 0.1% absolute).
  • Installation: pip install faster-whisper — no compilation required (Python 3.9+). GPU use needs NVIDIA cuBLAS for CUDA 12 and cuDNN 9; older CUDA 11 / cuDNN 8 setups must pin an older ctranslate2 (3.24.0).
  • Built-in VAD: faster-whisper includes Silero VAD integration, which automatically skips silent audio segments — critical for real-time transcription pipelines.
  • Python-native: Direct Python API makes it trivial to chain with LLMs, audio processing libraries, and web frameworks.
  • Speed: large-v3 int8 on RTX 4070 runs at ~12× real-time and uses ~2.5 GB VRAM. CPU int8 achieves ~20× real-time for the tiny model.
  • Batch processing: faster-whisper supports batched inference for processing large audio archives efficiently.
  • Limitation: No Metal support on Mac — runs CPU-only on Apple Silicon, achieving ~3× real-time for large-v3 vs. whisper.cpp's ~10× with Metal.
python
from faster_whisper import WhisperModel

# Load model (downloads automatically on first run)
model = WhisperModel("large-v3", device="cuda", compute_type="int8")

# Transcribe
segments, info = model.transcribe("audio.wav", beam_size=5)

print(f"Detected language: {info.language} (probability: {info.language_probability:.2f})")
for segment in segments:
    print(f"[{segment.start:.2f}s → {segment.end:.2f}s] {segment.text}")

Get ggml-base.bin via pip (Python Setup)

To use ggml-base.bin from Python via pip, install the pywhispercpp binding — pip install pywhispercpp — then load Model("base"), which downloads ggml-base.bin automatically on first run. There is no pip install whisper.cpp; pywhispercpp is the pip wrapper around the whisper.cpp C/C++ engine, and it keeps Metal and CUDA acceleration. The GGML model file (ggml-base.bin, ~142 MB) is downloaded separately from Hugging Face and cached locally — the pip package ships the inference engine, not the weights.

📍 In One Sentence

Run pip install pywhispercpp, then Model("base") in Python fetches and caches ggml-base.bin automatically on first use.

💬 In Plain Terms

pip installs the program (pywhispercpp); the ggml-base.bin model file is a separate ~142 MB download that happens the first time you load the "base" model — or that you grab by hand with the download-ggml-model.sh script.

  • Install the binding: pip install pywhispercpp. For NVIDIA CUDA acceleration, build with GGML_CUDA=1 pip install git+https://github.com/absadiki/pywhispercpp.
  • Auto-download ggml-base.bin: from pywhispercpp.model import Model then model = Model("base") downloads ggml-base.bin from Hugging Face (ggerganov/whisper.cpp) on first run and caches it. Use "base.en" for the English-only variant.
  • Manual download (CLI route, no pip): From a cloned whisper.cpp repo, bash ./models/download-ggml-model.sh base saves the file to models/ggml-base.bin — the same file pywhispercpp fetches.
  • Direct download: curl -L -o ggml-base.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin pulls the model with no script. Swap base for tiny, small, medium, or large-v3.
  • Do not confuse the packages: pip install openai-whisper installs OpenAI's original PyTorch Whisper (it uses .pt checkpoints, not ggml-base.bin). pip install faster-whisper uses the CTranslate2 format. Only pywhispercpp consumes GGML ggml-*.bin files.
  • Where the file lives: pywhispercpp stores downloaded GGML models under its module cache (or a path you pass via Model("base", models_dir="...")), so the same ggml-base.bin is reused across runs — no re-download.
bash
# 1. Install the pip binding for whisper.cpp
pip install pywhispercpp

# 2. ggml-base.bin downloads automatically on first use
#    from pywhispercpp.model import Model
#    model = Model("base")          # fetches & caches ggml-base.bin (~142 MB)
#    for seg in model.transcribe("audio.wav"):
#        print(seg.text)

# --- Or get ggml-base.bin manually (no pip) ---
# From a cloned whisper.cpp checkout:
bash ./models/download-ggml-model.sh base       # -> models/ggml-base.bin

# Or download the file directly from Hugging Face:
curl -L -o ggml-base.bin \
  https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin

Head-to-Head Benchmark Table

All benchmarks use the large-v3 model unless noted. Speed is measured in multiples of real-time (e.g., 10× means 60 minutes of audio transcribed in 6 minutes). VRAM figures for GPU runs; RAM figures for CPU runs.

📍 In One Sentence

On Apple Silicon, whisper.cpp with Metal runs large-v3 at ~10× real-time; on NVIDIA GPUs, faster-whisper with int8 runs at ~12× real-time — each tool wins decisively on its target platform.

💬 In Plain Terms

Pick whisper.cpp on Mac (it uses the Apple Neural Engine), and faster-whisper on Windows/Linux with an NVIDIA GPU (it processes audio 12× faster than real-time while using 40% less GPU memory).

Metric
whisper.cpp (large-v3)
faster-whisper (large-v3)
Platform / languageC/C++ (cross-platform)Python (CTranslate2)
GPU supportCUDA, Metal, VulkanCUDA only
CPU optimizationAVX2, ARM NEONint8 quantization
Speed — RTX 4070, large-v3~8× real-time~12× real-time ✓
Speed — M5 Pro, large-v3~10× real-time (Metal) ✓~3× real-time (CPU only)
Speed — CPU only (x86), base~15× real-time~20× real-time ✓
VRAM — large-v3, GPU~3 GB~2.5 GB (int8) ✓
Python integrationNeeds wrapper (pywhispercpp)Native ✓
VAD (silence detection)Manual (--step tuning)Built-in (Silero VAD) ✓
Real-time streamingYes (--stream flag) ✓Yes (VAD pipeline)
WER accuracy (large-v3)2.5% (identical)2.5% (identical)
Python dependencyNone ✓Python 3.9+
Raspberry Pi / embeddedYes — C binary ✓Limited — Python overhead
Output formatsSRT, VTT, JSON, CSV, txtPython objects (start, end, text)

whisper.cpp writes output directly to standard subtitle and transcript file formats (SRT, VTT, JSON, CSV, txt) — ideal for subtitle workflows where you need a file on disk with no additional code. faster-whisper yields a Python generator of segment objects with start, end, and text attributes — ideal for LLM pipeline chaining, where you pass segment text directly into a downstream model without writing intermediate files. For subtitle generation, whisper.cpp is simpler. For pipelines that process segments programmatically, faster-whisper is simpler.

whisper.cpp hits 10x real-time on Apple M5 Pro via Metal; faster-whisper hits 12x on RTX 4070 via CUDA int8.
whisper.cpp hits 10x real-time on Apple M5 Pro via Metal; faster-whisper hits 12x on RTX 4070 via CUDA int8.

Reference Benchmark: GPU vs CPU Timings from faster-whisper

The faster-whisper project publishes its own timings on a 13-minute audio file — they show whisper.cpp with Flash Attention matching faster-whisper fp16 on a GPU, while batching and int8 are where faster-whisper pulls ahead. The figures below come from the faster-whisper README (large-v2 on an RTX 3070 Ti 8 GB with CUDA 12.4 for the GPU rows; the small model on an Intel Core i7-12700K with 8 threads for the CPU rows; beam size 5). They are not our own measurements and use different hardware and models than the large-v3 figures above.

📍 In One Sentence

In the faster-whisper README benchmark, whisper.cpp with Flash Attention (1m05s) and faster-whisper fp16 (1m03s) are nearly tied on a GPU; faster-whisper int8 with batching finishes the same 13-minute file in 16 seconds.

Setup
Precision
Time
VRAM / RAM
GPU · whisper.cpp (Flash Attn)fp161m05s4127 MB
GPU · faster-whisperfp161m03s4525 MB
GPU · faster-whisperint859s2926 MB
GPU · faster-whisper, batch 8int816s4500 MB
CPU · whisper.cppfp322m05s1049 MB
CPU · faster-whisperint81m42s1477 MB
CPU · faster-whisper, batch 8int851s3608 MB

Read this next to the head-to-head table: single-stream fp16 GPU speed is close between the two tools on this setup. faster-whisper's lasting advantages are int8 memory savings (2.9 GB vs 4.1–4.5 GB at fp16) and batched inference (16 s vs 59 s). On CPU, whisper.cpp fp32 and faster-whisper int8 are within roughly 25% of each other without batching.

Real-Time Transcription Setup

Real-time transcription processes audio in chunks as it arrives from a microphone, producing text with a short lag behind speech. Both tools support this, but with different trade-offs.

  • whisper.cpp stream mode: Run ./stream -m models/ggml-small.bin --step 3000 --length 10000 -t 4. Processes 3-second audio chunks; ~0.5–1.5 second lag with the small model. No Python needed.
  • faster-whisper VAD pipeline: Use vad_filter=True in model.transcribe(). Silero VAD automatically segments audio at silence boundaries — more natural chunks than fixed-length windows.
  • Practical latency: 0.5–2 seconds behind live speech with small or medium models. Use tiny for the lowest latency (< 0.5 seconds, but higher WER).
  • Model selection for real-time: small or base is the practical sweet spot — fast enough to keep up with speech, accurate enough for clean audio. Avoid large-v3 for real-time unless you have a dedicated GPU.
  • Microphone input: whisper.cpp reads raw audio via SDL2 or portaudio. faster-whisper reads audio arrays from any Python audio library (sounddevice, pyaudio, soundfile).
  • Stability: whisper.cpp stream mode can produce repeated tokens ("hallucinate" short fillers) on silence. Suppress with --suppress-blank and --no-speech-threshold.

Apple Silicon: whisper.cpp Wins

On M1, M2, M3, M4, and M5 Macs, whisper.cpp with Core ML / Metal acceleration is the correct tool — no question. faster-whisper has no Metal support and runs CPU-only on Mac, achieving roughly 3× real-time for large-v3. whisper.cpp with Metal achieves ~10× real-time on M5 Pro — a 3× speed advantage.

  • Core ML export: Run ./models/generate-coreml-model.sh large-v3 to export the encoder to Core ML format. This offloads encoder inference to the Apple Neural Engine.
  • M5 Pro benchmark (large-v3, Metal): ~10× real-time. 60 minutes of audio transcribes in ~6 minutes. Note: M5 Pro shipped March 2026 — these are early community benchmarks. Performance may improve with whisper.cpp updates optimizing for the M5 Neural Engine.
  • M3 MacBook Air benchmark (large-v3, Metal): ~7× real-time. 60 minutes in ~8.5 minutes.
  • Memory: Unified memory means no separate VRAM — a 16 GB M5 Pro can comfortably run large-v3 (~3 GB) alongside other processes.
  • faster-whisper on Mac: CPU-only, int8. Large-v3 at ~3× real-time. Usable for batch overnight transcription but not for real-time or time-sensitive workflows.
  • Recommendation: Use whisper.cpp for all Mac STT work. Add pywhispercpp if you need Python integration while retaining Metal acceleration.

NVIDIA GPU: faster-whisper Wins

On Windows and Linux with NVIDIA GPUs, faster-whisper is the superior choice. Its CTranslate2 CUDA backend is more optimized than whisper.cpp's CUDA path — ~12× vs. ~8× real-time for large-v3 on RTX 4070, with lower VRAM usage.

  • RTX 4070 (12 GB) benchmark (large-v3 int8): ~12× real-time, ~2.5 GB VRAM.
  • RTX 3060 (12 GB) benchmark (large-v3 int8): ~8× real-time, ~2.5 GB VRAM.
  • RTX 4060 (8 GB) benchmark (large-v3 int8): ~7× real-time, ~2.5 GB VRAM — easily fits.
  • int8 vs float16: int8 is ~2× faster and uses ~40% less VRAM with negligible accuracy loss. Always use compute_type="int8" on NVIDIA.
  • Batch processing: faster-whisper's batched=True parameter enables parallel processing of multiple audio files, maximizing GPU utilization for large transcription jobs.
  • Python pipeline integration: faster-whisper slots directly into LangChain, Haystack, and custom Python pipelines. No subprocess overhead vs. wrapping whisper.cpp.

Older NVIDIA GPUs (GTX 970): int8 Falls Back to float32

On a GTX 970 (Maxwell, compute capability 5.2), faster-whisper still runs on CUDA, but compute_type="int8" does not give you int8 — CTranslate2 converts the weights to float32. Its quantization table maps every GPU at compute capability 6.0 or lower to float32 for any requested type, so the ~40% VRAM saving and the int8 speedup quoted for RTX cards do not apply.

📍 In One Sentence

On a GTX 970 (compute capability 5.2), faster-whisper runs on CUDA in float32 only — a requested int8 compute type is converted automatically.

💬 In Plain Terms

The GTX 970 is too old for GPU int8. It still works, but you get no memory savings, so stay with the tiny, base or small models on its 4 GB.

  • What still works: CTranslate2's prebuilt binaries support NVIDIA GPUs with compute capability 3.5 or higher, so a GTX 970 (5.2) can run faster-whisper on CUDA, provided your installed CUDA and cuDNN libraries match the release (see Common Issues).
  • Where GPU int8 works: int8 needs compute capability 7.0 or higher (Volta and RTX 20-series onward) or exactly 6.1 (GTX 1050 to 1080 Ti, int8_float32). Compute capability 6.0, 6.2 and everything below fall back to float32; float16 needs 7.0 or higher.
  • Memory consequence: float32 stores 4 bytes per parameter against 1 byte for int8, so by parameter count large-v3 (1.55B) needs roughly 6 GB for weights alone — more than the GTX 970's 4 GB. Small (244M, about 1 GB in float32) fits comfortably; medium (769M, about 3 GB) is borderline.
  • Speed: We have not benchmarked a GTX 970, so there is no measured figure here. Expect float32 throughput well below the RTX 4070 int8 numbers in this guide, and test tiny, base and small on your own audio.
  • Check what your GPU supports: ctranslate2.get_supported_compute_types("cuda") lists the compute types CTranslate2 accepts on your card.
  • Fallbacks: CPU int8 (device="cpu", compute_type="int8") works on any modern x86 CPU, and whisper.cpp's quantized GGML models (for example ggml-large-v3-q5_0.bin, about 3–4 GB) are the usual way to fit larger models into 4 GB — verify the CUDA or Vulkan build on your card.
python
import ctranslate2
from faster_whisper import WhisperModel

# Which compute types does this GPU accept?
print(ctranslate2.get_supported_compute_types("cuda"))

# On compute capability < 6.1 (e.g. GTX 970), request float32 explicitly so nothing is converted silently
model = WhisperModel("small", device="cuda", compute_type="float32")

Whisper on Raspberry Pi 5: tiny, base & small

On a Raspberry Pi 5, whisper.cpp runs the tiny and base models in real time for live transcription, while the small model runs below real time and is best kept to batch jobs. The Pi 5's quad-core Cortex-A76 has no usable GPU path for Whisper, so all inference is CPU (ARM NEON). Use the quantized GGML models (ggml-*-q5_0.bin) to cut memory use and speed inference.

📍 In One Sentence

On a Raspberry Pi 5, the whisper.cpp small model runs slower than real time (~0.5×, batch only); tiny and base are the models that keep up with live speech.

💬 In Plain Terms

A Pi 5 can transcribe live audio with the tiny and base Whisper models, but the small model is too heavy to keep up in real time — use small for recorded files you process in the background, not for a live microphone.

  • Whisper small on Pi 5: Roughly 0.4–0.6× real-time on CPU (a 10-minute clip takes ~17–25 minutes). Accurate at 3.4% WER but too slow for live captioning — use it for overnight/batch transcription.
  • Whisper base on Pi 5: Around real-time to ~2× with multithreading (-t 4). The practical sweet spot for live transcription on the Pi, with acceptable 5.0% WER.
  • Whisper tiny on Pi 5: Fastest option, comfortably faster than real-time for live use, at the cost of higher 7.6% WER. Best for wake-word and short-command recognition.
  • Use quantized models: bash ./models/download-ggml-model.sh small-q5_0 trims RAM and speeds inference with minimal accuracy loss — important on the Pi 5's shared memory.
  • faster-whisper on Pi 5: Installable (pip install faster-whisper, CPU int8) and competitive for batch jobs, but whisper.cpp's lighter C binary is the more common embedded choice.
  • Thermals: Sustained transcription pushes the Pi 5 CPU hard — use active cooling to avoid thermal throttling that erodes these numbers.

When to Use Which

A direct mapping from your scenario to the right tool:

📍 In One Sentence

Use whisper.cpp on Apple Silicon and embedded/cross-platform targets; use faster-whisper on NVIDIA GPUs and Python pipelines.

💬 In Plain Terms

If you have a Mac, pick whisper.cpp — it's 3× faster than faster-whisper on Apple hardware. If you have an NVIDIA GPU and write Python, pick faster-whisper — it's faster and needs 40% less GPU memory.

Scenario
Best Choice
Why
Apple Silicon Mac (any model)whisper.cppMetal / Core ML acceleration — 3× faster than faster-whisper (CPU-only on Mac)
NVIDIA GPU server (Linux/Windows)faster-whisperCTranslate2 int8 — faster and lower VRAM than whisper.cpp CUDA path
Python data pipelinefaster-whisperNative Python API; no subprocess wrapper; VAD built in
Raspberry Pi / embedded Linuxwhisper.cppPure C binary; no Python runtime overhead; ARM NEON optimized
Real-time voice assistantwhisper.cppStream mode with low overhead; works without Python on Pi / embedded
Batch transcription (large audio archive)faster-whisperBatched inference, GPU utilization, Python async integration
AMD GPU (Vulkan)whisper.cppVulkan backend support; faster-whisper is CUDA-only
CPU-only Linux serverfaster-whisperint8 quantization gives ~30% speed advantage on x86 CPU

Beyond whisper.cpp and faster-whisper

Two additional tools extend Whisper with capabilities that neither whisper.cpp nor faster-whisper provide out of the box: speaker diarization and extreme-speed batch GPU inference.

  • WhisperX: Built on top of faster-whisper, WhisperX adds word-level timestamps and speaker diarization — identifying which speaker said which words. Best for meeting transcription with speaker labels, podcast editing, and interview transcripts. Install with pip install whisperx and provide a Hugging Face token for the diarization model.
  • insanely-fast-whisper: A Hugging Face Transformers pipeline wrapper that adds Flash Attention 2 support for significantly faster GPU inference than standard faster-whisper on NVIDIA hardware. Best for batch processing large audio archives on NVIDIA GPUs. Requires a Flash Attention 2-compatible GPU (Ampere or newer: RTX 3000+, A100, H100).

Common Issues and Fixes

The most frequent setup and runtime problems, with direct fixes:

  • CUDA version mismatch: Current faster-whisper releases need cuBLAS for CUDA 12 and cuDNN 9. If you are stuck on older libraries, pin ctranslate2: pip install --force-reinstall ctranslate2==4.4.0 (CUDA 12 with cuDNN 8) or 3.24.0 (CUDA 11 with cuDNN 8). Check your CUDA version with nvcc --version.
  • Metal model export fails: Ensure Xcode Command Line Tools are installed — run xcode-select --install. The Core ML export script requires the coremltools Python package: pip install coremltools.
  • Hallucination on silence: Both tools can produce repeated filler tokens on silent audio segments. Use --no-speech-threshold 0.6 in whisper.cpp stream mode, or vad_filter=True in faster-whisper's model.transcribe() to skip silent segments automatically.
  • Out of memory on large-v3: Switch to int8 quantization in faster-whisper (compute_type="int8") — reduces VRAM from ~5 GB (float16) to ~2.5 GB. In whisper.cpp, use the quantized GGML variant (e.g., ggml-large-v3-q5_0.bin) which cuts memory to ~3–4 GB.
  • Garbled output on non-English audio: Do not use .en model variants (tiny.en, base.en) for non-English speech — they are English-only. Use the multilingual models (base, small, medium, large-v3) and set the language explicitly: -l de in whisper.cpp or language="de" in faster-whisper.
  • Slow CPU inference: Ensure your CPU supports AVX2 instructions (required for optimized CPU inference). Check with grep avx2 /proc/cpuinfo on Linux or sysctl machdep.cpu.features on Mac. CPUs without AVX2 fall back to generic SIMD and will be 2–3× slower.

Frequently Asked Questions

Is there a Debian or apt package for whisper.cpp?

Yes — whisper.cpp is now packaged officially for Debian (currently in sid), providing the whisper.cpp binary plus libwhisper-dev and libwhisper1 for linking against it as a shared library. It hasn't reached stable Debian releases or Ubuntu's default repos yet, so on most systems you'll still need to add sid or build from source. An unofficial Snap (sudo snap install whisper-cpp) is also available for Debian 9+ and Ubuntu if you don't want to build from source or pull from sid.

How do I check which version of whisper.cpp I have installed?

Run the compiled binary with no arguments or --help — the version is printed in the banner line. You can also check the exact commit with git describe --tags inside the cloned repository, or compare your build date against the release notes at github.com/ggml-org/whisper.cpp/releases to see if you're behind the current v1.9.5.

Is the transcription accuracy the same between whisper.cpp and faster-whisper?

Yes. Both tools use the same OpenAI Whisper model weights — the model itself is identical. The difference is only in the inference runtime (C/C++ vs CTranslate2 Python). WER on the same audio file will be within 0.1% absolute of each other, which is within normal variation from beam search randomness.

Can I use faster-whisper on a Mac with Apple Silicon?

Yes, but it runs CPU-only — faster-whisper has no Metal support. On an M5 Pro, faster-whisper large-v3 runs at ~3× real-time (CPU int8), compared to whisper.cpp's ~10× real-time with Metal. For most Mac users, whisper.cpp is 3× faster for the same model. The only reason to use faster-whisper on Mac is if your Python pipeline already depends on it and speed is not critical.

What Whisper model size should I use for a voice assistant?

For real-time voice interfaces, Whisper small is the standard recommendation — 3.4% WER on clean English, ~200 ms STT latency on a modern CPU or GPU, and fits in 2 GB RAM. Use tiny if you are on very constrained hardware (Raspberry Pi Zero 2W, older phones) and can tolerate ~7.6% WER. Use medium or large-v3 only for batch transcription where latency is not a constraint.

Does whisper.cpp support languages other than English?

Yes. All Whisper multilingual models (base, small, medium, large-v3) support 99 languages. Add `-l [language code] to the CLI: -l de for German, -l fr for French, -l ja` for Japanese, etc. The tiny.en and base.en models are English-only and slightly more accurate for English than their multilingual equivalents.

How do I install faster-whisper with CUDA support?

Install with pip install faster-whisper. Current releases need NVIDIA cuBLAS for CUDA 12 and cuDNN 9 on your system (on Linux, pip install nvidia-cublas-cu12 "nvidia-cudnn-cu12==9.*" provides them). On older CUDA 11 / cuDNN 8 setups, pin ctranslate2==3.24.0 (or 4.4.0 for CUDA 12 with cuDNN 8). Then specify device="cuda" when loading the model: WhisperModel("large-v3", device="cuda", compute_type="int8"). Use device="auto" if you want it to fall back to CPU when CUDA is not available.

Which is more accurate — whisper.cpp or faster-whisper?

Identical. Both tools use the same OpenAI Whisper model weights and produce the same WER on any given audio file. The difference between whisper.cpp and faster-whisper is speed and platform support, not transcription accuracy. Any WER difference you measure between runs is within normal variation from beam search, not from the runtime itself.

Can I run Whisper large-v3 on 8 GB RAM?

Yes on GPU — large-v3 int8 in faster-whisper uses ~2.5 GB VRAM and runs on any 8 GB GPU. On CPU-only hardware, 8 GB RAM is tight for large-v3 (float32 uses ~10 GB). Use medium (5 GB RAM) or small (2 GB RAM) on CPU-only systems. whisper.cpp is more memory-efficient on CPU than faster-whisper due to lower runtime overhead.

How much does local Whisper cost vs cloud STT?

Zero ongoing cost. Cloud STT services charge $0.006–$0.024 per audio minute — for a developer transcribing 8 hours of meetings per week, that's $120–480/month. Local Whisper runs on hardware you already own, with no per-minute fees, no API key management, and no audio data leaving your machine.

Does faster-whisper int8 work on a GTX 970?

No — not as real int8. The GTX 970 has compute capability 5.2, and CTranslate2 runs int8 only on GPUs with compute capability 7.0 or higher (or exactly 6.1); on older cards it converts the weights to float32 automatically. faster-whisper still runs on the GPU in float32, so use tiny, base or small to stay inside 4 GB, or run CPU int8, which works on any modern x86 CPU. We have not benchmarked a GTX 970, so there is no measured speed figure here.

How big are the Whisper model files for whisper.cpp and faster-whisper?

whisper.cpp's README lists GGML model files of about 75 MiB (tiny), 142 MiB (base), 466 MiB (small), 1.5 GiB (medium) and 2.9 GiB (large) on disk, needing roughly 273 MB, 388 MB, 852 MB, 2.1 GB and 3.9 GB of memory. faster-whisper downloads CTranslate2 models from Hugging Face on first use; large-v3 is about 3 GB there (1.55B parameters at 2 bytes each in float16). The model-size table above lists parameter counts for every size.

Is Whisper large-v3-turbo better than large-v3 for local transcription?

It is faster, not more accurate. large-v3-turbo has 809M parameters because OpenAI cut the decoder from 32 layers to 4, and its model card describes it as much faster than large-v3 at the expense of a minor quality degradation, under the MIT license. The card also warns that it can hallucinate or repeat text and that accuracy varies across languages, so keep large-v3 for the hardest audio and use turbo (or distil-large-v3 for English) when speed matters. Both whisper.cpp and faster-whisper can run it.

Can whisper.cpp use an AMD or Intel GPU instead of CUDA?

Yes. whisper.cpp's Vulkan backend (-DGGML_VULKAN=1) works across vendors as long as your driver supports the Vulkan API, ROCm/HIP (-DGGML_HIP=1) targets AMD GPUs, and OpenVINO accelerates the encoder on Intel CPUs and GPUs. faster-whisper's own documentation covers NVIDIA CUDA only; CTranslate2's release notes mention ROCm wheels, but we have not tested that path.

Is mlx-whisper faster than whisper.cpp on a Mac?

One independent test says yes for large-v3-turbo: Bill Mill's January 2026 rerun measured mlx_whisper at about 13.1 seconds against 26.7 seconds for whisper.cpp on the same long recording, roughly 2× faster. A community speed test on a short clip put the two close, with whisper.cpp using Core ML and q5_0 quantization. The M5 Pro figures in this guide were not compared against MLX, so benchmark your own audio before choosing.

Sources

← Back to Power Local LLM

MCP