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を解放します。
サポート言語
| 言語 | コード | 例ボイス |
|---|---|---|
| 英語 (US) | en | af_heart, am_adam, af_sky |
| 英語 (UK) | 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 は同じパターンに従います:1 文字の言語プレフィックス、1 文字の性別コード、アンダースコア、続いて音声名。対象言語と対応するプレフィックスは下表を参照してください。
言語プレフィックス表
| プレフィックス | 言語 | ロケール | 性別サフィックス |
|---|---|---|---|
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 | 音素トークン + ボイスembedding + 速度 | 継続時間、韻律特徴量、テキストエンコーディング |
| — | Swift整列 | 継続時間 + ステージ1特徴量 | 整列された韻律 & テキスト特徴量 |
| 2. Prosody | prosody.mlmodelc | 整列された韻律特徴量 + スタイル | F0(ピッチ)+ ノイズ予測 |
| 3. Decoder | decoder_*.mlmodelc | 整列されたテキスト + F0 + ノイズ + スタイル | 24 kHz音声波形 |
音素バケット(Durationモデル)
Durationモデルは列挙された入力形状を使用します。入力は、それに収まる最小のバケットにパディングされます:
| バケット | 最大音素 | ユースケース |
|---|---|---|
| p16 | 16 | 短いフレーズ |
| p32 | 32 | 短い文 |
| p64 | 64 | 中程度の文 |
| p128 | 128 | 長い文 |
Decoderバケット
異なる最大音声長のための固定形状デコーダーモデル(各フレーム = 24 kHzで600サンプル):
| バケット | 最大フレーム | 最大音声 |
|---|---|---|
decoder_5s | 200 | 5.0秒 |
decoder_10s | 400 | 10.0秒 |
decoder_15s | 600 | 15.0秒 |
iOS 18+ / macOS 15+が必要です。
Phonemizer
テキストは3層パイプライン経由で音素トークンに変換されます — すべてApache-2.0ライセンス、GPL依存なし:
- 辞書検索 — 異音字サポート付きの米国英語と英国英語の発音辞書
- 接尾辞語幹化 — 既知の接尾辞(例:「-ing」、「-tion」)の形態論的分解
- BART G2P — 語彙外単語のための別のCoreMLエンコーダー-デコーダーモデルを使用したニューラル書記素-音素フォールバック
モデルウェイト
| コンポーネント | サイズ | 形式 |
|---|---|---|
| Durationモデル | 約39 MB | .mlmodelc |
| Prosodyモデル | 約17 MB | .mlmodelc |
| Decoderモデル(3バケット) | 各約107 MB | .mlmodelc |
| ボイスembedding(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