🎤Micdrop

French text to speech for a voice agent: hosted APIs and local models compared

We compare ElevenLabs, Cartesia, Gradium and Voxtral with Phonon, Piper and Qwen3-TTS running in Node, on French latency and licenses.

October 21, 2026

Godefroy de Compreignac

Key takeaways

  • A French voice agent needs a model trained on French. An English model handed French text produces garbled French, whatever voice it uses.
  • Gradium and Voxtral Speech 3 generate French audio on European servers. ElevenLabs and Cartesia have the largest French voice catalogs.
  • Phonon 40M French starts speaking 30 to 100 ms after it receives a sentence, on one CPU core of a laptop, and reads French dates and times correctly. Its CC BY-NC 4.0 license rules out a commercial product.
  • A commercial product that keeps its French voice on its own machine can run a Piper French voice on the CPU or Qwen3-TTS on a GPU.
  • Test a French voice on liaisons, prices, dates, times, phone numbers and English words before you ship it, since French voices fail on those first.

French text to speech for a voice agent comes down to two options: a hosted API that streams French audio from its servers, or a model that runs next to your Node server. Among hosted APIs, Gradium and Mistral’s Voxtral Speech 3 generate the audio in Europe, while ElevenLabs and Cartesia have the largest French voice catalogs. Among local models, Phonon 40M French gave the fastest first audio we measured, 30 to 100 ms on one CPU core, but its license allows non-commercial use only. A commercial product that keeps its French voice local can run Piper on a CPU or Qwen3-TTS on a GPU.

We measured Phonon 40M French on a MacBook Pro M2 on October 21, 2026, checked its French with a Whisper round trip, and set it against the local engines we had already measured on the same laptop. The prices and voices of the hosted APIs were read on the same day. We compared them on what a real-time voice agent needs: a fast first word, correct French numbers and dates, and a license you can ship.

The short answer by situation

Your situationPickWhy
The audio has to stay in EuropeGradium or Voxtral Speech 3Both are French companies with an EU endpoint
The voice is what sells the productElevenLabs or CartesiaThe largest French catalogs, and voice cloning
The call never leaves your machine, non-commercial projectPhonon 40M FrenchThe fastest first audio we measured, on a CPU
The call never leaves your machine, commercial productA Piper French voice, or Qwen3-TTS on a GPULicenses that allow commercial use
You already pay for Google or AzureTheir French neural voicesOne more API on an account you already have

What French asks of a text to speech engine

A voice that reads English well can still get French wrong. Most of the errors come from text normalization, the step before synthesis where the engine turns written text into the words a person would say.

  • A liaison links the two words of “vous avez” or “les amis” with a z sound. A model trained on French learns liaisons, while a model trained on English reads each word on its own.
  • 71 is “soixante et onze” in France and “septante et un” in Belgium and Switzerland. 90 is “quatre-vingt-dix” in France and “nonante” in both of those countries. In French, prices are written with a decimal comma and the currency after the number, as in 71,50 €.
  • “12 mars Ă  14 h 30” is read “douze mars Ă  quatorze heures trente”. An agent that books appointments writes times this way.
  • “1er” is read “premier”, and “M. Dupont” is read “monsieur Dupont”.
  • French phone numbers are read in pairs, “zĂ©ro six, douze, trente-quatre”.
  • A French agent mentions Zoom links, e-mails and product names, which the voice has to say the way a French speaker would.

Most hosted APIs normalize the text on their servers, with rules you rarely see. Phonon applies the rules of the language you give it, so 12 mars Ă  14 h 30 comes out right when the language is French. When an engine reads digits badly, ask the agent in its system prompt to write numbers, dates and times in words. It adds a few characters per answer and leaves the engine plain words to read.

Six French test sentences for a text to speech voice: a liaison, a price in euros, a date and time, an ordinal with a title, a phone number read in pairs and English words in a French sentence

Hosted APIs that speak French

Six hosted APIs built for voice agents speak French. The prices come from each vendor’s pricing page, read on October 21, 2026. We timed Voxtral Speech 3 and Gemini ourselves. The other latency figures come from the vendors. ElevenLabs also published a benchmark that timed Cartesia and OpenAI.

APIFrenchFirst audioPriceAudio generated in the EU
ElevenLabsFlash v2.5, Multilingual v2 (France and Canada), v4 TurboAbout 150 ms median for v4 Turbo, by ElevenLabs$40 per 1M characters on Flash v2.5 and v4 Turbo, $80 on Multilingual v2Enterprise data residency
Cartesia Sonic 3.6fr-FR and fr-CA locales262 ms median in the ElevenLabs test, under 90 ms by Cartesia$37 to $50 per 1M characters, depending on the planNo EU endpoint documented
GradiumOne of its five languages258 ms median, by Gradium1 credit per character, $36 to $58 per 1M depending on the planEU endpoint
Voxtral Speech 3 (Mistral)Four preset French voices, and cloning0.5 to 0.6 s, measured$13 per 1M charactersEU endpoint
Gemini TTSFollows the language of the textAbout 1 s to 3 s depending on the model, measured$0.50 per 1M text tokens and $10 per 1M audio tokens on 2.5 FlashNo
OpenAI gpt-4o-mini-ttsSpeaks French with voices tuned for English814 ms median in the ElevenLabs test$0.60 per 1M text tokens and $12 per 1M audio tokensNo

ElevenLabs has the broadest choice of French voices, plus cloning, with Multilingual v2 in a France and a Canada variant. Watch the numbers on Flash v2.5. ElevenLabs skips number normalization on that model by default to save latency. Turning it on (apply_text_normalization) requires an Enterprise plan, so dates and prices can come out wrong on the other plans. ElevenLabs recommends switching to Multilingual v2 for phone numbers, or sending them already written in words.

Cartesia Sonic 3.6 takes a fr-FR or fr-CA locale, which sets the accent when the voice supports it. A separate setting controls how dates, times and numbers are read. ElevenLabs and Cartesia differ more on price and concurrency than on latency.

Gradium is a Paris company that came out of the Kyutai research lab. Its free plan includes 45,000 credits a month, about an hour of audio. The paid plans run from $13 to $1,615 a month. Micdrop’s integration calls its EU endpoint by default. We go through Gradium’s French voices and its EU hosting in more detail, in French.

Voxtral Speech 3, listed as Voxtral TTS 3 on Mistral’s pricing page, costs the least of the six at $13 per million characters. Its French preset voices are Marie (voice_592), Camille (voice_3141), Manon (voice_3137) and Lea (voice_589). Mistral serves it from api.eu.mistral.ai. Mistral’s speech endpoint expects the whole text in one request, so Micdrop sends one request per sentence. In our test, each sentence started playing about half a second after we sent it.

Gemini TTS and OpenAI’s gpt-4o-mini-tts speak French without a French voice of their own. Gemini’s voices follow the language of the text, and gpt-4o-mini-tts takes instructions in plain words, such as a slower delivery. Both are on their way out: Google plans to shut its current TTS models down from November 17, 2026, and OpenAI retires gpt-4o-mini-tts on January 6, 2027.

Google Cloud Text-to-Speech, Azure AI Speech and Acapela also sell French voices. Google’s Chirp 3 HD voices cover fr-FR and fr-CA at $30 per million characters after a free first million. Its Standard and WaveNet voices cost $4 per million. Azure lists French neural voices such as Denise and Henri, plus multilingual ones such as Vivienne, with half a million free characters a month. Acapela Group, founded in Mons, Belgium, sells on-device SDKs with French and Belgian French voices, priced on request.

Local French voices in Node

Five engines run next to a Node server without an API key: Phonon, Piper, Kokoro, Pocket TTS and Qwen3-TTS. Three of them speak French in Node.

Phonon 40M French, measured

Phonon is Gradium’s on-device text to speech model, built on Kyutai’s Pocket TTS. Gradium publishes it on Hugging Face in seven variants, one of them trained on French alone, gradium/phonon-40m-fr. Its runtime is compiled to WebAssembly, so it runs on a worker thread of the Node process, with no native addon and no Python.

On a MacBook Pro M2, on one CPU core, we measured:

MeasurePhonon 40M French
Loading the model and speaking the first word0.7 to 0.9 s
First audio of a sentence, model loaded30 to 100 ms
Generation speedAbout 5 times faster than real time
Memory of the Node processAbout 450 MB

The model sends its audio in frames of 80 ms, so the user hears the start of a sentence while the end is still being generated. Whisper transcribed our French test sentences back almost word for word, the date and the time included.

Gradium’s phonon-voices catalog, under Apache 2.0, includes 15 French voices from France, Noémie among them. Every voice works with every Phonon model.

The English model trap

Phonon also comes in a smaller English model, Phonon 31M, under Apache 2.0. It is the only Phonon model free for commercial use, so it is tempting to give it a French voice and French text. We tried. Whisper turned “comment puis-je vous aider aujourd’hui” into “comment please J. vous aider au George Huit”.

The French voice changed the timbre and nothing else. The model read every word with English phonemes. For French, the language of the model matters more than the voice. Check what language a checkpoint was trained on before you pick a voice for it.

Piper, Kokoro, Pocket TTS and Qwen3-TTS

Piper speaks French through voices trained one language at a time, such as fr_FR-siwis-medium. The French voices are siwis, upmc, tom, mls and gilles, in low or medium quality. Each voice is a file of a few dozen megabytes that runs on the CPU. Piper put out its first sound after about 390 ms on the same laptop. Its engine is GPL-3.0, so Micdrop runs it as a separate process.

Kokoro has a French voice upstream, ff_siwis, in the Python package. kokoro-js, the JavaScript port that runs in Node, lists English voices only and throws on any other id. Pocket TTS has a French checkpoint at Kyutai with no ONNX conversion, so the Node addon runs the English model alone. In Node, both speak English only.

Qwen3-TTS reads ten languages from one checkpoint, French among them. In a test of nine French sentences across four of its speakers, Whisper transcribed eight word for word. It needs an Apple Silicon GPU through an mlx-audio server, takes about 2.5 GB of memory, and put out its first sound after about 400 ms. Its weights are under Apache 2.0.

We compared the latency, memory use and setup of these engines on English text when we benchmarked local text to speech in Node.

First audio of a sentence on a MacBook Pro M2: Phonon 40M French 30 to 100 ms, Piper about 390 ms, Qwen3-TTS about 400 ms, Voxtral Speech 3 0.5 to 0.6 s

Licenses before you ship

Phonon 40M French, the fastest local French voice we measured, is licensed for non-commercial use only. Check the license of the weights and of each voice, and for Piper the license of the engine too.

EngineWeightsFrench voiceCommercial use
Phonon 40M FrenchCC BY-NC 4.0, gated on Hugging Face15 voices in the catalogNo
Phonon 31MApache 2.0Reads French with English phonemesYes, in English
PiperEngine under GPL-3.0siwis and mls CC BY 4.0, upmc CC BY-SA 4.0, gilles CC0, tom AGPLv3Yes, with the voice’s terms
Qwen3-TTSApache 2.0Its nine speakers read FrenchYes
Hosted APIsThe vendor’s termsThe vendor’s catalogYes, billed per character or token

Phonon’s 40M models, French and multilingual alike, carry the CC BY-NC 4.0 license, which forbids commercial use. You can prototype with Phonon 40M French and run it in research, but a product that sells calls needs another voice. The phonon-voices catalog repository is tagged Apache 2.0, and Micdrop’s @micdrop/phonon package is MIT, so neither of them restricts you.

Piper’s engine moved to GPL-3.0 in 2025 when it absorbed espeak-ng. Micdrop runs the binary as a separate process, which keeps your application out of the GPL, while shipping the binary inside your own distribution brings its terms with it. Each Piper voice carries its own license. siwis asks for attribution under CC BY 4.0. tom comes under AGPLv3, a copyleft license written for software, so have its terms checked before you ship it. Read the model card of the voice you download.

Licenses of the French voices: Phonon 40M French non-commercial only, Phonon 31M commercial in English only, Piper commercial depending on the voice, Qwen3-TTS commercial on a GPU, hosted APIs commercial and billed per use

graph TD
  A[French voice for a voice agent] --> B{Can the audio leave your servers?}
  B -->|Yes| C{Must it stay in Europe?}
  C -->|Yes| D[Gradium or Voxtral Speech 3]
  C -->|No| E[ElevenLabs or Cartesia]
  B -->|No| F{Commercial product?}
  F -->|No| G[Phonon 40M French]
  F -->|Yes| H{GPU on the machine?}
  H -->|Yes| I[Qwen3-TTS]
  H -->|No| J[Piper French voice]

How we tested

Phonon read French sentences through Micdrop’s TTS interface on a MacBook Pro M2, with the model loaded and warmed up three seconds beforehand. The script started a timer when it sent the text, stopped it at the first audio chunk, and collected the PCM audio at 16 kHz. It then passed that audio to Whisper base, running locally with the language set to French, and compared the transcript with the input.

The test sentences cover two of the cases French voices get wrong first: a liaison, in “comment puis-je vous aider aujourd’hui ?”, and a date with a time, “12 mars à 14 h 30”. A transcript that matches word for word shows the words are intelligible. How natural the voice sounds is a separate question, so listen to the recordings before you pick one.

The script takes about eighty lines of TypeScript and runs against any engine in Micdrop once you change the line that creates the voice. Piper and Qwen3-TTS were measured earlier on the same laptop for our local engine benchmark. Voxtral Speech 3 was timed from the same laptop through Micdrop, so its figure includes the network round trip to Mistral.

A French voice in Micdrop

Micdrop is an open source TypeScript library for real-time voice conversations with AI. It handles the microphone, speech detection, interruptions and audio streaming between the browser and your Node server. Micdrop’s integrations for the six hosted APIs and the five local engines share one TTS interface.

Phonon 40M French takes two options, the model and a French voice:

import { PHONON_MODELS, PhononTTS } from '@micdrop/phonon'
import { MicdropServer } from '@micdrop/server'
const tts = new PhononTTS({
model: PHONON_MODELS['phonon-40m-fr'].model,
voice: 'Noémie', // Also sets French number and date reading
})
new MicdropServer(socket, {
tts,
// ... stt and agent
})

The weights are gated on Hugging Face, so accept their terms on the model page and set HF_TOKEN before the first run. The package downloads the model once and starts offline afterwards.

For a hosted French voice in Europe, Gradium and Mistral plug into the same tts option:

import { GradiumTTS } from '@micdrop/gradium'
import { MistralTTS } from '@micdrop/mistral'
// Gradium, EU endpoint by default
const gradium = new GradiumTTS({
apiKey: process.env.GRADIUM_API_KEY || '',
voiceId: process.env.GRADIUM_VOICE_ID || '', // A French voice
})
// Voxtral Speech 3 on Mistral's EU endpoint
const voxtral = new MistralTTS({
apiKey: process.env.MISTRAL_API_KEY || '',
voiceId: 'voice_592', // Marie, French
baseUrl: 'https://api.eu.mistral.ai',
})

A local voice and a hosted one also work together. FallbackTTS tries the first engine and replays the unspoken text to the next one when it fails, so a call can start on Piper and move to Voxtral Speech 3 if the local process crashes:

import { FallbackTTS } from '@micdrop/server'
import { PiperTTS } from '@micdrop/piper'
import { MistralTTS } from '@micdrop/mistral'
const tts = new FallbackTTS({
factories: [
() => new PiperTTS({ modelPath: './voices/fr_FR-siwis-medium.onnx' }),
() =>
new MistralTTS({
apiKey: process.env.MISTRAL_API_KEY || '',
voiceId: 'voice_592',
baseUrl: 'https://api.eu.mistral.ai',
}),
],
})

Without Micdrop, you would write these clients yourself. Micdrop’s Gradium client takes about 360 lines of TypeScript and its Voxtral Speech 3 client about 150, most of them spent on streaming, interruptions and reconnections. You would write the browser code on top of that.

The other route is a hosted platform. Vapi charged $0.05 a minute on October 19, 2026, with each provider billed on top. Micdrop is MIT licensed and runs on your server with your own keys, so you pay each provider directly with no platform fee, and nothing for the voice with a local engine. In exchange, you host the server and build the call history and the dashboard a platform would give you. Products such as Raconte, built by Micdrop’s maintainer, and Cibli run on Micdrop.

For a whole European stack, with Mistral as the agent and the transcription next to the voice, follow the setup for a sovereign voice AI.

Frequently asked questions

What is the best French text to speech for a voice agent?

It depends on where the audio may go. Gradium and Voxtral Speech 3 generate French on European servers, ElevenLabs and Cartesia have the largest French catalogs, and Voxtral Speech 3 is the cheapest API built for voice agents, at $13 per million characters. On your own machine, Phonon 40M French starts speaking in 30 to 100 ms on a CPU, but its license allows non-commercial use only. A commercial product can run Piper or Qwen3-TTS instead.

Is there a free French text to speech API?

Gradium’s free plan includes about an hour of audio a month, Google Cloud gives the first million Chirp 3 HD characters for free, and Azure gives half a million neural characters a month. A local engine costs nothing per character: Piper’s French voices run on any CPU, and Qwen3-TTS runs on an Apple Silicon GPU.

Which open source text to speech speaks French?

Piper has French voices such as fr_FR-siwis-medium, Qwen3-TTS reads French with all nine of its speakers, and Phonon 40M French is an open weight model trained on French alone. Kokoro has one French voice, ff_siwis, in its Python package, while the JavaScript port lists English voices only. Phonon 40M is licensed for non-commercial use only, Qwen3-TTS is under Apache 2.0, and each Piper voice has its own license.

Can I use Phonon 40M French in a commercial product?

Its weights are gated on Hugging Face behind Gradium’s terms and licensed under CC BY-NC 4.0, which forbids commercial use. Phonon 31M is under Apache 2.0, but it speaks English only and turns French into gibberish. For a commercial product, use Gradium’s hosted French voices, a Piper French voice or Qwen3-TTS.

Does ElevenLabs read French numbers and dates correctly?

Multilingual v2 normalizes numbers, but Flash v2.5 skips that step by default to save latency. The setting that turns it on, apply_text_normalization, is reserved for Enterprise plans on that model. If you stay on Flash v2.5, ask your agent to write numbers, prices, dates and times in words in its system prompt.

How do I get a French accent in English text to speech?

Use a voice recorded by a French speaker and keep the text in English. With Pocket TTS, the bundled frenchAccent recording gives the timbre and the accent while the words stay English. Eleven v4 Turbo follows a [strong French accent] direction in the text, and gpt-4o-mini-tts takes the accent as an instruction.

You can start a first voice call in about five minutes, then swap in the French voice that fits your license and your data constraints.

Keep reading