Kokoro TTS
Kokoro-82M 是一个轻量级、非自回归的文本转语音模型,基于 StyleTTS 2 与 ISTFTNet 声码器。它通过 CoreML 完全运行在 Neural Engine 上,以单次前向从文本输入生成自然的 24 kHz 语音。
Kokoro-82M 专为端侧 iOS 部署而设计。82M 参数(1 个桶、INT8 约 80 MB),可轻松适配 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 语音 ID 都遵循相同模式:单字母 语言前缀、单字母 性别代码、下划线,再加上语音名称。下表将目标语言映射到对应的前缀。
语言前缀表
| 前缀 | 语言 | 地区 | 性别后缀 |
|---|---|---|---|
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 打印模型当前自带的全部语音。语音 ID 在各版本中保持稳定 — 在 CLI 中使用 --voice 或在 Swift API 中传入 voice: 时,请使用准确字符串(例如 if_sara)。
架构
Kokoro 使用 3 阶段 CoreML 流水线。没有采样循环 — 所有阶段都是非自回归前向传递,在第 1 和第 2 阶段之间有一次 Swift 端的对齐步骤。
3 阶段流水线
| 阶段 | 模型 | 输入 | 输出 |
|---|---|---|---|
| 1. Duration | duration.mlmodelc | 音素 token + 音色嵌入 + 速度 | 时长、韵律特征、文本编码 |
| — | Swift 对齐 | 时长 + 阶段 1 特征 | 对齐后的韵律与文本特征 |
| 2. Prosody | prosody.mlmodelc | 对齐韵律特征 + 风格 | F0(音高)+ 噪声预测 |
| 3. Decoder | decoder_*.mlmodelc | 对齐文本 + F0 + 噪声 + 风格 | 24 kHz 音频波形 |
音素桶(时长模型)
时长模型使用枚举输入形状。输入会填充至最小的可容纳桶:
| 桶 | 最大音素数 | 使用场景 |
|---|---|---|
| p16 | 16 | 短语 |
| p32 | 32 | 短句 |
| p64 | 64 | 中等长度句 |
| p128 | 128 | 长句 |
解码器桶
用于不同最大音频长度的固定形状解码器模型(24 kHz 下每帧 = 600 个样本):
| 桶 | 最大帧数 | 最大音频 |
|---|---|---|
decoder_5s | 200 | 5.0s |
decoder_10s | 400 | 10.0s |
decoder_15s | 600 | 15.0s |
需要 iOS 18+ / macOS 15+。
音素化器
文本通过三层流水线转换为音素 token — 全部采用 Apache-2.0 许可证,无 GPL 依赖:
- 字典查找 — 美英与英式英语发音字典,支持多音字
- 后缀词干处理 — 对已知后缀进行形态分解(例如 "-ing"、"-tion")
- BART G2P — 使用独立的 CoreML 编码器-解码器模型作为神经字素到音素的兜底,处理词表外的词
模型权重
| 组件 | 大小 | 格式 |
|---|---|---|
| 时长模型 | ~39 MB | .mlmodelc |
| 韵律模型 | ~17 MB | .mlmodelc |
| 解码器模型(3 个桶) | 每个 ~107 MB | .mlmodelc |
| 音色嵌入(54 种音色) | ~0.3 MB | JSON(256 维 Float32) |
| G2P 编码器 + 解码器 | ~1.5 MB | .mlmodelc |
| 字典 + 词表 | ~6 MB | JSON |
| 合计(1 个解码器) | ~170 MB |
性能
| 指标 | 数值 |
|---|---|
| 参数 | 82M |
| 推理后端 | CoreML(Neural Engine) |
| 推理 RTFx | ~0.7(快于实时) |
| 输出采样率 | 24 kHz |
| 权重内存 | ~170 MB(1 个解码器桶) |
与逐步生成 token 的 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 | HuggingFace 模型 ID |
示例
# 使用默认音色的英文
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 MB
let audio = try tts.synthesize(text: "Hello world", voice: "af_heart")
// audio: [Float] — 24 kHz 单声道 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 MB) |
| 最高质量、流式、声音克隆 | Qwen3-TTS(MLX,600M 参数,~1.7 GB) |
| 多语言流式,9 种语言 | CosyVoice3(MLX,500M 参数,~1.2 GB) |
| 全双工语音对话 | PersonaPlex(MLX,7B 参数,~5.5 GB) |
许可证
- 模型权重:Apache-2.0(hexgrad/Kokoro-82M)
- CoreML 转换:Apache-2.0(aufklarer/Kokoro-82M-CoreML)
- 字典与 G2P:Apache-2.0