Start with Kokoro for a lightweight narration experiment, Qwen3-TTS when language and voice-control options matter, and Chatterbox when you need reference-audio voice cloning. Choose with your actual script. A model that sounds good on a greeting can still stumble over a price, a product name or a date.
Checked October 31, 2026. We ran Kokoro on Linux and Mac mini CPUs and provide both sets of audio below. We also tested a 0.6B Qwen3-TTS CustomVoice MLX conversion on the Mac GPU. The untested entries remain selections from official model cards. This guide covers downloadable voice models; our broader AI voice comparison covers hosted voice services and live conversation systems.
Which checkpoint fits your job?
| Starting point | Exact Hugging Face checkpoint | Why evaluate it | Declared weights license | Tested here? |
|---|---|---|---|---|
| Lightweight narration | Kokoro-82M | Small 82M-parameter model; preset voices | Apache 2.0 | Community ONNX conversion on Linux and Mac CPUs |
| Reference-voice cloning | Qwen3-TTS 1.7B Base | Reference-audio cloning; multilingual family | Apache 2.0 | No |
| Preset speakers and delivery instructions | Qwen3-TTS 1.7B CustomVoice | Choose a supported speaker and an instruction | Apache 2.0 | No |
| Smaller stock-speaker Mac test | Qwen3-TTS 0.6B CustomVoice | A separate smaller CustomVoice checkpoint | Apache 2.0 | Community bfloat16 MLX conversion, stock Ryan |
| Reference-audio voice experiments | Chatterbox | Dedicated speech package with an audio-prompt input | MIT | No |
| Another local speech candidate | Pocket TTS | Dedicated local TTS runtime; check its current access conditions | CC BY 4.0 | No; gated repository |
Source: the linked official cards and Hub metadata, checked 2026-10-31. The order reflects suggested evaluation paths, not measured voice quality. Package licenses, model licenses and voice rights are separate checks.
The Qwen distinction matters. Base and CustomVoice are different checkpoints with different generation methods. The family also includes a VoiceDesign variant. Downloading Base does not give you every feature shown in the family's demos. Its official card lists ten major languages; test pronunciation and delivery in each language you intend to publish.
Listen to our Kokoro samples
We supplied the same narration to two stock voices, with speed set to 1.0. We did not clone a person's voice or edit the generated speech. The script is:
Your weekly marketing report is ready. We published three articles, updated the product page, and prepared two videos for review. Next week, we will check which work brought people to your website.
Kokoro, voice af_heart:
Kokoro, voice am_michael:
Next, listen to a less forgiving input. We passed the numerals, currency symbol and abbreviations literally:
Teamday's Q4 report is ready. Revenue reached $1,249.50 on October 31, 2026. Review the API results at 9:30 a.m.
Download the pronunciation stress sample. The revenue figure is invented test text, not Teamday financial data. Compare the audio against the script yourself; we have not assigned a listener-quality score.
What we measured
| Voice and script | Audio duration | Synthesis time | Real-time factor |
|---|---|---|---|
af_heart, narration | 11.73 s | 5.31 s | 0.453 |
af_heart, pronunciation test | 13.89 s | 6.49 s | 0.467 |
am_michael, narration | 12.69 s | 6.57 s | 0.518 |
am_michael, pronunciation test | 15.17 s | 7.51 s | 0.495 |
Measured 2026-10-31 on an AMD Ryzen 9 3900 Linux host, four ONNX Runtime CPU threads, 24 kHz PCM-16 output, one timed run per row after a separate warm-up. Real-time factor is synthesis time divided by audio duration; below 1 means faster than playback. Timings include phonemization and synthesis, exclude model loading and downloads, and are observations on a shared server rather than a controlled performance benchmark.
Loading the runtime took 1.07 seconds, excluding downloads. Aggregate peak process RSS was 1352.1 MiB; that includes the runtime and is not a minimum RAM specification. See the full settings, checksums and results.
The source checkpoint is Kokoro-82M, executed through fastrtc's community ONNX export, revision 8d07950c9b6c87ce6809e9bba7bd494336217c2a. The export is not the model maker's original PyTorch release. Our evidence records both weight-file checksums, package versions, scripts and settings. Results apply to that combination.
Mac mini follow-up: the same Kokoro export on CPU
On October 31, 2026, we also ran the same pinned ONNX export and voice files on an Apple M6 Mac mini, 32 GB unified memory, macOS 27.0.1. Both binary hashes match the Linux evidence. This is ONNX Runtime 1.31.1 CPU execution with four threads, not Apple GPU inference. Scripts, stock voices and speed 1.0 are unchanged; output audio need not be bit-identical across runtime environments.
| Voice and script | Audio duration | Median synthesis time | Timed range, n=3 | Median real-time factor |
|---|---|---|---|---|
af_heart, narration | 11.73 s | 2.13 s | 2.12–2.16 s | 0.182 |
af_heart, stress | 12.80 s | 2.37 s | 2.30–2.50 s | 0.185 |
am_michael, narration | 12.69 s | 2.32 s | 2.31–2.60 s | 0.183 |
am_michael, stress | 14.12 s | 2.68 s | 2.66–2.72 s | 0.189 |
Each row has three timed runs after one separate warm-up sentence. Timing includes phonemization and synthesis, excludes WAV saving, model loading and downloads. These are shared-machine observations with different host architectures and package environments, not an isolated measurement of the chip's speed. The Linux single-run table above remains a separate evidence set.
The narration and literal pronunciation scripts are printed above. Hear the first Mac take of each stock voice on that same narration:
Your weekly marketing report is ready. We published three articles, updated the product page, and prepared two videos for review. Next week, we will check which work brought people to your website.
Download Mac af_heart narration.
Download Mac am_michael narration. All twelve Mac Kokoro observations and output hashes retain the three repetitions for both scripts, including the pronunciation stress test. The first take is shown consistently, rather than selected as the best take. No listener-quality ranking is inferred from synthesis speed.
The Mac af_heart take uses the same literal numbers/date script:
Teamday's Q4 report is ready. Revenue reached $1,249.50 on October 31, 2026. Review the API results at 9:30 a.m.
This take is also available. Its duration differs from the Linux take, a reason to inspect actual pronunciation instead of assuming the same weights guarantee identical speech across environments.
Download Mac pronunciation stress WAV.
A second Mac voice model: Qwen3-TTS CustomVoice
We also ran Qwen3-TTS-12Hz-0.6B-CustomVoice through the community bfloat16 MLX conversion, revision 6415d95f88be018ff9e46813119dc3bc12261328. Both checkpoints declare Apache 2.0. This is the 0.6B CustomVoice variant using its supported stock speaker Ryan, not the 1.7B Base or VoiceDesign checkpoint. No reference audio or person's cloned voice was used.
On the same M6 Mac mini, mlx-audio 0.6.1 ran it on MLX Metal 0.32.4. We used the explicit generate_custom_voice interface, English, seed 42 reset for each repetition, temperature 0.9, top-k 50, top-p 1.0, repetition penalty 1.05 and a 2,048-token ceiling. The checkpoint's remaining configuration and file hashes are retained with the evidence.
| Ryan script | Audio duration | Median synthesis time | Timed range, n=3 | Median real-time factor |
|---|---|---|---|---|
| narration | 12.96 s | 5.76 s | 5.53–5.88 s | 0.445 |
| stress | 14.16 s | 6.24 s | 6.10–6.27 s | 0.441 |
Three timed repetitions per script follow a separate warm-up sentence. Timers consume the complete generator, materialize its waveforms and synchronize Metal; they exclude WAV saving, loading and downloads. Kokoro versus Qwen changes model, stock voice, runtime, precision and accelerator. These numbers establish neither a hardware-only speed difference nor listener preference.
The first narration take uses this exact script:
Your weekly marketing report is ready. We published three articles, updated the product page, and prepared two videos for review. Next week, we will check which work brought people to your website.
The literal pronunciation input is:
Teamday's Q4 report is ready. Revenue reached $1,249.50 on October 31, 2026. Review the API results at 9:30 a.m.
Download Ryan stress-test WAV. As above, the revenue is fictional test text. All six Qwen runs and exact settings preserve every take.
We checked full PCM decoding, duration, finite samples and checksums, then used a separate tiny.en transcription pass to inspect each first TTS take. That check transcribed “publish” for the scripted “published” in Ryan's narration. This is a listening-review cue, not a confirmed TTS error: ASR can also be wrong. Stress-script transcripts also vary in numeral punctuation and spelling of Teamday. The complete automated inspection preserves those differences; it is not a human listening study or a voice-quality score.
Reproduce the local samples
The CPU reproduction script pins model revisions, generates the narration and stress scripts, and saves the output hashes and timings. The package snapshot records the environment. On Linux, after installing those packages into an isolated Python environment, run:
python sample-cpu.py tts --output ./hf-samples
The script also supports asr after tts, and a separate ocr task. The OCR fixture requires DejaVu Sans at the Linux font path specified in the script. CPU PyTorch builds in the package snapshot use PyTorch's official CPU wheel index; these are Linux reproduction settings, not a Mac installation recipe.
For the Mac runs, download the separate Mac runner, source pins and Mac methods. Its --audio-input and --image-input options accept the original downloaded fixtures. Put sources.json in its output directory before running; the Linux package inventory above is not a Mac installation recipe.
How to evaluate a voice for real work
Build a short audition from a script you would actually publish. Include an ordinary paragraph, your company and product names, a price, a date, a URL and one sentence in every target language. Keep the wording identical across models. Save the exact checkpoint, voice, seed when supported, and generation settings.
First check omissions and pronunciation. A pleasant voice that changes a number is a failed result. Next check pauses, pace and consistency across paragraphs. Finally, listen at the volume and playback speed your audience will use. Keep a record of how many takes you rejected: generation cost alone misses the work of finding a usable take.
If a model reads Q4 or $1,249.50 incorrectly, try an explicit spoken version such as “quarter four” or “one thousand two hundred forty-nine dollars and fifty cents.” Preserve the original copy separately so normalization does not silently change the meaning. A useful production process can combine an approved pronunciation dictionary with a review step.
Local hosting versus a managed voice service
Local inference gives you control over the machine and saved files. It also makes you responsible for installation, updates, queueing and failures. A downloadable model is not a hosted API: verify a currently supported serving route before building around it. The presence of a demo does not establish production capacity.
For occasional voiceovers, compare the time spent maintaining a runtime with the total price of an API. For sustained work, measure the number of approved audio minutes per hour, including retakes. Do not turn parameter count into an assumed RAM requirement; the runtime, precision and additional components affect the actual process.
If your goal is a finished voiceover, Teamday Audio offers a supported creation path. The Hugging Face checkpoints evaluated here are not established as Audio options by this test. Create a voiceover in Teamday Audio →
For the reverse task, see our Hugging Face transcription guide. For visuals to accompany narration, compare self-hosted video models.
Checkpoint revision and license-metadata snapshots, retrieved 2026-10-31.
