Verified July 2026

whisper.cpp — C/C++ Port of OpenAI Whisper for CPU, Mobile & Edge

whisper.cpp is Georgi Gerganov's plain C/C++ port of OpenAI Whisper. Same model weights, radically different runtime: no Python, no CUDA, no PyTorch. Runs on CPU, Apple Silicon (Metal + CoreML), iOS, Android, Raspberry Pi.

Key takeaways

  • Same Whisper, no Python. Same model weights as OpenAI Whisper, reimplemented in C/C++ with GGML/GGUF quantized weights. No Python interpreter, no PyTorch, no CUDA runtime.
  • Runs on CPU, Apple Silicon, iOS, Android, Raspberry Pi. Metal + CoreML acceleration on Macs and iPhones. SIMD instructions on x86/ARM CPUs. No GPU required.
  • Single-binary deployment. One executable file, plus one model file (base.en is 150 MB, large-v3 quantized is 1.6 GB). Ships as easily as any command-line tool.
  • Full accuracy at F16. Identical transcription quality to OpenAI Whisper reference. Q5_1 quantization loses less than 1% WER; Q4_0 loses 2-4%.
  • 60-80% of GPU speed on Apple Silicon. M2 Pro with CoreML processes large-v3 at 5-7x real-time. Close to CUDA GPU experience without CUDA setup.
  • Transcription only. No built-in speaker diarization, no word-level forced alignment. Pair with pyannote.audio or a lightweight alternative if you need speaker labels.

What is whisper.cpp?

whisper.cpp is a plain C/C++ reimplementation of OpenAI Whisper's inference stack, created by Georgi Gerganov in October 2022. It uses the GGML/GGUF tensor format (the same format later adopted by llama.cpp for LLM inference) to store quantized Whisper model weights, and runs the Whisper transformer forward pass without any Python, PyTorch, or CUDA dependency.

The project's purpose is deployment reach. Vanilla OpenAI Whisper requires a full Python environment plus a CUDA-enabled GPU with 10+ GB VRAM for the large-v3 model — impractical for most laptops, all mobile devices, edge deployments, and single-binary CLI tools. whisper.cpp fills that gap: same model quality, ships as a compiled executable, runs on whatever hardware you have.

Common deployment targets: macOS/Linux/Windows CLIs, iOS and Android apps, Raspberry Pi for offline transcription boxes, embedded devices with tight memory budgets, and any environment where installing PyTorch would be disproportionate to the task.

whisper.cpp vs vanilla Whisper

Same weights, different everything else.

AspectOpenAI Whisper (reference)whisper.cpp
LanguagePython + PyTorchC/C++
Runtime dependenciesPython 3.9+, PyTorch, FFmpegNone (self-contained binary)
GPU requirementCUDA (10 GB VRAM for large-v3)None; CPU + optional Metal/CoreML on Apple
Memory footprintLarge — Python VM + PyTorch + weightsSmall — 200 MB to 6 GB depending on model
Weight format.pt PyTorch checkpoints (F16).bin GGML/GGUF (F16, F32, or quantized Q4/Q5/Q8)
Deploys asPython package in a venvCompiled executable
Mobile supportEffectively noYes — iOS and Android via NDK
Transcription accuracyReferenceIdentical at F16; ±1-4% at quantized levels
Speaker diarizationNo (add pyannote separately)No (add pyannote separately)

Install and run

Clone the repo, build, download a model, run. Total time on Mac/Linux: 2-5 minutes.

# 1. Clone and build
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp
make -j

# 2. Download a model (choose one)
bash ./models/download-ggml-model.sh base.en       # 150 MB, practical default
bash ./models/download-ggml-model.sh large-v3      # 3 GB, accuracy tier
bash ./models/download-ggml-model.sh large-v3-q5_1 # 1.6 GB, quantized

# 3. Convert audio to 16 kHz mono WAV if needed
ffmpeg -i input.mp3 -ar 16000 -ac 1 -c:a pcm_s16le audio.wav

# 4. Transcribe
./main -m models/ggml-base.en.bin -f audio.wav

# 5. With SRT output
./main -m models/ggml-large-v3.bin -f audio.wav -osrt

# 6. Word-level timestamps
./main -m models/ggml-large-v3.bin -f audio.wav -ml 1 -oj

Windows: use CMake — cmake -B build && cmake --build build --config Release. Mac with Apple Silicon: enable Metal — WHISPER_METAL=1 make -j. CUDA on Linux: yes, also supported — WHISPER_CUDA=1 make -j.

Model choice + quantization

Model size drives every other constraint: memory, speed, accuracy. Practical guidance for common deployment scenarios:

ModelSizeRAM neededSpeed (real-time)WERBest for
tiny.en75 MB (F16)~200 MB10-30x~10% (vs large baseline)Real-time on-device, iPhone/Android, quick previews
base.en150 MB (F16)~500 MB8-15x~7%Practical default for laptops and modern phones
small.en500 MB (F16)~1 GB4-8x~5%Rarely the right choice — pick base or medium instead
medium.en1.5 GB (F16)~2 GB2-4x~3%Laptop offline transcription with strong accuracy
large-v3 (Q5_1)1.6 GB quantized~3 GB5-7x on M2 Pro w/CoreMLReferenceAccuracy tier — Apple Silicon Macs, workstation CPUs
large-v3 (F16)3 GB~6 GB3-5x on M2 Pro w/CoreMLReferenceAccuracy-critical, memory not a constraint

Quantization levels: F16 is the reference precision. Q5_1 typically loses less than 1% WER vs F16 while using ~40% less memory — the practical sweet spot for most desktop and laptop deployments. Q4_0 loses 2-4% WER but drops memory by 60%+ — worth it on mobile and Raspberry Pi. Q8_0 sits between F16 and Q5_1 with almost no accuracy loss but modest memory savings.

CoreML on Apple Silicon

On Apple Silicon (M1/M2/M3/M4, plus A-series in iPhones and iPads), whisper.cpp can offload the transformer encoder pass to the Apple Neural Engine (ANE) via CoreML. The decoder still runs on CPU/Metal, but the encoder — which dominates inference time — gets a 2-3x speedup.

# Build with CoreML support
WHISPER_COREML=1 make -j

# Generate CoreML model from GGML weights
./models/generate-coreml-model.sh large-v3

# The models directory now has both:
# - ggml-large-v3.bin (weights for decoder)
# - ggml-large-v3-encoder.mlmodelc (CoreML encoder for ANE)

# Run — whisper.cpp uses both automatically
./main -m models/ggml-large-v3.bin -f audio.wav

This is the fastest path to Whisper Large-v3 transcription on a Mac laptop without a discrete GPU. On an M2 Pro with CoreML, large-v3 processes at roughly 5-7x real-time — close to what a modest CUDA GPU delivers.

iOS and Android deployment

whisper.cpp compiles for both iOS (device and simulator) and Android (via the NDK). The repo includes example apps demonstrating real-time on-device transcription on modern iPhones and Android devices.

Model choice for mobile: tiny.en (75 MB) and base.en (150 MB) run smoothly on-device. medium and large models are typically too memory-intensive for mobile RAM budgets — you can fit them, but the OS will kill your app under memory pressure. For production apps, the common pattern is: ship tiny.en or base.en for real-time transcription, plus a fallback to a cloud endpoint for longer or accuracy-critical files.

Battery impact: continuous Whisper inference on-device is CPU/ANE-intensive. Expect 15-30% battery drain per hour of continuous transcription on a modern iPhone. Design accordingly — most apps trigger transcription on-demand or run it in short bursts rather than continuously.

CPU vs GPU benchmarks

Rough numbers from community benchmarks and internal testing (July 2026). All times assume a 60-minute audio file:

HardwareModelSpeed vs real-timeNotes
Apple M2 Pro (10-core CPU) + Metal + CoreMLlarge-v3 Q5_15-7x real-time60-min audio → 8-12 min. Closest to CUDA GPU experience.
Apple M1 (8-core) + Metal + CoreMLmedium.en4-6x real-time60-min audio → 10-15 min.
x86 CPU (Ryzen 7 5800X / i7-12700K)large-v3 Q5_11.5-2.5x real-time60-min audio → 25-40 min.
x86 CPU same hardwarebase.en10-20x real-time60-min audio → 3-6 min.
iPhone 15 Pro (A17 Pro)base.enNear real-timeLive transcription possible on modern iPhones.
Raspberry Pi 5 (8 GB)tiny.en1-2x real-timePractical only for base or tiny models.
NVIDIA A100 (PyTorch Whisper reference)large-v3 F1610-15x real-timeFor comparison — 60-min audio → 4-6 min. GPU baseline.

Numbers vary with audio quality, model quantization, and library version. Benchmark on your specific hardware before committing to whisper.cpp for production workloads.

whisper.cpp vs faster-whisper and WhisperX

Three different optimization strategies for the same Whisper models.

ToolLanguageDependenciesHardwareBest for
whisper.cpp (this page)C/C++None (single binary)CPU, Apple Silicon (Metal/CoreML), no CUDA requiredOn-device (mobile, edge, laptop), zero Python, single-binary deployment
OpenAI Whisper (reference)Python + PyTorchPython 3.9+, PyTorch, FFmpegCUDA GPU (10 GB VRAM for large-v3)Research, reference implementation, PyTorch pipelines
faster-whisperPython + CTranslate2Python 3.9+, CTranslate2, CUDA runtimeCUDA GPU (6-10 GB VRAM)GPU-based production, 2-4x faster than reference Whisper
WhisperXPythonPython + faster-whisper + pyannote + wav2vec2CUDA GPU + Hugging Face tokenWord-level timestamps + built-in diarization

Rule of thumb: use whisper.cpp when you need to ship to environments without Python/CUDA (mobile, edge, single-binary CLI). Use faster-whisper when you have GPU infrastructure and want maximum throughput. Use WhisperX when you need built-in diarization + word-level alignment and are already in Python.

The diarization gap

whisper.cpp handles transcription only. No built-in speaker labeling. If your use case needs “who said what” — meeting transcripts, interviews, podcasts — you'll need to layer a diarization library on top.

The common pattern: run whisper.cpp for the transcript with timestamps, run pyannote.audio 3.1 separately for speaker turns, merge the outputs by matching timestamps. This is the same pipeline that WhisperX bundles automatically — but if you're on whisper.cpp specifically to avoid Python, adding pyannote (which is Python-based) defeats the purpose. Alternatives:

  • sherpa-onnx / NeMo diarization — ONNX-based or C++-friendly diarization pipelines. Less accurate than pyannote but no Python dependency.
  • Custom clustering — for known speaker counts, run whisper.cpp then cluster speaker embeddings from a small C-callable library (e.g., wespeaker exported to ONNX).
  • Hosted service — offload diarization to a cloud API and keep whisper.cpp for local transcription only.

For most single-speaker use cases (voice memos, dictation, monologue transcription), the diarization gap doesn't matter. For multi-speaker workflows, plan for a diarization step from day one.

When to use a hosted service instead

whisper.cpp is the right choice for self-hosted, on-device, or edge deployments. It's not the right choice when:

  • You need speaker diarization out of the box without assembling a pipeline
  • You need 99 languages with translation to 133 without managing weights and post-processing
  • You need bulk transcription of long files where CPU inference times add up
  • You need SRT/VTT export ready for YouTube Studio without writing your own subtitle formatter
  • The MLOps overhead — model updates, quantization tuning, benchmark maintenance — exceeds the value of self-hosting

VexaScribe runs Whisper Large-v3 + pyannote as a hosted service — same model quality as whisper.cpp at F16, with diarization, translation, and multi-format export bundled. 30 minutes free at signup. For most creator, corporate, and research workflows, hosted is faster to production. Self-host with whisper.cpp when the deployment constraints (offline, on-device, air-gapped, edge) require it.

Frequently asked questions

What is whisper.cpp?

whisper.cpp is a C/C++ port of OpenAI's Whisper automatic speech recognition model, originally created by Georgi Gerganov (also creator of llama.cpp) in October 2022. It reimplements the Whisper inference stack in plain C/C++ with GGML/GGUF quantized weights, targeting environments where a full PyTorch + CUDA installation isn't practical: laptops without GPUs, mobile phones (iOS/Android), Raspberry Pi, edge devices, and single-binary CLI deployments. Same Whisper models (tiny through large-v3), no Python, no CUDA runtime required.

How is whisper.cpp different from OpenAI Whisper?

Same model weights, radically different runtime. OpenAI Whisper is a PyTorch reference implementation that requires Python, PyTorch, and typically a CUDA GPU. whisper.cpp is a C/C++ implementation that runs the same weights (converted to GGML/GGUF format) on CPU using SIMD instructions, on Apple Silicon via Metal/CoreML, or on x86/ARM CPUs directly. Advantages: no Python, no CUDA, no virtual environment, ships as a single executable, quantized models run in 200 MB of RAM instead of 10 GB VRAM. Trade-off: significantly slower than GPU inference for long files, and no built-in speaker diarization or word-level forced alignment (add pyannote or WhisperX separately if needed).

How do I install whisper.cpp?

Clone the repo and build. On Mac/Linux: git clone https://github.com/ggerganov/whisper.cpp && cd whisper.cpp && make. On Windows: use the CMake build (cmake -B build && cmake --build build --config Release). Then download a model with ./models/download-ggml-model.sh base.en (or tiny/small/medium/large/large-v3). Run with ./main -m models/ggml-base.en.bin -f your-audio.wav. Total install-to-working time on a typical Mac: 2-5 minutes. No Python environment, no CUDA runtime, no gigabyte-sized dependency install.

How accurate is whisper.cpp vs vanilla Whisper?

Identical accuracy at full precision (F16 or F32 quantization) — same model weights, same inference math. Quantized models (INT8, Q5_1, Q4_0) trade small accuracy losses for smaller memory footprint and faster CPU inference. Q5_1 typically loses less than 1% WER vs F16, Q4_0 loses 2-4%. For most use cases, Q5_1 is the sweet spot: 40% smaller than F16, negligible accuracy impact, runs fast on Apple Silicon and modern x86 CPUs. Use F16 for accuracy-critical applications; use Q4_0 only if memory is the tightest constraint (Raspberry Pi, mobile).

How fast is whisper.cpp on CPU vs GPU Whisper?

CPU inference is meaningfully slower than GPU, but faster than you might expect. On an Apple M2 Pro with Metal acceleration and Q5_1 quantization, whisper.cpp processes a 60-minute audio file with large-v3 in roughly 8-12 minutes — about 5-7x real-time, close to what a modest CUDA GPU delivers. On a modern x86 CPU without acceleration, expect 15-25 minutes for the same file with large-v3, or 3-5 minutes with base.en. For an A100-class GPU with PyTorch Whisper, expect 3-5 minutes on the 60-minute file. The trade-off: whisper.cpp gives you 60-80% of GPU speed on CPU, with 0% of the CUDA setup pain.

Does whisper.cpp support CoreML on Apple Silicon?

Yes. whisper.cpp includes CoreML support that offloads the encoder pass to the Apple Neural Engine (ANE) on M1/M2/M3/M4 Macs, iPhones, and iPads. Building with CoreML enabled: WHISPER_COREML=1 make -j. Then generate the CoreML model from your GGML weights and place both in the models directory. Result: 2-3x speedup on the encoder pass, with the decoder still running on CPU via Metal/SIMD. This is the practical fastest path to real-time (or better) transcription on a Mac laptop without a discrete GPU.

Can I use whisper.cpp on iPhone or Android?

Yes — this is one of the primary use cases. whisper.cpp compiles for iOS (both simulator and device) and Android (via NDK). Example apps in the repo demonstrate real-time on-device transcription on iPhone 12 and newer, and on modern Android devices with Snapdragon 8-series or Apple A-series equivalents. Model choice matters: tiny.en and base.en run smoothly on-device; medium and large models are typically too memory-intensive for mobile RAM budgets. For production mobile apps, teams often ship tiny.en or base.en for real-time transcription plus a fallback to a cloud endpoint (like VexaScribe) for longer files where accuracy matters more than latency.

Which model size should I use with whisper.cpp?

Depends on your latency, accuracy, and memory constraints. tiny.en (75 MB): fastest, real-time on almost anything, ~5-10% worse WER than large. base.en (150 MB): the practical default for laptops and modern phones, 3-6% worse WER than large. small.en (500 MB): rarely the right choice — small only marginally faster than medium at meaningfully worse accuracy. medium.en (1.5 GB): laptop-friendly for offline work, ~2% worse WER than large. large-v3 (3 GB quantized to Q5_1, or 6 GB F16): accuracy-tier for offline transcription on desktops with 8+ GB RAM. On Apple Silicon with CoreML, large-v3 quantized runs in real-time or better.

What's the difference between whisper.cpp and faster-whisper?

Different optimization strategies. faster-whisper is a Python library built on CTranslate2 that runs Whisper 2-4x faster than reference PyTorch on GPU, still requires CUDA and Python. whisper.cpp is a C/C++ implementation that runs on CPU/Metal/CoreML without Python or CUDA. Use faster-whisper if you already have GPU infrastructure and want maximum throughput. Use whisper.cpp if you want to ship on-device (mobile, edge, laptop), avoid Python entirely, or run on CPU. Both preserve accuracy vs reference Whisper. See faster-whisper for the GPU-optimization side of the same problem.

Does whisper.cpp do speaker diarization?

Not natively. whisper.cpp handles transcription only — no built-in diarization, no word-level forced alignment. For speaker labels, run whisper.cpp for the transcript and pyannote.audio 3.1 (or a lightweight diarization library like NeMo Speaker Diarization) separately, then merge the outputs by matching timestamps. This is the same pattern as WhisperX (which bundles pyannote with Whisper) but you assemble it yourself. VexaScribe runs Whisper Large-v3 + pyannote as a hosted service if you'd prefer to skip the pipeline assembly step.

Related guides

Prefer hosted Whisper without the install?

VexaScribe runs Whisper Large-v3 + pyannote diarization + 99 languages + SRT/VTT export as a hosted service. 30 minutes free at signup, no credit card, no install.