Kokoro TTS
Kokoro-82M là mô hình tổng hợp giọng nói nhẹ, không tự hồi quy dựa trên StyleTTS 2 với vocoder ISTFTNet. Nó chạy hoàn toàn trên Neural Engine thông qua CoreML, tạo ra giọng nói tự nhiên 24 kHz từ văn bản đầu vào trong một forward pass duy nhất.
Kokoro-82M được thiết kế cho triển khai on-device trên iOS. Với 82M tham số (~80 MB với 1 bucket, INT8), nó vừa vặn trên iPhone và iPad. CoreML chạy trên Neural Engine, để GPU rảnh rỗi cho các tác vụ khác.
Ngôn ngữ được hỗ trợ
| Ngôn ngữ | Mã | Giọng ví dụ |
|---|---|---|
| Tiếng Anh (Mỹ) | en | af_heart, am_adam, af_sky |
| Tiếng Anh (Anh) | en | bf_emma, bm_george |
| Tiếng Tây Ban Nha | es | ef_dora |
| Tiếng Pháp | fr | ff_siwis |
| Tiếng Hindi | hi | hf_alpha, hm_omega |
| Tiếng Ý | it | if_sara |
| Tiếng Nhật | ja | jf_alpha, jm_omega |
| Tiếng Bồ Đào Nha | pt | pf_dora |
| Tiếng Trung | zh | zf_xiaobei, zm_yunjian |
| Tiếng Hàn | ko | kf_somi |
Tổng cộng 50 giọng dựng sẵn. Quy ước đặt tên giọng: [language_prefix][gender]_[name] — ví dụ, af_heart = nữ Mỹ "Heart", if_sara = nữ Ý "Sara".
Tham chiếu mã giọng
Mọi voice ID của Kokoro đều theo cùng một mẫu: tiền tố ngôn ngữ một chữ cái, mã giới tính một chữ cái, rồi gạch dưới và tên giọng. Dùng bảng dưới đây để ánh xạ ngôn ngữ đích sang tiền tố đúng.
Bảng tiền tố ngôn ngữ
| Tiền tố | Ngôn ngữ | Khu vực | Giới tính |
|---|---|---|---|
a | Tiếng Anh | Mỹ (en-US) | af_, am_ |
b | Tiếng Anh | Anh (en-GB) | bf_, bm_ |
e | Tiếng Tây Ban Nha | (es) | ef_, em_ |
f | Tiếng Pháp | (fr-FR) | ff_ |
h | Tiếng Hindi | (hi) | hf_, hm_ |
i | Tiếng Ý | (it) | if_, im_ |
j | Tiếng Nhật | (ja) | jf_, jm_ |
k | Tiếng Hàn | (ko) | kf_ |
p | Tiếng Bồ Đào Nha | Brazil (pt-BR) | pf_, pm_ |
z | Tiếng Trung | Quan thoại (zh) | zf_, zm_ |
Tất cả giọng theo ngôn ngữ
Tiếng Anh — Mỹ (af_*, am_*)
Nữ: af_alloy, af_aoede, af_bella, af_heart (mặc định), af_jessica, af_kore, af_nicole, af_nova, af_river, af_sarah, af_sky
Nam: am_adam, am_echo, am_eric, am_fenrir, am_liam, am_michael, am_onyx, am_puck, am_santa
Tiếng Anh — Anh (bf_*, bm_*)
Nữ: bf_alice, bf_emma, bf_isabella, bf_lily
Nam: bm_daniel, bm_fable, bm_george, bm_lewis
Tiếng Tây Ban Nha (ef_*, em_*)
Nữ: ef_dora
Nam: em_alex, em_santa
Tiếng Pháp (ff_*)
Nữ: ff_siwis
Tiếng Hindi (hf_*, hm_*)
Nữ: hf_alpha, hf_beta
Nam: hm_omega, hm_psi
Tiếng Ý (if_*, im_*)
Nữ: if_sara
Nam: im_nicola
Tiếng Nhật (jf_*, jm_*)
Nữ: jf_alpha, jf_gongitsune, jf_nezumi, jf_tebukuro
Nam: jm_kumo
Tiếng Hàn (kf_*)
Nữ: kf_somi
Tiếng Bồ Đào Nha — Brazil (pf_*, pm_*)
Nữ: pf_dora
Nam: pm_alex, pm_santa
Tiếng Trung — Quan thoại (zf_*, zm_*)
Nữ: zf_xiaobei, zf_xiaoni, zf_xiaoxiao, zf_xiaoyi
Nam: zm_yunjian, zm_yunxi, zm_yunxia, zm_yunyang
Chạy speech kokoro --list-voices để in tất cả các giọng hiện được đóng gói cùng mô hình. Voice ID ổn định giữa các bản phát hành — dùng chuỗi chính xác (ví dụ if_sara) khi gọi --voice từ CLI hoặc truyền voice: vào API Swift.
Kiến trúc
Kokoro sử dụng pipeline CoreML 3 giai đoạn. Không có vòng lặp sampling — mọi giai đoạn đều là forward pass không tự hồi quy với một bước căn chỉnh phía Swift giữa giai đoạn 1 và 2.
Pipeline 3 giai đoạn
| Giai đoạn | Mô hình | Đầu vào | Đầu ra |
|---|---|---|---|
| 1. Duration | duration.mlmodelc | Token âm vị + embedding giọng + tốc độ | Thời lượng, đặc trưng ngữ điệu, mã hóa văn bản |
| — | Căn chỉnh phía Swift | Thời lượng + đặc trưng giai đoạn 1 | Đặc trưng ngữ điệu và văn bản đã căn chỉnh |
| 2. Prosody | prosody.mlmodelc | Đặc trưng ngữ điệu đã căn chỉnh + style | Dự đoán F0 (cao độ) + nhiễu |
| 3. Decoder | decoder_*.mlmodelc | Văn bản đã căn chỉnh + F0 + nhiễu + style | Dạng sóng âm thanh 24 kHz |
Bucket âm vị (mô hình duration)
Mô hình duration dùng các hình dạng đầu vào liệt kê. Đầu vào được padding tới bucket nhỏ nhất vừa với nó:
| Bucket | Tối đa âm vị | Trường hợp sử dụng |
|---|---|---|
| p16 | 16 | Cụm từ ngắn |
| p32 | 32 | Câu ngắn |
| p64 | 64 | Câu trung bình |
| p128 | 128 | Câu dài |
Bucket của decoder
Các mô hình decoder hình dạng cố định cho các độ dài âm thanh tối đa khác nhau (mỗi frame = 600 mẫu ở 24 kHz):
| Bucket | Tối đa frame | Tối đa âm thanh |
|---|---|---|
decoder_5s | 200 | 5.0s |
decoder_10s | 400 | 10.0s |
decoder_15s | 600 | 15.0s |
Yêu cầu iOS 18+ / macOS 15+.
Phonemizer
Văn bản được chuyển thành token âm vị qua pipeline ba tầng — tất cả đều có giấy phép Apache-2.0, không có phụ thuộc GPL:
- Tra cứu từ điển — Từ điển phát âm tiếng Anh Mỹ và Anh-Anh với hỗ trợ heteronym
- Stemming hậu tố — Phân tích hình thái cho các hậu tố đã biết (ví dụ "-ing", "-tion")
- BART G2P — Fallback grapheme-to-phoneme bằng nơ-ron qua một mô hình CoreML encoder-decoder riêng cho các từ ngoài từ vựng
Trọng số mô hình
| Thành phần | Kích thước | Định dạng |
|---|---|---|
| Mô hình duration | ~39 MB | .mlmodelc |
| Mô hình prosody | ~17 MB | .mlmodelc |
| Mô hình decoder (3 bucket) | ~107 MB mỗi cái | .mlmodelc |
| Embedding giọng (54 giọng) | ~0.3 MB | JSON (Float32 256 chiều) |
| G2P encoder + decoder | ~1.5 MB | .mlmodelc |
| Từ điển + vocab | ~6 MB | JSON |
| Tổng (1 decoder) | ~170 MB |
Hiệu năng
| Chỉ số | Giá trị |
|---|---|
| Tham số | 82M |
| Backend suy luận | CoreML (Neural Engine) |
| RTFx suy luận | ~0.7 (nhanh hơn thời gian thực) |
| Tần số lấy mẫu đầu ra | 24 kHz |
| Bộ nhớ trọng số | ~170 MB (1 bucket decoder) |
Khác với Qwen3-TTS và CosyVoice3 sinh token từng bước, Kokoro dùng pipeline 3 giai đoạn không có vòng lặp sampling. Mọi giai đoạn đều là forward pass tất định.
Sử dụng CLI
speech kokoro "Hello, world!" --voice af_heart --output hello.wav
Tùy chọn
| Tùy chọn | Mặc định | Mô tả |
|---|---|---|
<text> | Văn bản cần tổng hợp | |
--voice | af_heart | Tên preset giọng |
--language | en | Mã ngôn ngữ: en, es, fr, hi, it, ja, pt, zh, ko, de |
--output, -o | kokoro_output.wav | Đường dẫn file WAV đầu ra |
--list-voices | Liệt kê tất cả các giọng có sẵn rồi thoát | |
--model, -m | Model ID trên HuggingFace |
Ví dụ
# English with default voice
speech kokoro "Hello, how are you today?" --output hello.wav
# French
speech kokoro "Bonjour le monde" --voice ff_siwis --language fr --output bonjour.wav
# Japanese
speech kokoro "こんにちは世界" --voice jf_alpha --language ja --output konnichiwa.wav
# List all 50 voices
speech kokoro --list-voices
API Swift
import KokoroTTS
import AudioCommon
let tts = try await KokoroTTSModel.fromPretrained()
// Downloads ~170 MB on first run
let audio = try tts.synthesize(text: "Hello world", voice: "af_heart")
// audio: [Float] — 24 kHz mono PCM
try WAVWriter.write(samples: audio, sampleRate: 24000, to: outputURL)
Ghi đè compute unit
fromPretrained(computeUnits:) chọn phần cứng nào sẽ chạy mô hình CoreML chính. Mặc định (.all) để Core ML ưu tiên Neural Engine, đây là đường dẫn nhanh nhất trên mọi thiết bị được hỗ trợ. Truyền .cpuAndGPU để bỏ qua ANE như một phương án dự phòng trên các nền tảng mà trình biên dịch ANE tạo ra kết quả không chính xác cho mô hình này.
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)
Khi nào nên dùng Kokoro
| Trường hợp sử dụng | TTS được đề xuất |
|---|---|
| App iOS, nhẹ, tiết kiệm pin | Kokoro (CoreML, 82M params, ~170 MB) |
| Chất lượng cao nhất, streaming, nhân bản giọng nói | Qwen3-TTS (MLX, 600M params, ~1.7 GB) |
| Streaming đa ngôn ngữ, 9 ngôn ngữ | CosyVoice3 (MLX, 500M params, ~1.2 GB) |
| Hội thoại nói full-duplex | PersonaPlex (MLX, 7B params, ~5.5 GB) |
Giấy phép
- Trọng số mô hình: Apache-2.0 (hexgrad/Kokoro-82M)
- Chuyển đổi CoreML: Apache-2.0 (aufklarer/Kokoro-82M-CoreML)
- Từ điển và G2P: Apache-2.0