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 voicelet result = try await tts. generate ( text : "Hello" , speaker : . ryan )
Identifier: aidenEnum: .aidenDescription: Male voicelet result = try await tts. generate ( text : "Hello" , speaker : . aiden )
Identifier: ono-annaEnum: .onoAnnaDescription: Female voicelet result = try await tts. generate ( text : "こんにちは" , speaker : . onoAnna , language : . japanese )
Identifier: soheeEnum: .soheeDescription: Female voicelet result = try await tts. generate ( text : "안녕하세요" , speaker : . sohee , language : . korean )
Identifier: ericEnum: .ericDescription: Male voicelet result = try await tts. generate ( text : "Hello" , speaker : . eric )
Identifier: dylanEnum: .dylanDescription: Male voicelet result = try await tts. generate ( text : "Hello" , speaker : . dylan )
Identifier: serenaEnum: .serenaDescription: Female voicelet result = try await tts. generate ( text : "Bonjour" , speaker : . serena , language : . french )
Identifier: vivianEnum: .vivianDescription: Female voicelet result = try await tts. generate ( text : "Hello" , speaker : . vivian )
Identifier: uncle-fuEnum: .uncleFuDescription: Male voicelet result = try await tts. generate ( text : "你好" , speaker : . uncleFu , language : . chinese )
Available Languages
TTSKit supports 10 languages:
Language Identifier Enum English english.englishChinese chinese.chineseJapanese japanese.japaneseKorean korean.koreanGerman german.germanFrench french.frenchRussian russian.russianPortuguese portuguese.portugueseSpanish spanish.spanishItalian italian.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"
)
Typed Enums (Recommended)
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