Local speech recognition & synthesis

Make speech on your own computer: a local TTS guide

The right model depends on whether you need narration, multilingual announcements or a voice resembling a particular speaker. A language appearing in a support list does not guarantee equal pronunciation or prosody. This guide moves from task definition to model and backend selection, then a short local test. LLM1 tokens2 per second on this site cannot be converted into speech-generation speed.

Requirements and key details
  • Language coverage and output quality are separate. Listen to a short sample in your target language.
  • Record time to first audio (TTFA) separately from full-utterance completion time.
  • Check whether the documented Python, CUDA or MPS path matches your hardware before testing.

Define the voice job in one sentence

Start with the listener and deliverable. A brief such as “read a Korean lesson script in a consistent voice and save it as WAV” clarifies language, file type and style. A short announcement differs from a long manuscript: for long text, check how to split and join sentences and whether sections can be regenerated independently.

Also decide whether you need a voice match or a supplied speaker is enough. For ordinary narration, begin with a path that does not require reference audio. If you use voice imitation, use only your own recording or audio you are explicitly authorized to use. For an initial comparison, start with a speaker supplied with the model.

An open book on a stand beside a mini computer and speaker
Choosing the script and language first narrows the model choice.

Check pronunciation, not just the language list

Qwen3-TTS3 lists ten languages, Kokoro's card lists eight, and Chatterbox Multilingual V3 advertises 23+. These counts describe coverage, not equal pronunciation of accents, names or numbers. Kokoro's own voice notes caution that non-English training and pronunciation support may be uneven.

Use a short test passage that includes a familiar place, product name and date. If pronunciation is wrong, try punctuation or spelling variants while keeping a copy of the original. Log intelligibility, accuracy and voice preference separately so a language badge does not decide for you.

Narrow the model by workflow

For straightforward narration in Kokoro's listed languages—such as English, Japanese or Chinese—its 82M model is a compact option to try. Its official list does not include Korean.

For Korean, consider Qwen3-TTS CustomVoice with the Sohee speaker; for multilingual work that needs reference-voice matching, consider Chatterbox Multilingual V3. Qwen's VoiceDesign workflow is listed only for the 1.7B checkpoint4.

For the first test, use a supplied speaker rather than cloning a voice; this keeps the comparison simple. Once a candidate fits, try a workload closer to production: a longer passage, multiple files or an editable output. A small test can quickly rule out unsuitable voices or pronunciation.

Match the runtime to your operating system

On Windows or Linux with an NVIDIA GPU5, follow the checkpoint's CUDA6 and precision requirements. Qwen3-TTS's official Python quick start uses Python 3.12; its CUDA example shows BF167 and optional FlashAttention8 2. That documents a CUDA path, not a speed chart for every GPU. Check compatibility before installing FlashAttention.

On Apple Silicon, Kokoro's official PyTorch9 route documents MPS fallback. If you prefer a separate MLX10 runtime11, MLX-Audio lists converted Kokoro, Qwen3-TTS and Chatterbox models.

These are community MLX distributions, not the upstream model/runtime combination, so check both runtime and converted checkpoint. Below is the documented MLX-Audio CLI12 form for Qwen with a supplied Korean voice.

Qwen example with MLX-Audio on Apple Silicon
pip install mlx-audio
mlx_audio.tts.generate --model mlx-community/Qwen3-TTS-12Hz-0.6B-CustomVoice-8bit --text '안녕하세요.' --voice Sohee --lang_code Korean
This follows MLX-Audio's documented package, CLI and community checkpoint path; it is not the official Qwen CUDA runtime or a performance claim.
A recording desk with a microphone, pop filter, headphones and waveform screen
A documented runtime path is not the same as a performance measurement.

Start with a short request

Before downloading weights, confirm the official Python version, package and checkpoint ID. Qwen3-TTS's demo accepts an IP option; for a local UI, bind only to loopback at 127.0.0.1 rather than a public interface. Kokoro and Chatterbox provide Python-library examples that can be tested in a script without opening a network port.

When it runs, synthesize and play one short passage. Change language, speaker, output format and save path one at a time so errors are diagnosable. If text is cut off or the ending is missing, inspect token limits, chunking, sample rate13 and actual file duration before trying a longer request. One playable result does not prove long-job stability.

Judge speed and quality on your own task

With the same text and speaker, record model loading, warm synthesis and file-write completion separately. Measure the audio and calculate RTF14 (elapsed time divided by actual audio duration); do not confuse it with the reciprocal real-time multiplier. Keep first-audio time in its own field. Full completion may matter for narration, while TTFA may matter for conversation.

Also note pronunciation accuracy, intelligibility and style fit separately. Rather than selecting a universal “best voice” from one score, ask how many corrections your script needs and whether the output fits delivery. Qwen's 97ms README claim concerns a first streaming packet, not completion of a full script. This site has not measured these models.

A portable audio player displaying a waveform beside headphones
Log TTFA separately from full synthesis completion.

Terminology notes

  1. Large language modelA language model trained on large text datasets to process and generate text. Capabilities and supported inputs vary by model.

    Back to the text
  2. TokenA unit into which a model divides input or output for processing. One token does not equal one character or a fixed duration.

    Back to the text
  3. Text-to-SpeechTechnology that converts text into spoken audio with pronunciation and prosody. Output characteristics depend on the model and settings.

    Back to the text
  4. CheckpointA file containing saved model weights and related state. Versions or tasks in one model family may use different checkpoints.

    Back to the text
  5. GPUA processor designed to handle many calculations in parallel. It performs model computations during AI inference.

    Back to the text
  6. CUDAA software platform for general-purpose computing on NVIDIA GPUs. Programs built for CUDA are not guaranteed to run unchanged on other GPUs.

    Back to the text
  7. BF16A 16-bit floating-point format for storing and computing model values. Support depends on the hardware and runtime.

    Back to the text
  8. FlashAttentionAn implementation that improves memory access in attention computation. Availability and effects depend on hardware, model, and runtime.

    Back to the text
  9. PyTorchA software framework for building and running AI models. Check the compatible PyTorch version and hardware support along with the model.

    Back to the text
  10. MLXA machine-learning framework for Apple silicon. It uses Apple silicon’s unified-memory architecture; supported models and features vary by MLX tool.

    Back to the text
  11. RuntimeSoftware that loads model files and runs their computations. Supported formats, hardware, and optimizations vary by runtime.

    Back to the text
  12. CLIShort for Command-Line Interface: operating a program by entering commands in a terminal.

    Back to the text
  13. Sampling rateThe number of times per second an audio signal is measured when digitized. It is distinct from bit depth.

    Back to the text
  14. Real-Time FactorGeneration time divided by the duration of the output. Under comparable conditions, a lower value indicates faster generation.

    Back to the text