Kokoro TTS
Kokoro-82M — это лёгкая неавторегрессивная модель синтеза речи на основе StyleTTS 2 с ISTFTNet-вокодером. Она работает полностью на Neural Engine через CoreML, производя естественную речь 24 кГц из текста за один прямой проход.
Kokoro-82M спроектирована для развёртывания на устройстве под iOS. При 82M параметров (~80 МБ с 1 бакетом, INT8) она комфортно помещается на iPhone и iPad. CoreML работает на Neural Engine, оставляя GPU свободным для других задач.
Поддерживаемые языки
| Язык | Код | Примеры голосов |
|---|---|---|
| Английский (США) | en | af_heart, am_adam, af_sky |
| Английский (Великобритания) | en | bf_emma, bm_george |
| Испанский | es | ef_dora |
| Французский | fr | ff_siwis |
| Хинди | hi | hf_alpha, hm_omega |
| Итальянский | it | if_sara |
| Японский | ja | jf_alpha, jm_omega |
| Португальский | pt | pf_dora |
| Китайский | zh | zf_xiaobei, zm_yunjian |
| Корейский | ko | kf_somi |
Всего 50 предустановленных голосов. Соглашение об именах: [language_prefix][gender]_[name] — например, af_heart = американская женщина «Heart», if_sara = итальянская женщина «Sara».
Справочник кодов голосов
Каждый идентификатор голоса Kokoro следует одной схеме: однобуквенный префикс языка, однобуквенный код пола, символ подчёркивания, затем имя голоса. Используйте таблицу ниже, чтобы сопоставить нужный язык с правильным префиксом.
Таблица языковых префиксов
| Префикс | Язык | Локаль | Суффиксы пола |
|---|---|---|---|
a | Английский | Американский (en-US) | af_, am_ |
b | Английский | Британский (en-GB) | bf_, bm_ |
e | Испанский | (es) | ef_, em_ |
f | Французский | (fr-FR) | ff_ |
h | Хинди | (hi) | hf_, hm_ |
i | Итальянский | (it) | if_, im_ |
j | Японский | (ja) | jf_, jm_ |
k | Корейский | (ko) | kf_ |
p | Португальский | Бразильский (pt-BR) | pf_, pm_ |
z | Китайский | Мандарин (zh) | zf_, zm_ |
Все голоса по языкам
Английский — Американский (af_*, am_*)
Женские: af_alloy, af_aoede, af_bella, af_heart (по умолчанию), af_jessica, af_kore, af_nicole, af_nova, af_river, af_sarah, af_sky
Мужские: am_adam, am_echo, am_eric, am_fenrir, am_liam, am_michael, am_onyx, am_puck, am_santa
Английский — Британский (bf_*, bm_*)
Женские: bf_alice, bf_emma, bf_isabella, bf_lily
Мужские: bm_daniel, bm_fable, bm_george, bm_lewis
Испанский (ef_*, em_*)
Женские: ef_dora
Мужские: em_alex, em_santa
Французский (ff_*)
Женские: ff_siwis
Хинди (hf_*, hm_*)
Женские: hf_alpha, hf_beta
Мужские: hm_omega, hm_psi
Итальянский (if_*, im_*)
Женские: if_sara
Мужские: im_nicola
Японский (jf_*, jm_*)
Женские: jf_alpha, jf_gongitsune, jf_nezumi, jf_tebukuro
Мужские: jm_kumo
Корейский (kf_*)
Женские: kf_somi
Португальский — Бразильский (pf_*, pm_*)
Женские: pf_dora
Мужские: pm_alex, pm_santa
Китайский — Мандарин (zf_*, zm_*)
Женские: zf_xiaobei, zf_xiaoni, zf_xiaoxiao, zf_xiaoyi
Мужские: zm_yunjian, zm_yunxi, zm_yunxia, zm_yunyang
Выполните speech kokoro --list-voices, чтобы вывести все голоса, входящие в модель. Идентификаторы голосов стабильны между релизами — используйте точную строку (например, if_sara) при вызове --voice из CLI или при передаче voice: в Swift API.
Архитектура
Kokoro использует 3-этапный CoreML-пайплайн. Нет цикла сэмплирования — все этапы представляют собой неавторегрессивные прямые проходы со шагом выравнивания на стороне Swift между этапами 1 и 2.
3-этапный пайплайн
| Этап | Модель | Вход | Выход |
|---|---|---|---|
| 1. Duration | duration.mlmodelc | Фонемные токены + эмбеддинг голоса + скорость | Длительности, просодические признаки, кодирование текста |
| — | Выравнивание на Swift | Длительности + признаки этапа 1 | Выровненные просодические и текстовые признаки |
| 2. Prosody | prosody.mlmodelc | Выровненные просодические признаки + стиль | F0 (высота тона) + шумовые предсказания |
| 3. Decoder | decoder_*.mlmodelc | Выровненный текст + F0 + шум + стиль | Аудиоволна 24 кГц |
Фонемные бакеты (Duration-модель)
Duration-модель использует перечисленные входные формы. Вход дополняется до наименьшего подходящего бакета:
| Бакет | Макс. фонем | Сценарий |
|---|---|---|
| p16 | 16 | Короткие фразы |
| p32 | 32 | Короткие предложения |
| p64 | 64 | Средние предложения |
| p128 | 128 | Длинные предложения |
Бакеты декодера
Декодер-модели с фиксированной формой для разной максимальной длины аудио (каждый кадр = 600 сэмплов при 24 кГц):
| Бакет | Макс. кадров | Макс. аудио |
|---|---|---|
decoder_5s | 200 | 5.0 с |
decoder_10s | 400 | 10.0 с |
decoder_15s | 600 | 15.0 с |
Требуется iOS 18+ / macOS 15+.
Фонемизатор
Текст преобразуется в фонемные токены через трёхуровневый пайплайн — всё под лицензией Apache-2.0, без GPL-зависимостей:
- Поиск в словаре — Словари произношения американского и британского английского с поддержкой гетеронимов
- Суффиксный стемминг — Морфологическое разложение для известных суффиксов (например, «-ing», «-tion»)
- BART G2P — Нейронный грапефема-в-фонему fallback через отдельную CoreML encoder-decoder модель для слов вне словаря
Веса модели
| Компонент | Размер | Формат |
|---|---|---|
| Duration-модель | ~39 МБ | .mlmodelc |
| Prosody-модель | ~17 МБ | .mlmodelc |
| Decoder-модели (3 бакета) | ~107 МБ каждая | .mlmodelc |
| Голосовые эмбеддинги (54 голоса) | ~0.3 МБ | JSON (256-мерные Float32) |
| G2P encoder + decoder | ~1.5 МБ | .mlmodelc |
| Словари + vocab | ~6 МБ | JSON |
| Всего (1 decoder) | ~170 МБ |
Производительность
| Метрика | Значение |
|---|---|
| Параметры | 82M |
| Бэкенд инференса | CoreML (Neural Engine) |
| RTFx инференса | ~0.7 (быстрее реального времени) |
| Частота дискретизации на выходе | 24 кГц |
| Память весов | ~170 МБ (1 decoder-бакет) |
В отличие от Qwen3-TTS и CosyVoice3, которые генерируют токены пошагово, Kokoro использует 3-этапный пайплайн без цикла сэмплирования. Все этапы — детерминированные прямые проходы.
Использование CLI
speech kokoro "Hello, world!" --voice af_heart --output hello.wav
Опции
| Опция | По умолчанию | Описание |
|---|---|---|
<text> | Текст для синтеза | |
--voice | af_heart | Имя пресета голоса |
--language | en | Код языка: en, es, fr, hi, it, ja, pt, zh, ko, de |
--output, -o | kokoro_output.wav | Путь выходного WAV-файла |
--list-voices | Перечислить все доступные голоса и выйти | |
--model, -m | Model ID на HuggingFace |
Примеры
# Английский с голосом по умолчанию
speech kokoro "Hello, how are you today?" --output hello.wav
# Французский
speech kokoro "Bonjour le monde" --voice ff_siwis --language fr --output bonjour.wav
# Японский
speech kokoro "こんにちは世界" --voice jf_alpha --language ja --output konnichiwa.wav
# Перечислить все 50 голосов
speech kokoro --list-voices
Swift API
import KokoroTTS
import AudioCommon
let tts = try await KokoroTTSModel.fromPretrained()
// Скачает ~170 МБ при первом запуске
let audio = try tts.synthesize(text: "Hello world", voice: "af_heart")
// audio: [Float] — 24 кГц моно PCM
try WAVWriter.write(samples: audio, sampleRate: 24000, to: outputURL)
Compute Unit Override
fromPretrained(computeUnits:) selects which hardware runs the main CoreML model. The default (.all) lets Core ML prefer the Neural Engine, which is the fastest path on every supported device. Pass .cpuAndGPU to bypass the ANE as a fallback on platforms where the ANE compiler produces incorrect output for this model.
import CoreML
import KokoroTTS
// Default: ANE preferred
let tts = try await KokoroTTSModel.fromPretrained()
// Fallback: bypass the Neural Engine
let tts = try await KokoroTTSModel.fromPretrained(computeUnits: .cpuAndGPU)
Когда использовать Kokoro
| Сценарий | Рекомендуемый TTS |
|---|---|
| iOS-приложение, лёгкий, экономичный по батарее | Kokoro (CoreML, 82M параметров, ~170 МБ) |
| Наивысшее качество, потоковый, клонирование голоса | Qwen3-TTS (MLX, 600M параметров, ~1.7 ГБ) |
| Многоязычный потоковый, 9 языков | CosyVoice3 (MLX, 500M параметров, ~1.2 ГБ) |
| Полнодуплексный голосовой диалог | PersonaPlex (MLX, 7B параметров, ~5.5 ГБ) |
Лицензия
- Веса модели: Apache-2.0 (hexgrad/Kokoro-82M)
- CoreML-конвертация: Apache-2.0 (aufklarer/Kokoro-82M-CoreML)
- Словари и G2P: Apache-2.0