---
title: "Choosing the Models | Micdrop"
description: "Which agent, transcription and voice to run locally, and what each one gives up."
url: "https://micdrop.dev/docs/ai-integration/local-models/choosing-models"
---

*   [Getting Started](/docs/getting-started)
*   [Client (Browser)](/docs/client)
    
    *   [Installation](/docs/client/installation)
    *   [React Hooks](/docs/client/react-hooks)
    *   [Start/Stop Call](/docs/client/start-stop-call)
    *   [Pause/Resume Call](/docs/client/pause-resume-call)
    *   [Mute/Unmute Call](/docs/client/mute-unmute-call)
    *   [Call State](/docs/client/call-state)
    *   [Display Conversation Messages](/docs/client/display-conversation-messages)
    *   [Handling Tool Calls](/docs/client/handling-tool-calls)
    *   [Device Management](/docs/client/devices-management)
    *   [Voice Activity Detection (VAD)](/docs/client/vad)
    *   [Error Handling](/docs/client/error-handling)
    *   Utility Classes
        
        *   [Mic](/docs/client/utility-classes/mic)
        *   [MicdropClient](/docs/client/utility-classes/micdrop-client)
        *   [MicRecorder](/docs/client/utility-classes/mic-recorder)
        *   [Speaker](/docs/client/utility-classes/speaker)
        
    
*   [Server (Node.js)](/docs/server)
    
    *   [Installation](/docs/server/installation)
    *   [With Fastify](/docs/server/with-fastify)
    *   [With NestJS](/docs/server/with-nestjs)
    *   [Auth and Parameters](/docs/server/auth-and-parameters)
    *   [First Message](/docs/server/first-message)
    *   [Save Messages](/docs/server/save-messages)
    *   [Resume a Conversation](/docs/server/resume-conversation)
    *   [Recording Audio](/docs/server/recording-audio)
    *   [Error Handling](/docs/server/error-handling)
    *   [Tools](/docs/server/tools)
    *   [Extract Value from Answer](/docs/server/extract)
    *   [Auto End Call](/docs/server/auto-end-call)
    *   [Semantic Turn Detection](/docs/server/semantic-turn-detection)
    *   [Noise Filtering](/docs/server/noise-filtering)
    *   [Micdrop Protocol](/docs/server/protocol)
    
*   [AI Integrations](/docs/ai-integration)
    
    *   Provided Integrations
        
        *   [AI SDK](/docs/ai-integration/provided-integrations/ai-sdk)
        *   [Cartesia](/docs/ai-integration/provided-integrations/cartesia)
        *   [ElevenLabs](/docs/ai-integration/provided-integrations/elevenlabs)
        *   [Gladia](/docs/ai-integration/provided-integrations/gladia)
        *   [Gradium](/docs/ai-integration/provided-integrations/gradium)
        *   [Kokoro](/docs/ai-integration/provided-integrations/kokoro)
        *   [Mistral](/docs/ai-integration/provided-integrations/mistral)
        *   [OpenAI](/docs/ai-integration/provided-integrations/openai)
        *   [Piper](/docs/ai-integration/provided-integrations/piper)
        *   [Pocket TTS](/docs/ai-integration/provided-integrations/pocket-tts)
        *   [Whisper](/docs/ai-integration/provided-integrations/whisper)
        
    *   Custom Integrations
        
        *   [Agent (LLM)](/docs/ai-integration/custom-integrations/custom-agent)
        *   [Speech-to-Text (STT)](/docs/ai-integration/custom-integrations/custom-stt)
        *   [Text-to-Speech (TTS)](/docs/ai-integration/custom-integrations/custom-tts)
        
    *   Fallback Strategies
        
        *   [FallbackAgent](/docs/ai-integration/fallback-strategies/agent-fallback)
        *   [FallbackSTT](/docs/ai-integration/fallback-strategies/stt-fallback)
        *   [FallbackTTS](/docs/ai-integration/fallback-strategies/tts-fallback)
        
    *   [Local Models](/docs/ai-integration/local-models)
        
        *   [Choosing the Models](/docs/ai-integration/local-models/choosing-models)
        *   [Latency and Memory](/docs/ai-integration/local-models/performance)
        *   [Explorations](/docs/ai-integration/local-models/explorations)
        
    *   [IA Vocale Souveraine 🇫🇷🇪🇺](/docs/ai-integration/sovereign-voice-ai)
    

[Micdrop](/) › [Documentation](/docs/getting-started)

# 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](/docs/server/auto-end-call), [semantic turn detection](/docs/server/semantic-turn-detection) and [noise filtering](/docs/server/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](/docs/ai-integration/local-models/explorations) page has that comparison.

## Speech to text

Whisper is the local option, running inside the Node process through [@micdrop/whisper](/docs/ai-integration/provided-integrations/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](/docs/ai-integration/provided-integrations/whisper) 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](/docs/ai-integration/provided-integrations/piper)

In a subprocess

Around forty

A voice file downloaded next to the app

~390 ms

[Pocket TTS](/docs/ai-integration/provided-integrations/pocket-tts)

In the Node process

English

A bundled voice, or a sample to clone

250 to 430 ms

[Kokoro](/docs/ai-integration/provided-integrations/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](/docs/ai-integration/local-models/explorations) page lists their measurements.

[Previous← Local Models](/docs/ai-integration/local-models)[NextLatency and Memory →](/docs/ai-integration/local-models/performance)

On this page

*   [The LLM](#the-llm)
*   [Speech to text](#speech-to-text)
*   [Text to speech](#text-to-speech)
*   [Choosing the voice](#choosing-the-voice)
*   [What a small model gets wrong](#what-a-small-model-gets-wrong)
