FluidVoice
Overview
FluidVoice is a fully open-source (GPLv3), local-first voice-to-text dictation application for macOS. It captures audio via a global hotkey, transcribes it using on-device speech models (Parakeet, Whisper, Apple Speech, Cohere Transcribe), and optionally enhances the result with an LLM before typing it into the active application.
The application runs as a menu bar app with a floating overlay that appears during recording. It requires macOS 15.0 (Sequoia) or later and is optimized for Apple Silicon, with Intel support via Whisper models.
Repository: https://github.com/altic-dev/FluidVoice
Core Architecture
FluidVoice has two independent processing stages:
-
Speech-to-Text (STT): Runs entirely on-device with no network access. Supported engines include Parakeet Flash (lowest latency, English), Parakeet TDT v3 (multilingual), Cohere Transcribe (highest accuracy), Apple Speech (zero download), and Whisper (broadest language coverage).
-
AI Enhancement (optional): Raw transcription is sent to an LLM for cleanup — filler word removal, punctuation correction, self-correction handling, number conversion. Supports OpenAI, Anthropic, Groq, Google, xAI, OpenRouter, Ollama, LM Studio, Apple Intelligence, and custom OpenAI-compatible endpoints.
Three Operating Modes
Dictate Mode: Voice-to-text with optional AI cleanup. The default mode.
Edit Mode: Rewrites selected text or generates new text based on voice instructions. Requires AI.
Command Mode: Agentic terminal automation. Translates natural language into shell commands, executes them, verifies results. Uses the OpenAI function-calling API format with up to 20 autonomous turns. Requires AI.
Key Features
- Five configurable global hotkeys (two independent dictation shortcuts, Command Mode, Edit Mode, Cancel)
- Toggle or Press-and-Hold hotkey behavior (global setting)
- Per-app AI prompt routing (different prompts for Chrome vs VS Code vs Slack)
- Custom named prompt profiles for both Dictate and Edit modes
- Two text insertion strategies: Reliable Paste (clipboard-based, default) and Experimental Direct Typing (accessibility APIs)
- Floating overlay with live transcription preview, mode switcher, prompt picker, and quick actions
- Transcription history with reprocess, copy, and undo-AI actions
- Independent AI provider/model settings for Command Mode
Using with Ollama
With Ollama providing the LLM locally, the entire FluidVoice pipeline — speech-to-text + AI enhancement — runs on-device with no network access, no API keys, and no per-token costs. FluidVoice detects that the Ollama endpoint is on localhost and skips API key validation.
Setup
-
Install and start Ollama:
brew install ollama ollama serve -
Pull a model. For dictation cleanup, 7B is sufficient. For Command Mode (function calling), 14B is better:
ollama pull qwen2.5:7b # dictation ollama pull qwen2.5:14b # command mode / editing -
In FluidVoice > Settings > AI Enhancement:
- Select Ollama as the provider (base URL pre-configured to
http://localhost:11434/v1) - Set the model name to match what you pulled (e.g.,
qwen2.5:7b) - Leave API key blank
- Select Ollama as the provider (base URL pre-configured to
-
For Command Mode with a different model: open the Command Mode settings and either link to the global Ollama provider or configure an independent provider with the larger model.
-
In the overlay’s prompt picker, select Default (not “Off”) to enable AI cleanup.
Model Recommendations
See Model Recommendations by Task for the full matrix. Summary:
| Feature | Model | Memory |
|---|---|---|
| Dictation cleanup | qwen2.5:7b | ~6 GB |
| Edit Mode | qwen2.5:14b | ~9 GB |
| Command Mode | qwen2.5:14b or qwen2.5:32b | 9-20 GB |
| All-in-one | qwen2.5:14b | ~9 GB |
Using one model for everything avoids the 2-3 second reload when switching modes. See Model Swapping Overhead.
Troubleshooting
No AI processing: Verify Ollama is running (curl http://localhost:11434/ should return “Ollama is running”) and that the model name in FluidVoice matches ollama list exactly.
Slow first response: Ollama unloads models after 5 minutes by default. Increase with OLLAMA_KEEP_ALIVE=30m or -1 for indefinite.
Command Mode ignores commands: The model may lack function calling support. Use qwen2.5:14b or llama3.1:8b which have explicit tool-use training.
See also
- OLLAMA — local LLM inference engine used as FluidVoice’s AI backend
- Ollama vs LM Studio — comparison of local inference options
- MCP — Model Context Protocol (related AI tool integration standard)