--- 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](https://huggingface.co/flockspeech). 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](https://huggingface.co/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`](https://pypi.org/project/flockspeech/) Python package bundles these weights, so nothing is downloaded at run time. ```sh pip install flockspeech flockspeech "Hello! I'm Junco." -o hello.wav --play ``` ```python 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: ```python 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](https://huggingface.co/charactr/vocos-mel-24khz) (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](https://keithito.com/LJ-Speech-Dataset/): 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`](https://github.com/flockspeech/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](https://huggingface.co/flockspeech/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](LICENSE). 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](NOTICE). ## Citation ```bibtex @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](https://pypi.org/project/flockspeech/) - Source code: [github.com/flockspeech/flockspeech](https://github.com/flockspeech/flockspeech) - Conversational voice: [flockspeech/goldfinch](https://huggingface.co/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.