LinnetTTS: tiny speech model talks in real time on a single phone CPU core
LinnetTTS is an English text-to-speech model with just 41 million parameters. It starts talking after about 80 milliseconds and runs in real time on a single smartphone CPU core. It can mimic voices from a voice sample, and you can use it for free, even in commercial products.

What's going on
Developer maratos from the VoxRT project has released LinnetTTS on Hugging Face: an English text-to-speech model (TTS, a program that turns written text into spoken audio) with just 41 million parameters. For comparison, large language models often have billions of parameters. LinnetTTS is so small that, according to the developer, it speaks in real time on a single phone CPU core, meaning at least as fast as you can listen.
The weights are freely available on Hugging Face at VoxRT/linnet-en-35m, with code and runtime on GitHub. There's also an in-browser demo (Hugging Face Space VoxRT/linnet-tts) where you can type your own text and compare LinnetTTS directly with other small models. One small oddity: the repository is called "35m", while the announcement talks about 41 million parameters. The post doesn't explain the discrepancy.
What the model can do
Three things set LinnetTTS apart from many other small speech models:
- Voice prompts: You give it a short voice sample, and the model speaks in a similar voice. So you're not stuck with one built-in voice.
- Streaming: The model outputs audio in 80-millisecond chunks. Instead of waiting until a whole sentence is computed, it starts speaking right away. In measurements, the first audio arrives after 87 milliseconds, with practically no noticeable delay. That matters for things like voice assistants, where every pause feels unnatural.
- Very low resource needs: Around 187 MB of RAM is enough. No GPU required.
The developer is upfront about the limitations: so far it's English only. It also lacks text normalization, the step that turns "42" into "forty-two" or "Dr." into "Doctor". You have to spell out numbers and abbreviations yourself.
Speed compared
The developer pitted LinnetTTS against three well-known small TTS models on the same machine with the same three texts, each through its own Python package. The key metric is the real-time factor (RTF): how much compute time one second of audio takes. An RTF of 10 percent means the machine needs 1 second to produce 10 seconds of speech. Lower is better.
| Model | Size | RTF | RAM | Voice prompts | Output |
|---|---|---|---|---|---|
| LinnetTTS | 41M | 10.6% (1 core), 3.4% (4 cores) | 187 MB | yes | Streaming every 80 ms |
| pocket-tts | 100M | 23.8% (2 cores) | 968 MB | yes | Streaming every 80 ms |
| Kokoro-82M | 82M | 51.7% | 1.2 GB | no (not listed) | Whole utterance at once, 8 languages |
| Piper medium | 16M | 5.8% | 503 MB | no | Sentence by sentence |
So Piper is a bit faster still, but it can't clone voices from a sample and only delivers whole sentences. Kokoro supports eight languages but is much slower and hungrier for memory. LinnetTTS uses by far the least RAM of the four.
On smartphones, the developer measured how long an 80-millisecond audio step takes:
| Device | Time per 80 ms step |
|---|---|
| iPhone 13 Pro Max | 5.5 ms |
| iPhone 11 | 7 ms |
| Snapdragon 662 (mid-range Android, 4 cores) | 14 ms |
Even on the older mid-range chip, that leaves plenty of headroom for real time.
One important caveat comes from the post itself: only speed was measured, not quality. How natural LinnetTTS sounds by comparison is something you'll have to judge by ear. The demo's "Compare" tab plays the same sentence from all four models side by side. The methodology and benchmark script are published on GitHub, so the results can be verified. There are no independent tests yet.
Platforms and license
The runtime is written in Rust. There are bindings for C on Linux, Python (install via pip install linnet-tts), Android and iOS. The project is clearly aimed at developers who want to build speech output straight into apps, devices or programs without paying for a cloud service or sending data anywhere.
The license is split: the code is under the permissive Apache 2.0 license. The weights use the custom Linnet Weights License. According to the developer, you can use them for free in your own products, including commercially. If you plan to, read the license text yourself anyway: a custom license isn't an established open-source standard.
What you need to try it
Nothing special. LinnetTTS runs on the CPU, no graphics card needed. Around 200 MB of RAM is enough according to the measurements, so any reasonably recent laptop or PC running Linux, Windows or macOS should do; the model takes up correspondingly little disk space. Smartphones (iOS and Android) are supported directly too. The easiest way in is the Python install or, with no installation at all, the browser demo on Hugging Face.
Our take
LinnetTTS isn't a breakthrough in speech quality. It's an efficiency project: it combines voice cloning from a sample and true streaming in a model that's smaller and leaner than most competitors. That makes it interesting for offline voice assistants, read-aloud features in apps, accessibility or hobby projects on weak hardware. For now it's English only, so it's no help if you need other languages. The open questions are how good the voices actually sound and how reliably the voice cloning works. All published numbers come from the developer alone and only cover speed.
Sources
- Hugging Face Posts huggingface.co
Try it yourself: LinnetTTS (linnet-en-35m)
Explained step by step, no prior knowledge needed – on your own computer or free in your browser.
What can I do with it?
LinnetTTS reads English text aloud and runs entirely on your own device, with no internet and no GPU. It starts speaking after about 80 milliseconds and outputs audio continuously in small chunks, so there's practically no wait. With a short voice sample (voice prompt), you can shape the voice instead of being stuck with a fixed default. According to the developer's measurements, it needs only about a tenth of the audio duration in compute time on a single CPU core and around 187 MB of RAM, far less than Kokoro-82M or pocket-tts. Piper is a bit faster but can't clone voices from a sample. Limitations: English only, numbers and abbreviations have to be spelled out, and there are no measurements of sound quality, just audio samples.
Who is it worth it for?
Interesting for developers and tinkerers who want to build offline speech output into apps, smartphones, Raspberry Pi-style projects or voice assistants, and for anyone who wants English text read aloud locally. If you need other languages or top-tier studio sound quality, this isn't for you (yet).
Ideas: What you can do with it
Have English articles, emails or study material read to you locally, without any text going to a cloud service. Thanks to streaming, playback starts almost instantly.
Build LinnetTTS into a DIY voice assistant or smart home project. Because it needs so little memory and runs on the CPU, it's a good fit for weak hardware.
With the Android and iOS bindings, you can build speech output straight into smartphone apps that work offline. According to the developer, the license allows commercial products too.
Generate audio for English vocabulary and example sentences for flashcard apps. You hear the pronunciation without recording every card yourself.
Have status messages from a program or device announced out loud, for example for people with visual impairments. Latency under 100 milliseconds keeps the announcements snappy.
What your computer needs
There's currently just one variant: the English model VoxRT/linnet-en-35m with around 41 million parameters. You don't need to pick a quantization or choose by hardware: it runs on any common processor. More CPU cores make it faster (according to the developer, 3.4% RTF on four cores versus 10.6% on one).
- No GPU needed: the model is built for the CPU.
- Around 187 MB of RAM while running, according to the developer's measurements.
- Already faster than real time on a single core (RTF 10.6%), RTF 3.4% on four cores.
- Runs on smartphones too: iPhone 13 Pro Max 5.5 ms, iPhone 11 7 ms, Snapdragon 662 14 ms per 80 ms audio step.
- Official bindings for Python, C on Linux, Android and iOS; the runtime is written in Rust.
How do I find out what my computer has?
- Windows: Press Ctrl + Shift + Esc → Task Manager → Performance tab → click GPU on the left. At the bottom you'll see Dedicated GPU memory (that's your VRAM). You'll find system memory under Memory.
- Mac: Apple menu at the top left → About This Mac. You'll see your chip (e.g. M2) and memory (e.g. 16 GB). On Apple chips, graphics and processor share this memory.
- Linux: Type
nvidia-smiin the terminal (shows your graphics card and its memory) andfree -hfor system memory.
Guide
This model runs with its developers' own program (VoxRT/LinnetTTS on GitHub). The commands below come from the Model Card and the developers' instructions.
In the browser (no installation)
The developers have an online demo on Hugging Face. You can try the model right away there without installing anything. Sometimes you have to wait a moment for the demo to wake up.
Windows 10 / 11
Windows 10 / 11: not officially tested. The source only refers to the ready-made Python package linnet-tts generically as a "Python wheel"; a Windows build isn't explicitly mentioned. If the install fails, use WSL2 (Linux inside Windows) with the Linux instructions, or try the online demo in the Hugging Face Space VoxRT/linnet-tts.
- Check the prerequisites. You need a current Python 3 from the Microsoft Store or python.org. During installation, tick "Add Python to PATH". You don't need a graphics card; the model runs on the processor (CPU). Then open PowerShell, the blue Windows command window.
- Create a working folder. Create a dedicated folder for the project and switch into it. Run all further commands in this folder.
mkdir linnet cd linnet - Create a virtual environment. A virtual environment (venv) is a separate space just for this project, so nothing gets mixed up with other programs. Once activated, the line starts with "(.venv)". If you get an error about the "execution policy", first run Set-ExecutionPolicy -Scope CurrentUser RemoteSigned and confirm with Y.
python -m venv .venv .venv\Scripts\Activate.ps1 - Install the software. This installs the speech engine linnet-tts, soundfile for saving the WAV file and huggingface_hub for downloading the model files. linnet-tts doesn't need PyTorch, so it's small. When pip reports "Successfully installed", you're good.
pip install linnet-tts soundfile huggingface_hub - Download the model files. This downloads the weights (the model's "knowledge", about 83 MB), the tokenizer (which splits text into building blocks) and the built-in female voice into the local subfolder. You don't need the large fp32 file for this guide. Afterwards the files are in local and local\voices.
hf download VoxRT/linnet-en-35m linnet-en-35m.fp16.safetensors tokenizer.model voices/linnet-en-f1.npy --local-dir local - Create the script. Open Notepad, paste the code below and save it in the linnet folder as demo.py. Make sure Notepad doesn't turn it into demo.py.txt: choose "All files" as the file type when saving.
import linnet_tts, soundfile as sf model = linnet_tts.Model("local/linnet-en-35m.fp16.safetensors", "local/tokenizer.model") voice = model.load_voice("local/voices/linnet-en-f1.npy") audio = model.synthesize("Hello from Linnet.", voice, temp=0.3, cfg=2.0, seed=0) sf.write("hello.wav", audio, model.sample_rate) - Generate your first speech. Run the script. It only takes a few seconds. Afterwards the folder contains hello.wav, which you can play with a double-click.
python demo.py - Result. Your folder now contains hello.wav, in which a female voice says "Hello from Linnet."
macOS
macOS: not officially tested. There's a speed measurement for macOS on an Apple M5 (Rust runtime), but a ready-made Python package for the Mac isn't explicitly mentioned; according to the source, the macOS part of the iOS package isn't considered a supported product. If pip doesn't work, use the online demo in the Hugging Face Space VoxRT/linnet-tts.
- Check the prerequisites. You need a current Python 3. The easiest way to check: open Terminal (Applications > Utilities) and type python3 --version. If Python is missing, macOS will offer to install the Xcode command line tools, which include Python. Accept. You don't need a graphics card.
- Create a working folder. Create a dedicated folder for the project and switch into it. Run all further commands there.
mkdir linnet cd linnet - Create a virtual environment. A virtual environment (venv) is a separate space just for this project. Once activated, the line starts with "(.venv)". You need to repeat this activation command in every new Terminal window.
python3 -m venv .venv source .venv/bin/activate - Install the software. This installs the speech engine linnet-tts, soundfile for saving the WAV file and huggingface_hub for the download. When "Successfully installed" appears, you're good.
pip install linnet-tts soundfile huggingface_hub - Download the model files. This downloads the weights (about 83 MB), the tokenizer (which splits text into building blocks) and the built-in female voice into the local subfolder. You don't need the large fp32 file here.
hf download VoxRT/linnet-en-35m linnet-en-35m.fp16.safetensors tokenizer.model voices/linnet-en-f1.npy --local-dir local - Create the script. This command writes the small Python program demo.py into your folder. Copy the whole thing into Terminal and press Enter.
cat > demo.py <<'EOF' import linnet_tts, soundfile as sf model = linnet_tts.Model("local/linnet-en-35m.fp16.safetensors", "local/tokenizer.model") voice = model.load_voice("local/voices/linnet-en-f1.npy") audio = model.synthesize("Hello from Linnet.", voice, temp=0.3, cfg=2.0, seed=0) sf.write("hello.wav", audio, model.sample_rate) EOF - Generate your first speech. Run the script. After a few seconds, the folder contains hello.wav. Use open hello.wav to play it right away.
python3 demo.py open hello.wav - Result. Your folder now contains hello.wav, in which a female voice says "Hello from Linnet."
Linux
Linux: supported. Linux is officially supported (Python package, C library for x86_64 and aarch64, even Raspberry Pi). Everything runs on the processor; no graphics card is used.
- Check the prerequisites. You need Python 3 with pip and the venv module. Check in the terminal with python3 --version. On Ubuntu/Debian, venv is sometimes missing; install it through the package manager (package python3-venv). You don't need a graphics card or CUDA.
- Create a working folder. Create a dedicated folder for the project and switch into it.
mkdir linnet cd linnet - Create a virtual environment. A virtual environment (venv) is a separate space just for this project. Once activated, the line starts with "(.venv)". You need to reactivate it in every new terminal.
python3 -m venv .venv source .venv/bin/activate - Install the software. linnet-tts is the fast Rust runtime packaged for Python, with no PyTorch at all. soundfile saves the WAV file, and huggingface_hub provides the hf download command. "Successfully installed" means it worked.
pip install linnet-tts soundfile huggingface_hub - Download the model files. This downloads the weights (the model's "knowledge", about 83 MB), the tokenizer (which splits text into building blocks) and the built-in female voice into the local subfolder. The large fp32 file is only meant for the PyTorch reference and isn't needed here.
hf download VoxRT/linnet-en-35m linnet-en-35m.fp16.safetensors tokenizer.model voices/linnet-en-f1.npy --local-dir local - Create the script. This command writes the example program from the guide into your folder as demo.py. Copy the whole thing into the terminal.
cat > demo.py <<'EOF' import linnet_tts, soundfile as sf model = linnet_tts.Model("local/linnet-en-35m.fp16.safetensors", "local/tokenizer.model") voice = model.load_voice("local/voices/linnet-en-f1.npy") audio = model.synthesize("Hello from Linnet.", voice, temp=0.3, cfg=2.0, seed=0) sf.write("hello.wav", audio, model.sample_rate) EOF - Generate your first speech. Run the script. After a few seconds, the folder contains hello.wav (24 kHz, mono). Open it with any audio player.
python3 demo.py - Result. Your folder now contains hello.wav, in which a female voice says "Hello from Linnet."
What to do after your first result
- Enter your own English text, for example the sample sentence from the source: "Good morning, and welcome back. The meeting starts at nine, and the coffee is already on the table." The model only speaks English. Spell out amounts of money, percentages, dates and phone numbers in words beforehand.
- For the male voice, also download voices/linnet-en-m1.npy with hf download and put linnet-en-m1.npy instead of linnet-en-f1.npy in the script.
- Use temp (default 0.3), cfg (default 2.0) and seed (default 0) to change the variation in delivery. A different seed gives a slightly different take. For streaming, i.e. output in 80 ms chunks, use model.session(voice, seed=0), then session.prime(text) and a loop for chunk in session.
- Mind the license: you can use the unmodified weights with the built-in voices for free, including commercially. Custom voices, modified weights and public TTS services, however, require a separate license from VoxRT.
Try it
Hello! This is a quick test of a tiny speech model running on my own computer.Good morning. Today is Thursday, the fifth of November, and the weather looks sunny with twenty degrees.Once upon a time, in a small village by the sea, there lived an old fisherman who talked to the waves every evening.Warning: the battery is at fifteen percent. Please connect the charger within the next ten minutes.Welcome to episode forty-two of our podcast. Today we talk about why small AI models matter more than you might think.
Tips for better results
- Before installing, try the browser demo in the Hugging Face Space VoxRT/linnet-tts; the "Compare" tab plays the same sentence from Linnet, pocket-tts, Kokoro and Piper side by side.
- For a custom voice, use a short, clean voice sample with no background noise.
- Give the model more CPU cores if you want it even faster: according to the developer, compute time drops significantly.
- For your own measurements, use the benchmark script and methodology description (docs/benchmarks.md) in the GitHub repository.
- Write text in natural, complete sentences with punctuation: it helps with emphasis and pauses.
If something goes wrong
English only: text in other languages will be mispronounced or unintelligible.
No text normalization: spell out numbers, dates and abbreviations as words ("forty-two" instead of "42", "Doctor" instead of "Dr.").
The repository name (linnet-en-35m) doesn't match the stated size (41M parameters). Don't let that throw you: it's the same model.
The weights use a custom Linnet Weights License, not Apache 2.0. Read the license text before any commercial use.
The comparison numbers come from the developer and only measure speed, not sound quality.
“out of memory,” a crash, or your computer freezes
The model is too big for your VRAM (video memory). Pick a smaller variant from the table above and close other programs, especially games and browsers with lots of tabs.
It runs, but extremely slowly
Your CPU is probably doing the work instead of your graphics card. In Ollama, the PROCESSOR column of ollama ps shows how much runs on the GPU. If it says "100% CPU", update your graphics driver or pick a smaller variant that fits entirely into VRAM (video memory).
“ollama” or “python” is not found
Close the terminal window and open it again so it recognizes the newly installed program. For Python on Windows: reinstall it and check Add python.exe to PATH.
Windows: "Running scripts is disabled on this system"
Run the script with exactly the command above: powershell -ExecutionPolicy Bypass -File try_windows.ps1. This allows execution for this one time only.
Error message when loading the model (version, "trust_remote_code", unknown architecture)
Brand-new models often need the latest software version. With Ollama: update Ollama. With Python: pip install -U transformers in the activated environment. The Model Card usually lists the exact version.
Tokenstrom generates the scripts and notebook automatically. Please take a quick look before running them – they're plain, readable text. Mind the model's license: custom license (see Model Card).
Ask the AI assistant
Questions about this article, installation or background? Our assistant knows this page and runs on our own machine, not in someone else's cloud.
The Assistant is an AI (Gemma 4) and can make mistakes – please check important details against the source. Questions are used only to generate an answer and are deleted after one hour. Please don't enter any personal data.
Comments
What do you think? Already tried it? Write it here, no sign-up needed.
Comments are public. Links aren't allowed, and we delete abusive posts. You can delete your own comment at any time in this browser. Learn more in the Privacy Policy.