When I started building TAWK, a macOS menu bar app that converts voice to text, the first real architectural decision I had to make was how to handle speech recognition. The two paths were clear: send audio to a cloud API and get back a transcript, or run a model locally on the user's machine and never let the audio leave the device. I chose local. Specifically, I chose OpenAI's Whisper model running on device. It was the best decision I made on the project, by a wide margin.

I prototyped both approaches, benchmarked them, and shipped one. Here is exactly what I found, why I made the choice I did, and what I would tell anyone facing the same decision today.

The Contenders

When I evaluated speech to text options in early 2025, the serious contenders were:

  • Google Cloud Speech to Text: the industry standard, mature API, excellent language support, real time streaming capability
  • AWS Transcribe: Amazon's offering, strong enterprise features, good accuracy, pay per second pricing
  • OpenAI Whisper API: OpenAI's own hosted version of Whisper, simple API, competitive pricing
  • OpenAI Whisper (local): the open source model running entirely on the user's machine, no network required

I tested all four. I recorded 50 audio clips ranging from 5 seconds to 2 minutes, covering different speaking speeds, accents, and background noise levels. Then I ran each one through every service and compared accuracy, latency, and the overall developer experience.

Accuracy: Closer Than You Would Expect

The first surprise was accuracy. I expected cloud APIs to lead clearly because they have access to massive compute and continuously updated models. And for some edge cases, they did. Google Cloud Speech handled heavy background noise noticeably better, and AWS Transcribe was slightly more reliable with uncommon proper nouns.

But for the core use case of TAWK, a single speaker dictating text in a reasonably quiet environment, the Whisper small model was very competitive. On clean English audio, I measured a word error rate of roughly 6% with Whisper small, compared to about 4 to 5% for Google Cloud Speech and 5% for the OpenAI Whisper API (which uses a larger model). AWS Transcribe landed around 5% as well.

A 1 to 2% difference in word error rate sounds like it matters, and in some applications it does. But for dictation on a desktop app, the user is right there. They can see the text as it appears and make quick corrections. The accuracy gap between local Whisper and the best cloud API was not large enough to justify the tradeoffs that come with cloud.

Latency: Where Local Clearly Wins

This is where on device transcription pulled well ahead. With a cloud API, the audio processing pipeline looks like this: record audio, compress it, send it over the network, wait for the server to process it, receive the response, parse it, and display the text. Even on a fast connection, that round trip adds 500 to 1500 milliseconds of latency for a short clip. On a slow or congested network, it can be 2 to 3 seconds.

With Whisper running locally on an Apple Silicon Mac, the pipeline is: record audio, feed it directly to the model, get the text back. On my M1 MacBook Pro, a 10 second audio clip processed in about 1.5 seconds. A 30 second clip took roughly 4 seconds. There is no network round trip, compression overhead or server queue. The model has direct access to the audio buffer in memory.

The latency difference between local and cloud is best described as the gap between an app that feels instant and one that feels like it is thinking.

For a dictation tool, perceived speed matters a great deal. When you stop speaking and expect to see text, every additional second of waiting erodes trust in the tool. Users care about the text appearing, not about how fast your server is. Local processing gave TAWK a responsiveness that no cloud API could match, regardless of how fast their servers were.

Privacy: The Fixed Requirement

TAWK is a voice to text tool. People use it to dictate emails, write documents, compose messages. That audio contains sensitive information: business conversations, personal thoughts, passwords spoken aloud, private medical details mentioned in dictation. Sending all of that to a third party server was something I was not willing to do.

With cloud APIs, every word the user speaks is sent to Google, Amazon, or OpenAI's servers. These companies have privacy policies, and the data is encrypted in transit, but the audio still leaves the user's device and enters someone else's infrastructure. For a developer tool that people integrate into their daily workflow, that is a significant ask.

With Whisper running locally, the audio never leaves the Mac. It is recorded, processed, and discarded entirely on the user's machine. There is no network request, no server log, no data retention policy to worry about. The privacy guarantee rests on the architecture rather than on a company's promises, because the data never goes anywhere.

This turned out to be one of TAWK's strongest selling points. Users who would never use a cloud based dictation tool are comfortable with TAWK because they can verify the privacy claim themselves. There are no outbound network connections during transcription. That gives a level of trust a privacy policy cannot.

Cost: Zero Marginal Cost Per Transcription

Cloud speech APIs charge per minute of audio processed. Google Cloud Speech to Text costs approximately $0.006 per 15 seconds. AWS Transcribe charges about $0.024 per minute. The OpenAI Whisper API charges $0.006 per minute. These costs seem small individually, but they compound.

A power user who dictates 30 minutes of audio per day would cost roughly $0.18 per day with Google, $0.72 per day with AWS, or $0.18 per day with OpenAI's API. Over a month, that is $5.40 to $21.60 per user. Over a year, $65 to $260 per user. For a one time purchase app at $59, that math still does not work. A single heavy user can burn the entire price in cloud fees inside a year.

With local Whisper, the cost per transcription is zero. The model runs on the user's own hardware. There is no API key, no billing account, no usage limits. I do not have to worry about a popular user costing me money or about implementing usage caps that degrade the experience. The business model is clean: the user pays once, and the software works forever.

Reliability: Works Without Internet

Cloud APIs require an internet connection. That is obvious, but the implications are subtle. It means your app is only as reliable as the user's network. It means transcription fails on airplanes, in basements, in rural areas, and during the brief moments when Wi-Fi drops between access points.

Whisper running locally needs no network at all. Once the model is loaded into memory, it works everywhere. I have used TAWK on flights, in coffee shops with terrible Wi-Fi, and in my office when the internet went down for maintenance. It worked every time.

There is also the reliability of the service itself. Cloud APIs have outages. Google Cloud had multiple Speech to Text incidents in the past year. AWS Transcribe has had degraded performance windows. When your core feature depends on someone else's uptime, you inherit their reliability problems. With local inference, the only thing that needs to work is the user's Mac. That is a much simpler reliability equation.

The Tradeoffs: What You Give Up

Local inference is not strictly better. There are real tradeoffs, and you need to understand them before choosing this path.

App Size

The Whisper small model adds approximately 461 MB to the application bundle. That is significant. TAWK's total app size is around 500 MB, and the vast majority of that is the model weights. A cloud API version of the same app would be under 20 MB. For distribution, this means longer downloads and more disk space. I mitigated this by using the small model rather than medium or large, which was the right accuracy and size tradeoff for dictation.

Initial Load Time

When TAWK launches, it needs to load the Whisper model into memory. On an M1 Mac, this takes 3 to 5 seconds. On older Intel Macs, it can take 8 to 10 seconds. This is a cold start penalty that cloud APIs do not have. I addressed this by loading the model at app launch (since TAWK runs as a menu bar app, it starts with the system) and showing a brief loading indicator. Most users never notice because the model is ready by the time they first trigger dictation.

No Real Time Streaming

This was the biggest functional tradeoff. Cloud APIs like Google Cloud Speech offer real time streaming transcription, so you see words appearing as you speak. Whisper processes audio in batches. You record a chunk, then Whisper transcribes the whole chunk at once. For TAWK, this means you speak, stop, and then the text appears. It is not a live transcription experience.

For some applications, this is a dealbreaker. Live captioning, real time subtitles, and voice assistants that need to respond mid sentence all require streaming. But for dictation (speak a thought, see it as text), batch processing works well. Users quickly develop a natural rhythm of speaking in short bursts and pausing, which aligns well with Whisper's batch model.

Hardware Requirements

Running inference on device means the user's hardware matters. The Whisper small model runs comfortably on any Apple Silicon Mac, but older Intel Macs with limited RAM can struggle. I had to set minimum system requirements and accept that some older machines would not provide a good experience. Cloud APIs offload this entirely: even a ten year old laptop can send audio to a server.

PyInstaller, Signing, and the Bundling Reality

Choosing local Whisper also meant dealing with the practical challenges of bundling a machine learning model inside a macOS app. TAWK is built with Python, packaged with PyInstaller, and distributed as a signed and notarized .app bundle. Getting Whisper to work inside that pipeline was nontrivial.

PyInstaller does not automatically bundle Whisper's asset files, such as mel_filters.npz and the model weights. I had to explicitly add these to the datas list in the spec file. Then came code signing: macOS requires every Mach-O binary inside an app to be individually signed. Whisper's dependencies (PyTorch, NumPy, and their compiled extensions) include dozens of .so and .dylib files, plus standalone executables. Each one needs to be signed individually. The --deep flag for codesign is tempting but unreliable for notarization, so I had to sign everything from the inside out.

Apple's notarization process also has quirks with large ML apps. The upload can take a while due to the model size, and I have seen notarization get stuck "In Progress" for extended periods with PyTorch heavy bundles. These are solvable problems, but they add real development time that you would not face with a lightweight cloud API client.

The Verdict: Local Was the Right Choice

For TAWK's specific use case, a desktop dictation tool sold as a one time purchase, local Whisper was the right choice by a wide margin. The privacy guarantee, zero marginal cost, offline reliability, and low latency matched what the product needed to be. The tradeoffs (app size, cold start, no streaming) were manageable or irrelevant for the use case.

This is not a universal recommendation. If I were building a real time transcription service, a voice assistant, or a mobile app where storage is constrained, I would likely choose a cloud API. The right answer depends on your use case, your business model, and your users' expectations.

What I do recommend universally is prototyping both approaches before committing. I spent two days benchmarking cloud APIs against local Whisper with real audio samples. That investment saved me from making assumptions and gave me hard data to base the decision on. Whatever you are building, test with your actual audio, your actual hardware, and your actual network conditions. The benchmarks that matter are your own, rather than someone else's blog post, including this one.

Frequently Asked Questions

Is Whisper better than Google Speech to Text?
It depends on the use case. For batch transcription of prerecorded audio, Whisper delivers accuracy comparable to Google Cloud Speech to Text, especially with the medium and large models. Whisper excels in privacy sensitive applications and offline scenarios since everything runs locally. However, Google Speech to Text is superior for real time streaming, supports more languages out of the box, and handles noisy environments better with its cloud scale models. For TAWK, a desktop voice to text app, Whisper's local processing was the better choice because of privacy, zero per minute costs, and no internet dependency.
Can Whisper run offline on a Mac?
Yes. OpenAI's Whisper model runs entirely offline on macOS once the model weights are downloaded. The small model (approximately 461 MB) works well on Apple Silicon Macs with fast inference times. TAWK uses the Whisper small model for fully offline voice to text transcription. The model loads into memory at launch and processes audio locally without any network connection, making it reliable even in airplane mode or areas with poor connectivity.
What are the pros and cons of local vs cloud speech recognition?
Local speech recognition (like Whisper) offers complete privacy since audio never leaves the device, zero ongoing costs per transcription, no internet dependency, and lower end to end latency for short recordings. The downsides include larger app size due to bundled model weights, initial model load time, higher CPU and memory usage on the device, and no real time streaming capability. Cloud APIs offer real time streaming, lower device resource usage, continuous model improvements without app updates, and better handling of diverse accents and noisy audio. However, they come with per minute pricing, require internet connectivity, introduce network latency, and raise privacy concerns since audio is sent to third party servers.
How accurate is Whisper compared to cloud APIs?
Whisper's accuracy is competitive with major cloud APIs for most common use cases. The Whisper small model achieves a word error rate of roughly 5 to 8% on clean English audio, while the large model approaches 3 to 4% WER. Google Cloud Speech to Text and AWS Transcribe typically achieve 4 to 6% WER on similar benchmarks. In practice, accuracy differences are marginal for clear, single speaker dictation. Cloud APIs tend to perform better with heavy background noise, multiple speakers, and uncommon accents due to their larger training datasets and continuous model updates. For a desktop dictation app like TAWK, Whisper's accuracy on the small model is more than sufficient for reliable voice to text input.