Download README.md from flockspeech/junco: direct link, hf CLI and curl.
- Browser
- Download file 11.4 kB
-
https://huggingface.co/flockspeech/junco/resolve/main/README.md
- Command line
-
hf download hf://flockspeech/junco/README.md
-
curl -L -o README.md https://huggingface.co/flockspeech/junco/resolve/main/README.md
license: apache-2.0
language:
- en
library_name: onnx
pipeline_tag: text-to-speech
tags:
- text-to-speech
- tts
- speech-synthesis
- neural-tts
- offline-tts
- on-device
- edge-ai
- edge
- offline
- cpu
- onnx
- onnxruntime
- lightweight
- small-model
- flow-matching
- vocos
- english
- raspberry-pi
- flockspeech
- accessibility
- screen-reader
- voice-assistant
- narration
datasets:
- keithito/lj_speech
Junco v0.1: tiny offline text-to-speech (TTS) for CPU
A small, natural English text-to-speech model that runs offline on any CPU. 44 MB, no GPU, no cloud.
Junco is an 11.4M-parameter flow-matching TTS model from Flock Speech. It turns English text into natural 24 kHz speech on an ordinary CPU, faster than real time. It has no GPU, network or PyTorch dependency, and the full model is a 44 MB download.
Junco is the clear, neutral reading voice of the Flock Speech family: a good fit for voice assistants, screen
readers, notifications, narration and other on-device or edge AI speech output. Install it with
pip install flockspeech.
| Flock Speech voices | Style | Model card |
|---|---|---|
| Junco | clear, neutral reading voice | this page |
| Goldfinch | conversational voice that laughs and breathes on cue with [laugh] tags |
flockspeech/goldfinch |
| Developed by | Flock Speech |
| Model type | Non-autoregressive TTS: transformer encoder, duration predictor, conditional flow-matching decoder, Vocos vocoder |
| Language | English (US) |
| Voices | 1 (female, read-aloud style) |
| Output | 24 kHz mono audio |
| Parameters | 11.4M acoustic model + 13.5M vocoder |
| Download | 44 MB (ONNX; int8 decoder, fp16 encoder and vocoder) |
| Runtime | ONNX Runtime on CPU (Linux, macOS, Windows; x86-64 and ARM64) |
| License | Apache-2.0 (vocoder weights MIT) |
| Version | v0.1, November 2026 |
Samples
All samples were made with the files in this repository at default settings (8 steps, seed 0), with no editing.
| Use | Text | Audio |
|---|---|---|
| Greeting | Hello! I'm Junco, a tiny voice that runs entirely on your own device. | |
| Assistant | Your next meeting starts in fifteen minutes. Would you like me to read the agenda? | |
| Narration | The old lighthouse keeper climbed the spiral stairs one last time, and watched the ships come home through the fog. | |
| News | Researchers announced on Tuesday that the new battery can be charged in under ten minutes, and lasts twice as long. |
Quick start
The flockspeech Python package bundles these weights, so nothing is downloaded
at run time.
pip install flockspeech
flockspeech "Hello! I'm Junco." -o hello.wav --play
from flockspeech import Junco
tts = Junco() # loads in under a second
audio = tts("Hello there.") # float32 numpy array, 24 kHz mono
tts.save("Hello there.", "hello.wav")
# Low latency: audio is produced sentence by sentence
for chunk in tts.stream(long_text):
play(chunk)
To use the files in this repository directly:
from huggingface_hub import snapshot_download
from flockspeech import Junco
path = snapshot_download("flockspeech/junco", allow_patterns=["onnx/*"])
tts = Junco(model_dir=f"{path}/onnx")
Options
| Parameter | Default | Effect |
|---|---|---|
speed |
1.0 | Speaking rate; 1.2 is 20% faster |
steps |
8 | Flow-matching steps; 4 is about 1.5× faster with slightly lower quality |
seed |
0 | Fixes the small random variation in delivery, so output is reproducible |
threads |
up to 4 | CPU threads for ONNX Runtime |
Intended use
Suitable for:
- Voice output on devices and in apps that must work offline or keep text private: assistants, accessibility and screen-reading tools, kiosks, robotics, games and embedded products.
- CPU-only servers where cost or latency matters.
- Prototyping and research on small TTS models.
Out of scope:
- Languages other than English, or speaker voices other than the one provided. Junco has no voice cloning.
- Expressive, emotional or conversational styles. The voice reads in a neutral, read-aloud style.
- Impersonating a real person, or producing audio meant to deceive listeners about who is speaking or whether the speech is synthetic.
Limitations
- No text normalisation. Write numbers, currency, dates and abbreviations in words: "five dollars", not "$5"; "Doctor", not "Dr.". Raw digits and symbols are read by espeak-ng's rules, which may not be what you want.
- Pronunciation comes from espeak-ng. Rare names, brands and some homographs, such as read and lead, can be mispronounced.
- One voice, one accent. The model learned from a single US English speaker.
- Long-form audio. Text is synthesised sentence by sentence. Prosody does not carry across sentences.
- Bright high frequencies. About 14% of Junco's energy lies above 4 kHz, against 2% for real recordings. On some playback systems this may sound slightly bright or hissy.
Risks and responsible use
Synthetic speech can be misused for deception. Junco produces a single fixed voice and cannot clone speakers, which limits impersonation risk. We still ask that you:
- tell listeners when speech is synthetic, where that matters;
- not use the model for fraud, harassment or deceptive impersonation;
- review output before you use it in safety-critical or high-stakes settings.
Model details
Architecture
The model runs in four stages:
- Text front end: espeak-ng converts text to IPA phonemes (en-us, with stress marks). A blank token is inserted between phonemes.
- Text encoder (3.2M parameters): 3 ConvNeXt pre-net blocks, then 6 transformer layers (width 192, RoPE, SwiGLU, RMSNorm). It predicts a per-phoneme mel prior.
- Duration predictor (0.3M parameters): a convolutional regressor of log-durations. It was trained on alignments from Monotonic Alignment Search, so no external aligner is needed.
- Decoder (7.9M parameters): a flow-matching U-Net hybrid.
- ConvNeXt blocks run at the full frame rate, and four adaLN transformer blocks run at half the frame rate.
- It uses classifier-free guidance (weight 1.0) and 8 Euler steps with a sway-sampling schedule.
- It outputs a 100-band log-mel spectrogram (hop 256, 24 kHz).
The vocoder is Vocos (charactr/vocos-mel-24khz, MIT). In ONNX it predicts the STFT magnitude and phase, and the inverse STFT runs in numpy.
Files
| File | Contents | Size |
|---|---|---|
onnx/encoder.onnx |
Text encoder and duration predictor (fp16 weights, fp32 compute) | 7.2 MB |
onnx/decoder-int8.onnx |
One guided flow-matching step (int8 dynamic quantisation) | 9.9 MB |
onnx/vocoder.onnx |
Vocos backbone and spectral head (fp16 weights, fp32 compute) | 27.1 MB |
onnx/junco.json |
Mel normalisation statistics and default inference settings | <1 kB |
samples/ |
The audio samples above |
Training
| Data | LJ Speech: 13,100 clips, about 24 hours, one speaker, public domain |
| Objective | Conditional flow matching (logit-normal time sampling, σ_min 1e-4), MAS prior loss, duration MSE |
| Guidance | Condition dropped for 10% of training examples, for classifier-free guidance |
| Optimiser | AdamW (lr 2e-4, β 0.9/0.98, weight decay 0.01), 1,000 warm-up steps, EMA 0.999 |
| Batching | Dynamic batches of up to 20,000 mel frames |
| Compute | 44,485 steps in 3 hours on one NVIDIA T4 GPU |
| Released weights | EMA weights |
Environmental impact. The final training run used about 3 GPU-hours on one NVIDIA T4 (70 W TDP), or about 0.2 kWh. Architecture experiments before it used more.
FAQ
Does Junco need a GPU or an internet connection? No. It runs on an ordinary CPU with ONNX Runtime. Once installed, speech is generated fully offline and your text never leaves the machine.
How big is it? 44.2 MB in total: a 17.1 MB acoustic model plus the 27.1 MB Vocos vocoder. Junco and Goldfinch share the vocoder, so both voices together take 61.3 MB.
Can it run on a Raspberry Pi or other ARM boards?
It runs on 64-bit ARM Linux wherever onnxruntime and espeakng-loader publish wheels, including 64-bit Raspberry
Pi OS.
Can I stream audio for low latency?
Yes. tts.stream(text) yields audio sentence by sentence, so playback can start before the whole text is done.
Can I use it without Python?
The ONNX files run in any ONNX Runtime binding. The text front end (espeak-ng phonemes) and the small loop around the
three models live in the flockspeech package, which you can port.
Does it support voice cloning or other languages? No. Junco is one English (US) voice. For a casual, conversational voice, use Goldfinch.
Can I use it commercially? Yes. The weights are Apache-2.0 and the vocoder is MIT. The phonemiser (espeak-ng, phonemizer) is GPL-3.0 and is installed separately; see the License section below.
License
- Junco weights and configuration: Apache License 2.0. Commercial use, modification and redistribution are allowed.
- Vocos vocoder weights (
onnx/vocoder.onnx): MIT, © 2023 Charactr Inc. Seeonnx/LICENSE-vocos. - Training data: LJ Speech, public domain.
Run-time dependency. Text-to-phoneme conversion uses espeak-ng and phonemizer. Both are GPL-3.0 and are not
included in this repository. The flockspeech package installs them as separate dependencies. If you plan to ship
Junco inside a closed-source product, review their licence terms, or replace the phonemiser with one under a licence
that suits you. See NOTICE.
Citation
@misc{flockspeech2026junco,
title = {Junco: a small flow-matching text-to-speech model for on-device use},
author = {{Flock Speech}},
year = {2026},
howpublished = {\url{https://huggingface.co/flockspeech/junco}},
note = {Version 0.1}
}
Links
- Python package: pypi.org/project/flockspeech
- Source code: github.com/flockspeech/flockspeech
- Conversational voice: flockspeech/goldfinch
Acknowledgements
Junco builds on ideas from Matcha-TTS (conditional flow matching for TTS), Glow-TTS (Monotonic Alignment Search), F5-TTS (sway sampling), ZipVoice and SupertonicTTS (efficient decoder design), and Vocos (vocoder). We thank the authors of these works and of LJ Speech.