Kokoro TTS
Kokoro-82M เป็นโมเดลสังเคราะห์เสียงพูดจากข้อความขนาดเล็ก ไม่ใช่ autoregressive ที่อิงจาก StyleTTS 2 พร้อม vocoder ISTFTNet ทำงานทั้งหมดบน Neural Engine ผ่าน CoreML สร้างเสียงพูดธรรมชาติ 24 kHz จากข้อความอินพุตใน forward pass ครั้งเดียว
Kokoro-82M ถูกออกแบบสำหรับการ deploy แบบ on-device บน iOS ด้วย 82M พารามิเตอร์ (~80 MB ด้วย 1 bucket, 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 เสียง preset ทั้งหมด แบบแผนการตั้งชื่อเสียง: [language_prefix][gender]_[name] — เช่น af_heart = หญิงอเมริกัน "Heart", if_sara = หญิงอิตาลี "Sara"
อ้างอิงรหัสเสียง
ทุก voice ID ของ 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 เพื่อพิมพ์ทุกเสียงที่บันเดิลมาพร้อมโมเดลปัจจุบัน Voice ID เสถียรตลอดทุกรีลีส — ใช้สตริงที่แน่นอน (เช่น if_sara) เมื่อเรียก --voice จาก CLI หรือส่ง voice: ไปยัง API Swift
สถาปัตยกรรม
Kokoro ใช้ pipeline CoreML 3 ขั้นตอน ไม่มีลูป sampling — ทุกขั้นตอนเป็น forward pass ที่ไม่ใช่ autoregressive พร้อมขั้นจัดเรียงฝั่ง Swift ระหว่างขั้นที่ 1 และ 2
Pipeline 3 ขั้นตอน
| ขั้นตอน | โมเดล | อินพุต | เอาต์พุต |
|---|---|---|---|
| 1. Duration | duration.mlmodelc | โทเค็นหน่วยเสียง + embedding เสียง + ความเร็ว | ระยะเวลา, ฟีเจอร์ ของน้ำเสียง, การเข้ารหัสข้อความ |
| — | การจัดเรียงฝั่ง Swift | ระยะเวลา + ฟีเจอร์ขั้นที่ 1 | ฟีเจอร์น้ำเสียงและข้อความที่จัดเรียงแล้ว |
| 2. Prosody | prosody.mlmodelc | ฟีเจอร์น้ำเสียงที่จัดเรียงแล้ว + style | การทำนาย F0 (ระดับเสียง) + nosie |
| 3. Decoder | decoder_*.mlmodelc | ข้อความที่จัดเรียงแล้ว + F0 + nosie + style | รูปคลื่นเสียง 24 kHz |
Bucket หน่วยเสียง (โมเดล duration)
โมเดล duration ใช้รูปร่างอินพุตแบบ enumerated อินพุตจะถูก pad ไปยัง bucket ที่เล็กที่สุดที่พอดี:
| Bucket | หน่วยเสียงสูงสุด | กรณีการใช้งาน |
|---|---|---|
| p16 | 16 | วลีสั้น |
| p32 | 32 | ประโยคสั้น |
| p64 | 64 | ประโยคปานกลาง |
| p128 | 128 | ประโยคยาว |
Bucket ของ decoder
โมเดล decoder รูปร่างคงที่สำหรับความยาวเสียงสูงสุดต่างๆ (แต่ละ frame = 600 ตัวอย่างที่ 24 kHz):
| Bucket | Frame สูงสุด | เสียงสูงสุด |
|---|---|---|
decoder_5s | 200 | 5.0s |
decoder_10s | 400 | 10.0s |
decoder_15s | 600 | 15.0s |
ต้องการ iOS 18+ / macOS 15+
Phonemizer
ข้อความถูกแปลงเป็นโทเค็นหน่วยเสียงผ่าน pipeline สามชั้น — ทั้งหมดมีสัญญาอนุญาต Apache-2.0 ไม่มีการพึ่งพา GPL:
- การค้นหาในพจนานุกรม — พจนานุกรมการออกเสียงภาษาอังกฤษอเมริกันและบริติชพร้อมรองรับ heteronym
- Stemming คำต่อท้าย — การแยกส่วนรูปทางสัณฐานวิทยาสำหรับคำต่อท้ายที่รู้จัก (เช่น "-ing", "-tion")
- BART G2P — Fallback grapheme-to-phoneme แบบนิวรัลโดยใช้โมเดล CoreML encoder-decoder แยกต่างหากสำหรับคำที่อยู่นอกพจนานุกรม
น้ำหนักโมเดล
| องค์ประกอบ | ขนาด | รูปแบบ |
|---|---|---|
| โมเดล duration | ~39 MB | .mlmodelc |
| โมเดล prosody | ~17 MB | .mlmodelc |
| โมเดล decoder (3 bucket) | ~107 MB ต่อตัว | .mlmodelc |
| Embedding เสียง (54 เสียง) | ~0.3 MB | JSON (Float32 256 มิติ) |
| G2P encoder + decoder | ~1.5 MB | .mlmodelc |
| พจนานุกรม + vocab | ~6 MB | JSON |
| รวม (1 decoder) | ~170 MB |
ประสิทธิภาพ
| ตัวชี้วัด | ค่า |
|---|---|
| พารามิเตอร์ | 82M |
| Backend การประมวลผล | CoreML (Neural Engine) |
| RTFx การประมวลผล | ~0.7 (เร็วกว่าเวลาจริง) |
| อัตราการสุ่มเอาต์พุต | 24 kHz |
| หน่วยความจำน้ำหนัก | ~170 MB (1 bucket decoder) |
ต่างจาก Qwen3-TTS และ CosyVoice3 ที่สร้างโทเค็นทีละขั้น Kokoro ใช้ pipeline 3 ขั้นตอนโดยไม่มีลูป sampling ทุกขั้นเป็น forward pass ที่กำหนดผลแน่นอน
การใช้งาน CLI
speech kokoro "Hello, world!" --voice af_heart --output hello.wav
ตัวเลือก
| ตัวเลือก | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|
<text> | ข้อความที่จะสังเคราะห์ | |
--voice | af_heart | ชื่อ preset เสียง |
--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 |
ตัวอย่าง
# 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)
การกำหนด compute unit
fromPretrained(computeUnits:) เลือกฮาร์ดแวร์ที่จะรันโมเดล CoreML หลัก ค่าเริ่มต้น (.all) ให้ Core ML เลือก Neural Engine เป็นอันดับแรก ซึ่งเป็นเส้นทางที่เร็วที่สุดบนทุกอุปกรณ์ที่รองรับ ส่ง .cpuAndGPU เพื่อข้าม ANE เป็นทางเลือกสำรองบนแพลตฟอร์มที่ compiler ของ ANE ให้ผลลัพธ์ที่ไม่ถูกต้องกับโมเดลนี้
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 params, ~170 MB) |
| คุณภาพสูงสุด, streaming, การโคลนเสียง | Qwen3-TTS (MLX, 600M params, ~1.7 GB) |
| Streaming หลายภาษา, 9 ภาษา | CosyVoice3 (MLX, 500M params, ~1.2 GB) |
| สนทนาพูดแบบ full-duplex | PersonaPlex (MLX, 7B params, ~5.5 GB) |
สัญญาอนุญาต
- น้ำหนักโมเดล: Apache-2.0 (hexgrad/Kokoro-82M)
- การแปลง CoreML: Apache-2.0 (aufklarer/Kokoro-82M-CoreML)
- พจนานุกรมและ G2P: Apache-2.0