Skip to content

Text to speech that runs on your machine.

Twenty voices across ten languages, and a new one cloned from ten seconds of audio. Nothing leaves the machine you run it on.

Open source · On-device · Apache-2.0 No account · Offline after download · No per-character billing

Hear it

Twenty voices, ten languages.

English, Spanish, French, German, Italian, Portuguese, Polish, Dutch, Swedish and Danish. Every voice is enrolled from a consented donation or a CC0 / CC-BY corpus, with the source named.

Hear two now.

Both clips read the same sentence from Alice’s Adventures in Wonderland.

joeEnglish · male
kathleenEnglish · female

One seeded sample per voice, playable in the browser. The sources and the licences are on the same page. Open the demo to hear each enrollment recording next to the speech it produced, and the other eighteen voices.

We have evaluated English by ear. We do not speak the other nine languages well enough to judge them reliably, so feedback from native speakers is very welcome.

Where it runs

Laptops, GPUs and edge devices.

Faster than real time on datacentre GPUs, on desktop GPUs, on Apple Silicon and on an embedded board. Every figure is one loudkit bench run on the named machine. The hardware, the method and the commands.

requires an NVIDIA GPU

NVIDIA CUDA

7.47×real time, RTX 3090 with CUDA graphs

PyTorch, from an embedded board to a datacentre card.

HostEagerCUDA graphs
A1002.16×8.12×
L42.20×7.56×
RTX 30903.39×7.47×
T42.10×5.46×
GTX 1080 Ti1.95×1.89× *
Jetson Orin0.73×1.83×

 * Pascal cannot capture graphs: on the 1080 Ti the flag runs eager.

Batch throughput, RTX 3090 with CUDA graphs

Many texts at once. Each number is the total audio produced per second of wall clock across the whole batch, not the speed of one synthesis.

20.1×batch 1
80.8×batch 8
110.8×batch 16
137.3×batch 32
153.1×batch 64

What it measures, and the full table. The highest measured aggregate is 170.8× on an A100 at batch 64.

requires Apple Silicon

Apple GPU

3.43×real time, M-series laptop, --device mps

The generator runs on the CPU and the renderer on the GPU. A CoreML renderer ships for Swift.

requires no PyTorch

ONNX Runtime

1.21×real time, same laptop, fp32 graphs

Runs without PyTorch, on ONNX Runtime.

an embedded NVIDIA GPU

Jetson Orin Nano

1.83×real time, --device cuda --cuda-graphs, measured on the board

The same engine, the same conformance fixture, on a board with no discrete GPU.

Every figure is a multiple of real time. 3× real time means one minute of audio in twenty seconds. Under 1× is slower than real time.

Five languages, one engine

Ports, not wrappers.

Python is the reference implementation. Swift, Go, Rust and TypeScript are full ports of it, and all five are held to the same conformance fixture, so the same text and the same voice give the same speech tokens in every one.

PythonPyTorch, ONNX Runtime or CoreML backendreference
SwiftCoreML backendSwift Package Manager
GoONNX Runtime backendgo get
RustONNX Runtime backendcargo
TypeScriptONNX Runtime backendnpm i

Install

Install, then speak.

Add the package, load a checkpoint, pick a voice, get a waveform. Python fetches what it needs on the first call. The ONNX ports read files from disk, so they fetch first into loudr-1/, which is what the paths below are relative to.

Terminal window
pip install "loudkit[torch,audio,hub]"
import loudkit as lk
engine = lk.load("loudreader/loudr-1")
voice = lk.voice("kathleen", repo="loudreader/loudr-1")
engine.synthesize("Hello from loudkit.", voice, seed=7).save("hello.wav")

The same seed and voice give the same speech tokens in all five. The four ports load graphs exported once from a Python checkout: ONNX for TypeScript, Go and Rust, CoreML for Swift. Each guide has that step.

Where to go next

What it promises.

Responsible use.

The tool clones a voice from ten seconds of audio and includes C2PA Content Credentials in saved WAVs by default. Consent is yours to obtain. Read the terms.

LoudReader, the iOS reading app, runs on this engine. loudkit is the engine it ships.