junco / README.md
flockspeech's picture
Model card: search keywords, voice table, FAQ, links
34bf7bf verified
|
Raw History Blame Contribute Delete
11.4 kB
metadata
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:

  1. Text front end: espeak-ng converts text to IPA phonemes (en-us, with stress marks). A blank token is inserted between phonemes.
  2. 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.
  3. 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.
  4. 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. See onnx/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

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.