Skip to main content
TTSKit supports 9 built-in voices and 10 languages through the Qwen3 TTS models.

Available Voices

The following voices are available:
Identifier: ryanEnum: .ryanDescription: Default male voice
let result = try await tts.generate(text: "Hello", speaker: .ryan)
Identifier: aidenEnum: .aidenDescription: Male voice
let result = try await tts.generate(text: "Hello", speaker: .aiden)
Identifier: ono-annaEnum: .onoAnnaDescription: Female voice
let result = try await tts.generate(text: "こんにちは", speaker: .onoAnna, language: .japanese)
Identifier: soheeEnum: .soheeDescription: Female voice
let result = try await tts.generate(text: "안녕하세요", speaker: .sohee, language: .korean)
Identifier: ericEnum: .ericDescription: Male voice
let result = try await tts.generate(text: "Hello", speaker: .eric)
Identifier: dylanEnum: .dylanDescription: Male voice
let result = try await tts.generate(text: "Hello", speaker: .dylan)
Identifier: serenaEnum: .serenaDescription: Female voice
let result = try await tts.generate(text: "Bonjour", speaker: .serena, language: .french)
Identifier: vivianEnum: .vivianDescription: Female voice
let result = try await tts.generate(text: "Hello", speaker: .vivian)
Identifier: uncle-fuEnum: .uncleFuDescription: Male voice
let result = try await tts.generate(text: "你好", speaker: .uncleFu, language: .chinese)

Available Languages

TTSKit supports 10 languages:
LanguageIdentifierEnum
Englishenglish.english
Chinesechinese.chinese
Japanesejapanese.japanese
Koreankorean.korean
Germangerman.german
Frenchfrench.french
Russianrussian.russian
Portugueseportuguese.portuguese
Spanishspanish.spanish
Italianitalian.italian

Using Voices and Languages

String Identifiers

You can use string identifiers directly:
let result = try await tts.generate(
    text: "こんにちは世界",
    voice: "ono-anna",
    language: "japanese"
)
For type safety, use the Qwen3Speaker and Qwen3Language enums:
import TTSKit

let result = try await tts.generate(
    text: "こんにちは世界",
    speaker: .onoAnna,
    language: .japanese
)

Default Voice and Language

If not specified, TTSKit uses the model’s defaults:
// Uses default voice (ryan) and language (english)
let result = try await tts.generate(text: "Hello")
The defaults are:
  • Voice: ryan
  • Language: english

Voice Selection Examples

English

// Multiple English voices
let ryan = try await tts.generate(text: "Hello from Ryan", speaker: .ryan)
let aiden = try await tts.generate(text: "Hello from Aiden", speaker: .aiden)
let eric = try await tts.generate(text: "Hello from Eric", speaker: .eric)
let dylan = try await tts.generate(text: "Hello from Dylan", speaker: .dylan)
let serena = try await tts.generate(text: "Hello from Serena", speaker: .serena)
let vivian = try await tts.generate(text: "Hello from Vivian", speaker: .vivian)

Japanese

let result = try await tts.generate(
    text: "こんにちは、世界。今日はいい天気ですね。",
    speaker: .onoAnna,
    language: .japanese
)

Chinese

let result = try await tts.generate(
    text: "你好,世界。今天天气很好。",
    speaker: .uncleFu,
    language: .chinese
)

Korean

let result = try await tts.generate(
    text: "안녕하세요, 세계. 오늘 날씨가 좋네요.",
    speaker: .sohee,
    language: .korean
)

French

let result = try await tts.generate(
    text: "Bonjour le monde. Il fait beau aujourd'hui.",
    speaker: .serena,
    language: .french
)

German

let result = try await tts.generate(
    text: "Hallo Welt. Heute ist schönes Wetter.",
    speaker: .eric,
    language: .german
)

Spanish

let result = try await tts.generate(
    text: "Hola mundo. Hace buen tiempo hoy.",
    speaker: .vivian,
    language: .spanish
)

Portuguese

let result = try await tts.generate(
    text: "Olá mundo. Está um bom tempo hoje.",
    speaker: .dylan,
    language: .portuguese
)

Russian

let result = try await tts.generate(
    text: "Привет мир. Сегодня хорошая погода.",
    speaker: .aiden,
    language: .russian
)

Italian

let result = try await tts.generate(
    text: "Ciao mondo. Oggi è una bella giornata.",
    speaker: .serena,
    language: .italian
)

Voice and Language Matching

All voices work with all languages, but some voices may sound more natural with certain languages based on the training data.
For the best results:
  • English: All voices work well
  • Chinese: uncleFu is recommended
  • Japanese: onoAnna is recommended
  • Korean: sohee is recommended
  • Other languages: Experiment with different voices

Prompt Cache by Voice/Language

TTSKit caches the prompt prefix separately for each voice/language combination:
// First call builds cache for (ryan, english)
let result1 = try await tts.generate(text: "Hello", speaker: .ryan, language: .english)

// Second call reuses cache (fast)
let result2 = try await tts.generate(text: "World", speaker: .ryan, language: .english)

// Different voice builds new cache
let result3 = try await tts.generate(text: "Hello", speaker: .aiden, language: .english)

// Different language builds new cache
let result4 = try await tts.generate(text: "こんにちは", speaker: .ryan, language: .japanese)
The cache eliminates ~90% of prefill cost on subsequent calls with the same voice/language.

Qwen3Speaker Enum

The Qwen3Speaker enum provides type-safe voice selection:
public enum Qwen3Speaker: String, CaseIterable, Sendable {
    case ryan       = "ryan"
    case aiden      = "aiden"
    case onoAnna    = "ono-anna"
    case sohee      = "sohee"
    case eric       = "eric"
    case dylan      = "dylan"
    case serena     = "serena"
    case vivian     = "vivian"
    case uncleFu    = "uncle-fu"
}

Qwen3Language Enum

The Qwen3Language enum provides type-safe language selection:
public enum Qwen3Language: String, CaseIterable, Sendable {
    case english    = "english"
    case chinese    = "chinese"
    case japanese   = "japanese"
    case korean     = "korean"
    case german     = "german"
    case french     = "french"
    case russian    = "russian"
    case portuguese = "portuguese"
    case spanish    = "spanish"
    case italian    = "italian"
}

Next Steps

Generation

Learn about generation options and chunking

Configuration

Configure compute units and model variants

Build docs developers (and LLMs) love