Choosing the Models
You pick the three parts of a local call for different reasons: the agent on function calling, the transcription on the language it has to read, and the voice on the languages it can speak at all. All the measurements on this page come from a MacBook Pro M2 with 24 GB of memory, so read them as the answer for a good personal computer rather than for a server with a large GPU.
The LLM
Micdrop asks the model for tool calls on every turn when auto end call, semantic turn detection and noise filtering are on, so function calling matters more for a local agent than raw writing quality.
| Model | Size in Q4 | Notes |
|---|---|---|
| Qwen3 4B Instruct | ~2.5 GB | Best balance of tool calling, latency and multilingual coverage |
| Qwen3 8B Instruct | ~5 GB | Better conversation, still comfortable next to the voice models |
| Gemma 3 4B | ~3 GB | Very good at writing, but no native tool call format |
| Ministral 8B | ~5 GB | Strong in French, check its license for commercial use |
Llama 3.2 3B is tempting for its size, though its function calling gets shaky on the long system prompts Micdrop builds. Mistral 7B was measured against Qwen3 and came out behind on every measure. The explorations page has that comparison.
Speech to text
Whisper is the local option, running inside the Node process through @micdrop/whisper. You pick the checkpoint on the language of the call more than on the weight of the file.
Whisper reads a fixed window of thirty seconds whatever the length of the
utterance, so a heavier checkpoint raises the cost of every sentence, short
ones included. It also reads English more accurately, and outside English a
checkpoint fine-tuned on the language does better than a heavier generic one on
both accuracy and cost. The french shorthand costs what small costs, reads
French better than turbo, a checkpoint that weighs twice as much and answers
three times slower, and writes numbers
in words instead of digits, the form the voice needs. Generic base, for
comparison, misreads a quarter of the words of a French sentence.
Pass language explicitly when the call has a known language, which saves the
detection pass and avoids a wrong guess on a short sentence. The
Whisper page lists every checkpoint with
its download size and its latency.
Text to speech
Three engines run locally, and you pick between them mostly on the language of the call.
| Engine | Runs | Languages | Voice comes from | First sentence |
|---|---|---|---|---|
| Piper | In a subprocess | Around forty | A voice file downloaded next to the app | ~390 ms |
| Pocket TTS | In the Node process | English | A bundled voice, or a sample to clone | 250 to 430 ms |
| Kokoro | In the Node process | English | A bundled voice | 900 to 1300 ms |
Pick Piper as soon as the call happens in a language other than English, since it is the only one of the three that covers French, German, Spanish and around forty others. You install its binary and download the voice, a pair of files a few dozen megabytes each.
In English, Pocket TTS and Kokoro both ask only for an npm install. Pocket TTS speaks first and clones a voice from a few seconds of reference audio, at the price of 600 MB held while it generates. Kokoro asks for the least setup of the three and answers about a second later, a delay the person on the call hears.
The phonemizer limits both English engines more than their weights do. Kokoro
ships Spanish, French, Italian, Japanese, Portuguese and Chinese voices, and
kokoro-js phonemizes every input with the English rules, so those voices read
foreign words with an English accent. The Pocket TTS checkpoints for French,
German, Spanish, Italian and Portuguese have no ONNX export yet, so the addon
loads the English one.
Choosing the voice
Each engine names its voices its own way. Kokoro takes shorthands such as
americanFemale or britishFemale, and any voice id the model ships. Piper
names its voices after their language, their speaker and their quality, such as
fr_FR-siwis-medium, and publishes samples to listen to before downloading
one. Pocket TTS starts on a bundled voice and switches to any wav of someone
speaking, and its license makes the consent of that speaker a condition of use.
The voice and the agent have to agree. If you pair an English voice with an agent writing French, the voice reads French words with English phonemes and nobody understands it. Make the system prompt name the same language as the voice.
What a small model gets wrong
A model of a few billion parameters follows a complex prompt approximately. Micdrop stacks a role, a writing style, the automatic instructions and the declaration of the tools into one system prompt, and the smaller the model, the more of those instructions it drops. Expect an assistant that holds the intent and drifts on the details, and expect the tool calls to slip first, since they ask the model to judge the moment and to emit an exact format at the same time.
Qwen3 4B Instruct, over three identical conversations, shows what that drift
looks like. It skipped a meaningless "euh" every time, so noise filtering
held. It let the call run past "Merci, au revoir !", while the reasoning
variant of the same model ended it. It also wrote
"23 heures 41 minutes 35 secondes" in digits although the prompt asked for
numbers written in full, which the voice then read inconsistently.
Two habits keep those slips manageable. Provide a fallback for anything a tool
call is supposed to trigger, such as a goodbye button or a silence timeout next
to autoEndCall. And when the assistant misbehaves, turn the automatic prompts
off one at a time to see which instruction the model mishandles, then shorten or
sharpen that one rather than the whole prompt.
Transcription and voice hold up far better at these sizes. A transcription checkpoint of a few dozen megabytes reads a known language accurately once it has been fine-tuned on that language, and the local voices sound close to the hosted ones on the languages they cover. A local call gives up the most in the agent.
Kyutai and Mistral publish other local models for French and English that read and speak well, and each one asks for more computation or more setup than a local call affords today. The explorations page lists their measurements.