Privacy + Local AI

My Mac Has Two Ways to Listen. I Chose the Wrong One.

I sent the same speech recognition workload through my Mac's CPU and Neural Engine. One path was more than three times faster.

A lone traveler stands where a mountain path forks. To the left, a winding stone road climbs into a smoking fortress of gears; to the right, a straight glowing stairway leads to a lit cathedral.

For a long time I didn't think about where my words went after I said them.

I'd talk, and a moment later the text would appear. Usually the moment was short. Sometimes, on a long sentence, it stretched, and I'd catch myself waiting for the screen to catch up. I assumed that was just what dictation felt like.

Part of that delay came down to where the model was running. My Mac has two places it can run a speech model, and for months Yapivo had been sending my voice down the longer road.

Two copies of the same model

One evening I set up a small experiment. I took the speech model Yapivo uses, Parakeet TDT 0.6B v3, and ran two copies of it side by side on my Mac. Same model. Same audio. Every word reached both of them at exactly the same moment.

The difference was where they ran.

One ran on the CPU, the general-purpose processor that runs everything else on the computer: the browser, the music, the window you're reading this in. The other ran through Core ML on the Neural Engine, a smaller part of the same chip that Apple built for the kind of math models like this are made of.

To be precise about it, the two copies aren't byte-for-byte twins. The CPU copy is an int8 export that runs in ONNX Runtime. The other is a Core ML conversion that asks for the CPU and the Neural Engine, and Core ML decides which part runs each operation. I haven't profiled that placement, so I'll call it what it is: Neural Engine-backed.

Then I just talked, and watched.

Recorded benchmark replay: a real run of both paths on an M4 Pro Mac, replayed with the latency of every inference pass. The voice is macOS text-to-speech reading a script. Open “How to read this” for what each part shows.

The same words, at different speeds

Both copies wrote nearly the same thing, sentence after sentence. When one misheard a name, usually the other did too. Nearly isn't identical, though, and I'll come back to that.

What was different was the timing. With 14 of my own recordings fed in at real speed, the live words came back with a median inference latency of 45 milliseconds on the Neural Engine-backed path and 152 on the CPU. Both are quicker than a blink. But the difference adds up when it happens every second, all day.

As each inference request contained more audio, the CPU took longer to process it.

Why long sentences were harder

While you're speaking, Yapivo shows your words as you go. To do that it hands your audio to the model a little more than once a second, and once more when you pause. Each of those is an inference pass, and each pass reads everything you've said since your last pause, not just the newest part, because the model needs the whole thought to get the words right.

A longer sentence means more audio in every pass.

In the replay above, there's one long sentence on purpose. Through it, the CPU's passes climbed from about 150 milliseconds to 560. The Neural Engine-backed passes stayed between 50 and 106. At the pause that ended the sentence, the CPU took 467 milliseconds to finish the phrase and the Neural Engine-backed path took 74.

I'd felt that before without having a name for it: the screen trailing a step behind me. Now I could see where it came from.

A sound I hadn't connected

Weeks earlier, my MacBook had started making a faint, high whine whenever I dictated for a while. Quiet enough that I wasn't sure I'd heard it.

My best explanation, and it is an explanation rather than a diagnosis, is that it came from the chip's power circuitry reacting to bursts of work. Every time the model ran on the CPU, several cores woke up at once, worked hard for a fraction of a second, and went quiet again. Spreading that work over fewer cores made the sound quieter, which is why I believe it. I never measured the sound itself.

What I did measure is CPU time. Over the same 14 recordings, the CPU copy used 37% of one core on average while listening. The Neural Engine-backed copy used 6%. That's less work on the CPU, with the potential to reduce energy use and thermal load. I haven't measured either of those.

I also ran 139 of my own recordings through both, one after another, at background priority. The CPU needed 505 seconds; the Neural Engine-backed path needed 51. That's a throughput number for a batch, under a low-priority setting that slows both paths. It isn't the latency you feel while talking, which is why it's ten times instead of three.

The energy cost of one second of speech

The question I actually care about for a laptop is how much energy it takes to understand one second of speech:

Faster isn't automatically cheaper.

A path that finishes in a quarter of the time but draws twice the power uses half the energy, not a quarter. To fill in that equation you need power, in watts, sampled while the inference runs, with the machine's idle power subtracted.

I haven't measured power yet. So here's only the shape of the answer: if the Neural Engine-backed path drew half the active power and finished in a quarter of the time, it would use 0.5 × 0.25 = 0.125 of the energy, about 87.5% less, per second of speech. That is arithmetic on an assumption, not a result, and it says nothing about the battery life of the whole machine, where the screen, the radios and everything else are also drawing power.

What didn't change

The model itself didn't change. What changed was how efficiently it could run.

The transcripts were close, not identical. Across 139 recordings, 4.6% of words differed between the two paths, and 58 recordings had at least one difference. Different precision and different runtimes can do that. I don't have human-checked transcripts of those recordings, so I can't yet say which path was right more often. That needs a controlled accuracy comparison against reference transcripts, and it's on my list.

The pause after you finish a sentence didn't go away either. From my own logs that day, the time from my last word to the text landing in the app was about 630 milliseconds before the switch and 640 after. Most of that wait isn't the model. It's the app deciding that you're actually done (a breath in the middle of a thought shouldn't end it) and then putting the text where it belongs. A faster chip doesn't fix that. It's a different problem, for another day. The first live words did show up sooner in those logs, about 800 milliseconds after I started talking instead of 1,100, though those were different sentences, so take that loosely.

Nothing about privacy changed. Both copies ran entirely on my Mac. Your voice still never leaves your Mac.

People sometimes ask about the GPU, the third option. It can run models like this well too. Which part suits a model best depends on the operations in it, the precision, how big each piece of work is and how often it arrives. I measured the two paths Yapivo actually uses, not the GPU.

See the measurements and how they were taken
MetricWorkloadCPUNeural EngineRelative
Live-words inference latency, medianLive replay, 14 recordings (n = 204 / 230)152 ms45 ms3.3× faster
Live-words inference latency, 95th percentileLive replay, 14 recordings (n = 204 / 230)275 ms74 ms3.7× faster
Live-words inference latency, slowestLive replay, 14 recordings (n = 204 / 230)712 ms89 ms8.0× faster
Inference latency at a pause, medianLive replay, 14 recordings (n = 59 / 59)154 ms43 ms3.6× faster
Inference latency at a pause, 95th percentileLive replay, 14 recordings (n = 59 / 59)380 ms68 ms5.6× faster
CPU time while listening (share of one core)Live replay, 14 recordings, 219.8 s of audio37.2%6.2%6.0× less
Total inference timeBatch, 139 recordings, background priority504.9 s51.3 s9.8× faster
Per-recording latency, medianBatch, 139 recordings, background priority2452 ms235 ms10.4× faster

Transcripts: on 139 recordings, 4.58% of words differed between the two paths (58 recordings had at least one difference). There are no human reference transcripts, so this is disagreement between the two paths, not word error rate.

End to end, from the app log (preliminary): first live words 1143 ms on the CPU path and 803 ms Neural Engine-backed; last word to text landing 630 ms and 640 ms. Medians from the app log on the same day, before and after the switch: different sentences in different modes, so rougher than the controlled tests.

How this was measured
Benchmark date
2026-10-23
Mac
Mac16,7 (MacBook Pro), Apple M4 Pro, 10 performance + 4 efficiency CPU cores, 48 GB
macOS
26.6.2 (25G83)
Software
Yapivo 1.0.838 speech helper (yapivo-stt)
Model
Parakeet TDT 0.6B v3. Same model and version on both paths, exported two ways: the numerics are not identical.
CPU path
ONNX Runtime, parakeet-tdt-0.6b-v3-int8 (int8 quantized). CPU only: 3 threads for the encoder, 2 for the decoder and preprocessor.
Neural Engine path
Core ML through FluidAudio 0.17.7, parakeet-tdt-0.6b-v3-coreml (encoder 6-bit palettized, float16 compute). Core ML compute units cpuAndNeuralEngine for encoder, decoder and joint; preprocessor cpuOnly. Core ML chooses where each operation runs; that placement was not profiled.
Live replay
14 of the author's own dictations (219.8 s of audio) fed to the speech helper at real time in 682-sample pushes, with a live-words request every 0.8 s, once per engine.
Live timing
Live words: request sent to the speech helper → transcript returned. At a pause: the helper reports the pause → the finished phrase returned. Both include audio preprocessing, decoding and the helper’s own messaging; they exclude model loading, endpoint waiting and placing text in the app. The model was loaded before timing; there was no separate warm-up pass. Requests answered in under 5 ms had no audio to decode and are counted but not timed. (17 CPU, 19 Neural Engine). The replay waits for each live-words reply before asking again, so the slower path made fewer requests.
Batch
139 recordings (34.1 min of audio, 0.9–76.9 s each, median 10.4 s) transcribed whole, one after another, at background priority. Per recording: whole-file transcribe request → transcript. Background priority slows both engines; treat the totals as throughput under that condition, not live latency.
Excluded
Recordings one path could not open: 1. Totals compare only recordings both paths finished.
Instrumentation
Wall-clock timing in the Python harness around each request to the speech helper; CPU time from ps for the helper and its child processes.
Not measured
power (watts), energy, temperature, fan speed, battery drain, word error rate against human transcripts, per-operation hardware placement
Source
ane-lab/bench/export_benchmark.py, with the raw results beside it (live_cpu.json, live_ane.json, cpu_v3.jsonl, ane_v3.jsonl).
Computed from the raw results by the benchmark export script; nothing in this table is typed in by hand.

Where the difference won't show

A Mac with an Intel processor has no Neural Engine to move to. Everything here is about Apple silicon, and specifically one M4 Pro MacBook Pro.

If you only dictate a short sentence now and then, you may never notice. On one short sentence, 150 milliseconds and 45 milliseconds both feel instant. The difference shows up on long thoughts, and on a machine that listens all day.

Why it matters to me

Voice only works if it keeps up with you. A transcript that arrives a beat late is fine for one email. It isn't fine when you talk to your computer all day and expect it to follow along.

I think a lot of what makes a tool feel right is like that. Small delays you stop noticing. Warmth you blame on something else. A sound you aren't sure you heard. You never name them. You just trust the tool a little less each time.

Moving speech to the Neural Engine didn't change what Yapivo hears. It changed how quickly it listens, and how lightly it leans on the rest of your Mac while it does.

That's the path Yapivo runs on now in its newest builds.

SPEAK → CONTROL → DELEGATETalk to your Mac at the speed you think.

On-device dictation and voice control that keeps up with you.

Try Yapivo for Mac