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개의 프리셋 음색. 음색 명명 규칙: [언어][성별]_[이름] — 예: af_heart = American Female "Heart".
아키텍처
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 사용법
audio 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 |
예제
# 기본 음색으로 영어
audio kokoro "Hello, how are you today?" --output hello.wav
# 프랑스어
audio kokoro "Bonjour le monde" --voice ff_siwis --language fr --output bonjour.wav
# 일본어
audio kokoro "こんにちは世界" --voice jf_alpha --language ja --output konnichiwa.wav
# 50개 음색 모두 나열
audio 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)
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