3 min read

Paradee-8M-v1.1

A new decoder head makes Paradee three times faster and removes most of the buzz.

A few weeks ago I released Paradee, an 8M parameter voice model distilled from Kokoro-82M. Today I’m releasing Paradee-8M-v1.1. It sounds cleaner, and it runs more than three times faster.

Here’s one sentence read by both versions.

In the wild, parakeets fly in loud, colorful flocks across the open grasslands of Australia.
Paradee-8M-v1.0
Paradee-8M-v1.1
Paradee-8M-v1.0Paradee-8M-v1.1
File size9.0 MB8.5 MB
Speed on one CPU thread18x real time62x real time
Naturalness score (out of 5)4.414.39
Words misheard5.9%5.9%

These are measured on the same 200 held-out sentences as before. UTMOS is a model trained on human ratings that predicts how natural a clip sounds. UTMOS wasn’t a reliable metric for the buzz or static noise listeners could hear in Paradee-8M-v1.0. So for this release I relied on listening to the two side by side rather than on UTMOS.

Here’s how v1.1 compares with Kokoro and other small open voice models on the same sentences. The area of each bubble shows the model’s file size.

Naturalness score against speed on one CPU thread for Kokoro-82M, Piper, KittenTTS, Kokoro-7M-Distill, Paradee v1.0 and Paradee v1.1, with bubble area showing file size. Paradee v1.1 is the fastest at 62x and scores 4.39.Word error rate against speed on one CPU thread for the same models. Paradee v1.1 has 5.9% word error rate at 62x real time.

What changed

Version 1.1 keeps the text side and most of the decoder, and replaces only the last part, the part that produces the waveform. In v1.0 that was a smaller copy of Kokoro’s waveform generator. It takes the decoder’s 80 frames per second and upsamples them step by step until it reaches 24,000 audio samples per second. That upsampling used most of Paradee’s compute, and the phase it predicted was slightly off, which caused the buzz. I needed a separate filter after it to clean that up.

For v1.1 I replaced it with a head based on Vocos. Vocos never upsamples. It predicts each frame’s spectrogram directly at the frame rate and turns that into audio with a fixed formula, so it is much faster. I also hoped a head like this would let me fix the buzz in the model itself instead of with a filter.

My head differs from Vocos for voiced sounds. A voiced sound, like a vowel, is made of a tone at the pitch plus tones at two, three, four times the pitch and so on. Since the text side already predicts the pitch, the head generates those tones directly, so their timing is always right, and the network only predicts how loud each one should be. Everything else is made by shaping random noise.

The result is faster inference and cleaner audio, without the filter from v1.0.

Here’s a close-up of the word “wild” between 1.5 and 4.5 kHz. Time goes left to right, frequency goes up, and brighter means louder. Kokoro has distinct stripes that rise and fall with the pitch. In v1.0 they are smeared, and in v1.1 they are clear again.

Close-up spectrograms of Kokoro, Paradee-8M-v1.0 and Paradee-8M-v1.1 on the word wild, 1.5 to 4.5 kHz. Kokoro and 1.1 show distinct stripes, 1.0 looks smeared.

Try it

Paradee-8M-v1.1 is now the light voice in Chickadee, a Chrome extension that reads web pages aloud using local voice models. Install it, choose Paradee as the voice model, and have it read out a web page.

The Python package now uses v1.1 by default, and the model file is a drop-in replacement for v1.0.

pip install git+https://github.com/sahilmahendrakar/paradee
python -m paradee "Paradee is a small voice that runs anywhere." -o hello.wav

Links