Kokoro TTS
Kokoro-82M은 ISTFTNet 보코더를 갖춘 StyleTTS 2 기반의 경량 비자동 회귀 텍스트-음성 변환 모델입니다. 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 | 음소 토큰 + 음색 임베딩 + 속도 | 지속 시간, 운율 특징, 텍스트 인코딩 |
| — | Swift 얼라인먼트 | 지속 시간 + 1단계 특징 | 정렬된 운율 및 텍스트 특징 |
| 2. Prosody | prosody.mlmodelc | 정렬된 운율 특징 + 스타일 | F0 (피치) + 노이즈 예측 |
| 3. Decoder | decoder_*.mlmodelc | 정렬된 텍스트 + F0 + 노이즈 + 스타일 | 24 kHz 오디오 파형 |
음소 버킷 (Duration 모델)
Duration 모델은 열거된 입력 형태를 사용합니다. 입력은 맞는 가장 작은 버킷으로 패딩됩니다:
| 버킷 | 최대 음소 | 사용 사례 |
|---|---|---|
| p16 | 16 | 짧은 구 |
| p32 | 32 | 짧은 문장 |
| p64 | 64 | 중간 문장 |
| p128 | 128 | 긴 문장 |
디코더 버킷
서로 다른 최대 오디오 길이를 위한 고정 형태 디코더 모델(각 프레임 = 24 kHz에서 600 샘플):
| 버킷 | 최대 프레임 | 최대 오디오 |
|---|---|---|
decoder_5s | 200 | 5.0초 |
decoder_10s | 400 | 10.0초 |
decoder_15s | 600 | 15.0초 |
iOS 18+ / macOS 15+가 필요합니다.
음소화
텍스트는 3계층 파이프라인을 통해 음소 토큰으로 변환됩니다 — 모두 Apache-2.0 라이선스이며, GPL 종속성이 없습니다:
- 사전 조회 — 동음이의어를 지원하는 미국/영국 영어 발음 사전
- 접미사 어간화 — 알려진 접미사(예: "-ing", "-tion")에 대한 형태학적 분해
- BART G2P — OOV 단어를 위한 별도의 CoreML 인코더-디코더 모델을 사용하는 신경 grapheme-to-phoneme 폴백
모델 웨이트
| 구성 요소 | 크기 | 포맷 |
|---|---|---|
| Duration 모델 | 약 39 MB | .mlmodelc |
| Prosody 모델 | 약 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개) |
토큰을 단계별로 생성하는 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