whisper.cpp: A C/C++ Whisper Port That Runs Offline on Nearly Anything
whisper.cpp is a dependency-free C/C++ port of OpenAI's Whisper speech-recognition model, optimized for Apple Silicon and supporting CPU-only inference on many platforms.
At a glance
- What is it?
- whisper.cpp brings OpenAI's Whisper speech recognition to plain C/C++ with no runtime dependencies, targeting Apple Silicon, x86, POWER, and even NPUs. The trade-off is a custom ggml model format and a CLI that only accepts 16-bit WAV input.
- Who is it for?
- Adopt whisper.cpp if you need offline, on-device speech recognition on Apple Silicon, embedded Linux, or WebAssembly, and you can live with the ggml model format and WAV-only CLI. Skip it if you want a Python-native workflow or need to transcribe compressed audio directly.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly C++, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What whisper.cpp solves and who it is for
whisper.cpp is a from-scratch C/C++ implementation of OpenAI's Whisper automatic speech recognition model. The problem it solves is that the original Python implementation is heavy, requires a Python runtime and PyTorch, and is awkward to embed in mobile apps or edge devices. This port removes those dependencies: the README claims a plain C/C++ implementation without dependencies, with the entire high-level model logic in whisper.h and whisper.cpp. The target user is an engineer who wants speech-to-text on an iPhone, a Raspberry Pi, a browser via WebAssembly, or a server with no Python stack. The project also supports Apple Silicon as a first-class citizen, with ARM NEON, Accelerate, Metal, and Core ML paths. That makes it a natural fit for macOS and iOS apps that need offline transcription.
The architecture: ggml underneath, a thin C API on top
The design is two layers. On top sits whisper.h and whisper.cpp, which the README calls the entire high-level implementation of the model. Below that is the ggml machine learning library, which handles tensor operations and hardware backends. The separation matters: you can swap the backend (CPU, Metal, Vulkan, ROCm, OpenVINO) without touching the Whisper-specific code. The C-style API in whisper.h is the integration point for bindings; the repository lists Java, iOS, Android, and WebAssembly bindings, so the API is stable enough to wrap. The model itself is not the original PyTorch checkpoint. It must be converted to a custom ggml format, which is a concrete constraint: you cannot point whisper.cpp at an official OpenAI model file. The conversion step is part of the workflow, and the download script fetchs pre-converted models.
Getting it running: clone, download a model, build, transcribe
The quick start is straightforward. Clone the repository, then download a converted model with a shell script: sh ./models/download-ggml-model.sh base.en. Then build with CMake: cmake -B build and cmake --build build -j --config Release. The resulting binary is ./build/bin/whisper-cli, and you transcribe a file with -f samples/jfk.wav. There is also a make base.en target that downloads the model and runs inference on all WAV samples in the samples folder. The README is explicit about a limitation: the CLI currently runs only with 16-bit WAV files. You must convert audio first, and the given example uses ffmpeg: ffmpeg -i input.mp3 -ar 16000 -ac 1 -c:a pcm_s16le output.wav. That is a real friction point: no MP3 or FLAC input, no resampling inside the tool. For a quick demo, make base.en is the fastest path, but for production you will need to handle audio conversion in your pipeline.
Quantization and memory: the trade-off you must measure
The project supports integer quantization of ggml models. The README gives a concrete example: ./build/bin/quantize models/ggml-base.en.bin models/ggml-base.en-q5_0.bin q5_0, then run whisper-cli with the -m flag to use the quantized file. Quantized models use less disk and memory, and on some hardware they process faster. The README does not quantify accuracy loss, so this is a place where the documentation is thin. You cannot assume Q5_0 is as accurate as the original; you must test on your own audio. The memory table lists disk and RAM for each model: tiny uses about 273 MB, base about 388 MB, small about 852 MB, medium about 2.1 GB, and large about 3.9 GB. Those are the numbers to check against your target device. A Raspberry Pi with 1 GB RAM can run tiny or base, but not small. The zero memory allocations at runtime claim is notable for embedded use, but it only applies after initialization, so do not read it as a low peak-memory guarantee.
Hardware backends: Apple Silicon is the star, but the list is long
The README lists a broad set of backends: ARM NEON, Accelerate, Metal, Core ML, AVX for x86, VSX for POWER, Vulkan, NVIDIA GPU, AMD ROCm, AMD Ryzen AI NPU, OpenVINO, Ascend NPU, and Moore Threads GPU. That is an unusual spread. Apple Silicon gets special attention: on-device GPU inference via Metal, and Core ML can run the encoder on the Apple Neural Engine, with the README claiming more than x3 speed-up over CPU-only. The POWER VSX section is specific: on Linux on POWER9/10, with a BLAS package installed, you build with cmake -B build -DGGML_BLAS=1, and the README says it can transcribe faster than realtime on an underclocked Raptor Talos II. For NVIDIA, AMD, and the NPUs, the README points to sections that are truncated, so I cannot detail those setup steps. The practical takeaway is that whisper.cpp is not a single binary; it is a family of builds, and you must pick the backend that matches your hardware. That is both a strength and a maintenance burden.
Core ML support: a concrete path to faster Apple Silicon inference
The Core ML path is the most documented backend beyond CPU. The idea is to run the encoder on the Apple Neural Engine via Core ML, which the README says can be more than x3 faster than CPU-only execution. The setup requires Python: pip install ane_transformers, openai-whisper, and coremltools. You also need Xcode command-line tools (xcode-select --install). The README recommends Python 3.11 and macOS Sonoma or newer, because older macOS versions might have issues with transcription hallucination. That last point is a warning about model behavior, not just build issues. The workflow is to generate a Core ML model from the original Whisper, then use it with whisper.cpp. This adds a Python dependency to the build process, even though the runtime is dependency-free. If you are on Apple Silicon and need speed, this is the path to take, but it is not a one-command setup.
Limitations and failure modes you should know before adopting
The biggest limitation is the input format: the CLI only accepts 16-bit WAV files. That means every audio source must be preprocessed, and the README's ffmpeg example is the only supported path. If your application streams audio, you need to handle conversion in real time, which the project does not provide. The second limitation is the model format: you must use ggml-converted models, not the official OpenAI checkpoints. That adds a conversion or download step and ties you to the project's model repository. The README also mentions that older macOS versions might experience transcription hallucination with Core ML, which is a quality risk. The memory table shows large needs about 3.9 GB RAM, so running the largest model on a typical laptop is fine, but on a phone you are limited to tiny or base. The project is not a drop-in replacement for the Python Whisper; it is a reimplementation with its own quirks.
Alternatives and how they differ
The obvious alternative is OpenAI's original Whisper Python package. That runs on PyTorch, accepts any audio format that ffmpeg can read, and gives you the full model with no conversion step. The trade-off is a heavy runtime: you need Python, PyTorch, and a GPU if you want reasonable speed. whisper.cpp trades that convenience for a dependency-free binary that runs on embedded devices and browsers. Another alternative is faster-whisper, a CTranslate2-based reimplementation that is also faster than the original and supports integer quantization, but it still requires a Python or C++ runtime and does not target mobile or WebAssembly as directly. The key difference in approach is that whisper.cpp is built on ggml, a custom tensor library designed for portability, while faster-whisper uses CTranslate2, which is tuned for transformer inference on CPU and GPU. If your goal is a mobile app or a Raspberry Pi, whisper.cpp is the better fit; if you are on a server with Python already, faster-whisper might be easier to integrate.
Maintenance and licensing
The repository is under the MIT license, which is permissive and allows commercial use with attribution. The project is actively maintained: the last push was 2026-08-20, with releases v1.9.3 and b4938 on the same day. The release cadence is frequent, which is good for bug fixes but also means you should track upstream changes. The dependency on ggml is a maintenance consideration: ggml is a separate project, and whisper.cpp's behavior can change when ggml updates its backend code. Upgrading whisper.cpp may require re-testing on all your target backends, especially if you use Vulkan or ROCm, because those paths are hardware-specific. The build system is CMake, which is standard, and the README gives no upgrade guide, so plan to read release notes. The Core ML generation step depends on Python packages, which adds a maintenance burden if you need to regenerate models. Overall, the license is friendly, and the maintenance activity is high, but the multi-backend complexity means you should not adopt it without a CI setup that builds for your specific platforms.
Editorial conclusion
Adopt whisper.cpp if you need offline, on-device speech recognition on Apple Silicon, embedded Linux, or WebAssembly, and you can live with the ggml model format and WAV-only CLI. Skip it if you want a Python-native workflow or need to transcribe compressed audio directly. Before committing, verify that your target platform has a supported backend (Metal, Vulkan, ROCm, OpenVINO, etc.) and that the model you plan to use fits your memory budget; the README's memory table shows large requiring about 3.9 GB RAM. Also confirm that the quantized model accuracy is acceptable for your use case, since the project offers Q5_0 but does not document quality degradation.
Community notes