Local Mac Dictation with Ollama: Setup and Troubleshooting

Configure Apple on-device speech and local Ollama cleanup in Ducduc. Verify the model and endpoint, test offline, and diagnose raw-text fallback.

Source reviewed October 17, 2026 against the 0.3.7 build 42 checkout. Public v0.3.7, released October 15, is build 35; controls may differ. Commands below are a reproducible setup procedure, not a claimed hardware benchmark or network audit. Check the public release

Quick answer

Install Apple speech assets and a downloaded local Ollama model, disable Ollama cloud features, then choose Use locally in Ducduc Settings → Models. Confirm Offline and a loopback endpoint. Test recognition and cleanup separately with all network paths disconnected. A Hybrid backup leaves cloud active.

To run ordinary dictation locally, you need two working local stages: Apple’s speech recognition, then a downloaded language model for cleanup. Ducduc supplies the capture and insertion workflow; Ollama supplies the second model.

The useful configuration is a loopback Ollama endpoint + a local model + Ducduc Offline mode. Localhost alone does not prove local inference: Ollama also supports cloud-hosted models. This guide verifies the pieces before testing the whole workflow.

Decide whether local cleanup fits

Local cleanup avoids a hosted cleanup bill and can work without network access after assets are installed. It uses your Mac’s memory and compute, requires a running service, and may follow cleanup instructions less reliably than another model you have tried.

No model size guarantees an acceptable wait on every Mac. Available memory, other apps, model quantization, input length and whether the model is already loaded all matter. Start with short, non-sensitive dictation and choose based on your actual corrections and waiting time. If basic unpolished text is enough, you may not need a language model at all.

Scope: ordinary Dictate. Selected-text editing, translation, meeting processing and the receiving app’s sync are separate workflows.

1. Make recognition work before installing cleanup

Grant the requested Microphone, Speech Recognition and Accessibility permissions. Test a sentence in a simple text field first. Ducduc requires on-device recognition rather than allowing the classic recognizer to silently use Apple’s server.

On macOS 14–15, check System Settings → Keyboard → Dictation → Languages and download the needed language assets. On macOS 26, Ducduc’s modern path can request asset installation. Apple describes model installation through AssetInventory in its SpeechAnalyzer explanation; the system controls are covered in Apple’s Mac Dictation guide.

If no transcript appears, solve permissions, microphone or language assets first. An LLM cannot clean text that recognition never produced. See language-model troubleshooting.

2. Install Ollama and download an actual local model

Install and open Ollama using its official quickstart. The following is an example with a specific available model tag, not a claim that it is the best cleanup model:

ollama pull qwen2.5:3b
ollama list

The official Qwen2.5 catalogue lists this tag and other sizes. Check the model’s own license and choose one appropriate for your use. Model-file size is not total runtime memory.

For a strict local configuration, follow Ollama’s cloud-disable instructions: merge this setting into ~/.ollama/server.json, preserving existing settings, and restart Ollama.

{
  "disable_ollama_cloud": true
}

The FAQ also documents OLLAMA_NO_CLOUD=1 for the server environment. Setting it in an unrelated terminal does not reconfigure an already-running app. Check the documented startup/log behavior after restarting.

3. Check Ollama independently of Ducduc

With Ollama running, these commands check discovery and the same API family Ducduc uses:

curl http://localhost:11434/api/tags
curl http://localhost:11434/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{"model":"qwen2.5:3b","messages":[{"role":"user","content":"Return only: local test"}]}'

Expect the model list to contain the selected tag and the completion response to contain choices[0].message.content. The model may not return the exact requested phrase; the initial check is that the API responds. See Ollama’s list-models API and OpenAI compatibility documentation.

A refused connection points to the service/address, not Ducduc’s speech recognition. A missing-model response means pull that tag or select the exact name returned by the list.

4. Select the model and enable Offline

Open Ducduc Settings → Models:

  1. In On-device (offline), wait for model discovery. Get Ollama, Start Ollama or Recheck addresses the missing-service state.
  2. Find the installed model and click Use locally. This selects it and switches to Offline.
  3. Confirm the mode is Offline. Clicking a model row alone selects a Hybrid backup and leaves cloud active.
  4. If configuring a profile manually, use an OpenAI-compatible endpoint, base URL http://localhost:11434/v1, the exact model tag, and an empty API key for the default local service.

For same-device processing, use localhost, 127.0.0.1 or ::1. A .local host can be a different LAN computer. The app classifies endpoints; it cannot inspect every proxy or cloud integration behind them.

Offline disables Ducduc’s cloud cleanup route and skips the built-in quota. It does not act as a system-wide firewall for Ollama or the app receiving text.

5. Test the complete route with networks disconnected

First finish every download. Record macOS version, Ducduc build, exact model tag, endpoint and mode. Disconnect Wi-Fi, Ethernet and tethering; use a local test document without sensitive data.

Use this test input, not a promised model output:

Um, move the review to Thursday, no, Friday. Do not publish the billing endpoint. The limit is 15, not 50.

Inspect the raw transcript and cleaned text separately. The final decision should remain Friday, the prohibition should survive, and the limit should remain 15. Model cleanup may fail or over-edit; do not judge success merely by polished punctuation.

Then stop Ollama and repeat a harmless sentence. Recognition should remain available; cleanup failure preserves recognized text, possibly after local replacement and script policies. Restart Ollama and confirm cleanup returns. This deliberately tests failure handling as well as the happy path.

Disconnected success demonstrates this run’s offline capability. It does not prove all connected behavior or prevent the destination app syncing later. A network audit would also observe Ducduc and Ollama while connected.

Diagnose the symptom before changing models

SymptomFirst checkWhat it separates
Trigger does nothingCurrent key, Accessibility and competing appsInput trigger versus model failure
Orb listens, but no transcriptMicrophone, speech permission and language assetsRecognition versus cleanup
Ollama list failsStart the service; check localhost port 11434Service discovery versus model quality
Model list works, completion failsExact tag and API responseMissing model/API setup versus dictation
Raw text arrives with cleanup failureOffline choice, running service and completion testWorking recognition, failed cleanup
First request is slow, later ones fasterollama ps and model loadingCold start versus repeated failure
Clean text changes a number or instructionCompare raw and final; try StandardMeaning preservation versus fluent appearance
Text is ready but will not pasteFocus, secure input and the copy cardInsertion versus recognition/cleanup

The reviewed OpenAI-compatible cleanup request has a 60-second timeout. That is a failure ceiling, not a latency promise. Ollama documents ollama ps, model loading and memory behavior in its FAQ. Do not solve persistent timeouts by assuming that every larger model will work on your hardware.

What carries over, and what does not

Cleanup strength, dictionary hints, correction pairs and language-preservation instructions are available on the local route. They do not retrain the model. Script conversion and local exact replacements can still apply when model cleanup fails. Some output checks protect numbers, negatives and terms, but they are narrower than a complete meaning check.

If Refined restructures too much, try Standard and repeat the same input. If the raw transcript is already wrong, compare recognition separately before blaming the local model. Keep a small personal test set of names, numbers, mixed languages and self-corrections.

Hybrid is useful when cloud-first service with local fallback meets your needs. It is not a privacy setting: the cloud attempt happens first, and exhausted built-in quota does not automatically select the local backup. Use Use locally for an intentional switch. For other boundaries, read what “local” means.

Try it on your own Mac

Try your own vocabulary and editor, then compare the raw transcript and cleaned text in History.

Download for Mac

Published by the maker of Ducduc. Third-party information follows the sources and dates stated in this guide. Authorship, sources and examples

All posts