Pocket TTS
Local text to speech for @micdrop/server, running Pocket TTS in your Node process through the sherpa-onnx addon and ONNX Runtime.
Pocket TTS is a 100 million parameter model from Kyutai, designed for the CPU, that takes its voice from a few seconds of reference audio instead of from a catalog. It generates about five times faster than real time and emits its audio while it is still writing the rest, which makes it the local voice with the shortest delay before the first word.
Installation
Install the package:
npm install @micdrop/pocket-ttsDownload the weights, converted to ONNX by the sherpa-onnx project:
curl -LO https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/sherpa-onnx-pocket-tts-int8-2026-01-26.tar.bz2tar xf sherpa-onnx-pocket-tts-int8-2026-01-26.tar.bz2rm sherpa-onnx-pocket-tts-int8-2026-01-26.tar.bz2The archive weighs 98 MB and takes 190 MB on disk. A full precision archive,
sherpa-onnx-pocket-tts-2026-01-26.tar.bz2, sits next to it and works the same
way, since Micdrop looks the weights up by name in the folder and takes the
quantized ones first when both files are there.
The addon ships prebuilt binaries for macOS, Linux and Windows on both Intel
and ARM, so npm install is all it takes.
Usage
import { PocketTTS } from '@micdrop/pocket-tts'import { MicdropServer } from '@micdrop/server'
const tts = new PocketTTS({ modelDir: './sherpa-onnx-pocket-tts-int8-2026-01-26', voice: 'bria',})
// Use with MicdropServernew MicdropServer(socket, { tts, // ... other options})Options
| Option | Type | Default | Description |
|---|---|---|---|
modelDir | string | Required | Folder you extracted the archive into |
voice | string | 'bria' | Bundled voice name, or path to a wav to clone |
speed | number | 1 | Speech rate, above 1 to speak faster |
numSteps | number | 2 | Sampling steps per frame |
referenceLength | number | 12 | Seconds of the reference the model builds from |
seed | number | Optional | Sampling seed, to make a sentence reproducible |
numThreads | number | 2 | Threads given to ONNX Runtime |
provider | string | 'cpu' | Execution provider passed to ONNX Runtime |
warmup | boolean | true | Speaks one word at startup |
Voices
A few seconds of someone speaking is enough for the model to answer in that
voice, with no transcript of the sample and no training step. The archive ships
three such recordings in its test_wavs folder, reachable by name through
BUNDLED_VOICES, and any wav file works in their place.
import { BUNDLED_VOICES, PocketTTS } from '@micdrop/pocket-tts'
const tts = new PocketTTS({ modelDir: './sherpa-onnx-pocket-tts-int8-2026-01-26', voice: './voices/my-voice.wav',})bria is forty seconds of a woman reading calmly. loona is a one second clip,
about the shortest a reference can be. frenchAccent is a French speaker, so
the recording gives the timbre and the accent while the words come from the text
and stay English.
Pocket TTS reads only the first referenceLength seconds, so a long recording
costs nothing extra. The model reproduces the quality of the sample along with
the voice, which makes a clean recording worth more than a long one.
Clone a voice only with the consent of the person it belongs to. The Kyutai license makes it a condition of use, and impersonation is the main misuse of voice cloning.
Languages
Pocket TTS speaks English in this integration. Kyutai also publishes French, German, Spanish, Italian and Portuguese checkpoints, which are all still waiting for an ONNX conversion, so the addon loads the English model. Hand it French and you get fluent nonsense rather than an accent, since it reads every word with English phonemes. Use Piper for the other languages.
Latency
These times come from a MacBook Pro M2, on CPU. The generation timings assume the model is already loaded.
| Step | Time |
|---|---|
| Loading the model | ~470 ms |
| First audio of a sentence | 250 to 430 ms |
| Generating four seconds of speech | ~850 ms |
Micdrop cuts the answer into sentences and hands each sentence over in chunks as the model writes it, so the user hears its opening words while the model is still generating its end. The generation stops between two chunks rather than at the end of the sentence, which makes an interruption immediate.
Memory
The model takes about 350 MB once loaded and around 600 MB while generating. That is more than Kokoro at 80 MB, and it stays small next to the language model running beside it. Micdrop loads one instance per configuration and shares it across every call, so a second conversation costs nothing more.
Documentation
Read the guide on running Micdrop with local models to see how Pocket TTS fits with a local LLM and local speech to text.
License
Pocket TTS is released under the MIT license, and the sherpa-onnx addon under Apache 2.0. The reference recordings shipped with the archive carry their own licenses, listed on the Kyutai voice repository.