Use case · Content creation

Clone a voice in 30 seconds.
Synthesise for hours.

Zero-shot voice cloning on Apple Silicon. IndexTTS2 adds native MLX cloning with emotion, tempo, and pause controls; CosyVoice 3 handles transcript-conditioned multilingual cloning; Chatterbox Flash covers the CoreML T3 + S3Gen path. No fine-tuning, no per-character pricing, no audio ever leaving the device.

Speech Studio · A/B/C test

Which voice is real?

A 30-second blind comparison of a real voice, the same voice cloned locally by Speech Studio on a MacBook, and the same voice cloned by ElevenLabs in the cloud. Speech Studio is the open-source Mac app on top of speech-swift — Apache 2.0, github.com/soniqo/speech-studio.

What you can build

Where on-device cloning changes the math.

Cloud TTS bills per character and locks the voice on a server. On-device cloning lets you ship apps and creator tools where the voice belongs to your user and the synthesis cost is zero per use.

AI narrators for video

YouTube voiceovers, course modules, marketing clips — your founder's voice across every episode.

Multilingual creatives

Same voice, nine languages. Cross-lingual cloning keeps the speaker identity even when the words switch.

Personalised audiobooks

Let the listener pick their narrator — a celebrity, a parent, a family voice — from a 30-second sample.

Educational content

Lecturers can record once, then have lessons re-narrated automatically as their text scripts evolve.

Quickstart

One CLI call. One reference clip.

IndexTTS2 uses reference audio directly and exposes emotion, speaking-rate, and pause controls. CosyVoice 3 remains the transcript-conditioned multilingual default when you have the reference transcript.

# IndexTTS2 — native MLX zero-shot cloning
speech speak "Welcome to the demo." \
  --engine indextts2 \
  --voice-sample ref.wav \
  --indextts2-emotion eager \
  --indextts2-speaking-rate 1.35 \
  --indextts2-max-pause 0.05 \
  --output out.wav

# CosyVoice 3 — transcript-conditioned multilingual cloning
speech speak "Welcome to the demo." \
  --engine cosyvoice \
  --voice-sample ref.wav \
  --cosy-reference-transcript "Transcript of ref.wav (its text content)..." \
  --output out.wav
From Swift — extract the voice profile once, reuse it across many synthesis calls without re-encoding the reference each time:
import CosyVoiceTTS
import AudioCommon

let model = try await CosyVoiceTTSModel.fromPretrained()

let refAudio = try AudioFileLoader.load(
    url: URL(fileURLWithPath: "ref.wav"), targetSampleRate: 16_000)
let cacheDir = try HuggingFaceDownloader.getCacheDirectory(
    for: "aufklarer/CosyVoice3-0.5B-MLX-bf16")
let tokenizer = try SpeechTokenizerModel.fromSafetensors(
    at: cacheDir.appendingPathComponent("speech_tokenizer.safetensors"))

let profile = try model.extractVoiceProfile(
    audio: refAudio, sampleRate: 16_000,
    speechTokenizer: tokenizer,
    referenceTranscript: "Transcript of the reference clip."
)

let audio = model.synthesize(
    text: "Welcome to the demo.",
    voiceProfile: profile,
    language: "english"
)
Engines

Five cloning paths, one stack.

IndexTTS2 is the native MLX path for identity-first cloning with emotion and pacing controls. CosyVoice 3 remains the transcript-conditioned multilingual default, Chatterbox Flash is the CoreML route, and Qwen3-TTS ICL is the English/Mandarin fallback.

EngineHowLanguagesBest for
IndexTTS2reference audio + semantic GPT + emotion/style conditioningbatch synthesisIdentity-first local cloning, emotion presets/vectors, speaking-rate and pause control.
CosyVoice 3 zero-shotprompt_token + prompt_feat + transcript9 (zh/en/ja/ko/de/es/fr/it/ru)Default. Highest identity capture, multilingual creative work.
Chatterbox Flash CoreMLFlash T3 CoreML + S3Gen CoreML with MLX reference conditioning23 upstream / English path validatedCoreML voice-cloning path. Measured RTF 0.59, TTFT 0.27 s with a 512-token audio bucket.
Qwen3-TTS ICLIn-context-learning with reference audioEN, ZHEnglish-first projects, when you don't need the other 7 languages.
CosyVoice 3 (legacy)192-d CAM++ speaker embedding only9Bundles without the speech tokenizer. Material drop in identity match.
HuggingFace bundles

Pick a bundle by runtime path.

IndexTTS2 ships as an expanded fp16 MLX bundle with auxiliary models. CosyVoice 3 provides bf16 and 8-bit bundles when you want the transcript-conditioned multilingual path.

Quality tips

Five rules from the production tests.

  • 1
    5–30 s of clean speech. No background music, no overlapping voices, no heavy compression. The reference embeds the speaker — anything else in the clip leaks into the clone.
  • 2
    Always pass the transcript. --cosy-reference-transcript gives the LLM the linguistic context for the prompt audio. Skipping it costs accuracy and produces mid-utterance drifts.
  • 3
    Long-form text is auto-segmented. The synthesiser splits on sentence boundaries and reuses the same voice profile across segments — voice stays consistent across chapters or full podcasts.
  • 4
    The 8-bit bundle sounds cleaner. Same architecture, lower quantisation noise in the LLM logits — picks more text-aligned speech tokens, drifts less on long output.
  • 5
    Reuse voiceProfile across calls. extractVoiceProfile(…) runs the S3 tokenizer + mel extractor + CAM++ once per reference. Reuse the resulting struct across every synthesis call.
Deeper reading

Component guides.