Kokoro TTS — Android
Kokoro-82Mは、ONNX Runtime経由でAndroid上で動作する軽量、非自己回帰の音声合成モデルです。8言語にわたる50のプリセットボイスで自然な24 kHz音声を生成します。
サポート言語
| 言語 | コード | 例ボイス |
|---|---|---|
| 英語 (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 |
| ドイツ語 | de | dm_martin, df_victoria (ボイスパック) |
合計50のプリセットボイス。ボイス命名規則:[言語][性別]_[名前] — 例:af_heart = American Female "Heart"。
ドイツ語ボイスパック
ドイツ語は上記の多言語バンドルの音声ではありません。2 つのドイツ語音声は kikiri-tts による Kokoro-82M のファインチューニングで、それぞれドイツ語音素のみで学習した独立した 162 MB の重みセットです。ダウンロード時に KokoroPack で選び、language = "de" で合成します。各パックは独自のキャッシュを持つため、英語とドイツ語を並行してインストールできます。
| パック | 音声 | ダウンロード |
|---|---|---|
KokoroPack.GERMAN_MARTIN | dm_martin (男性) | soniqo/Kokoro-82M-German-Martin-ONNX (~170 MB) |
KokoroPack.GERMAN_VICTORIA | df_victoria (女性) | soniqo/Kokoro-82M-German-Victoria-ONNX (~170 MB) |
val modelDir = ModelManager.ensureTtsModels(
context,
ttsModel = TtsModel.KOKORO_SHORT_TURN,
kokoroPack = KokoroPack.GERMAN_MARTIN, // or GERMAN_VICTORIA
)
val tts = SpeechSynthesizer(SpeechSynthesizerConfig(modelDir = modelDir))
val audio = tts.synthesize("Am 3. Oktober um 18:30 Uhr kostet es 12,80 €.", "de")数字、序数、日付、時刻、通貨、単位、一般的な略語はデバイス上で読み上げ形に展開され、単語は 5 万語のドイツ語辞書(活用・複合語・規則によるフォールバック付き)から得られます。システム TTS エンジン(SpeechTextToSpeechService)は en-US に加えて Martin の音声を de-DE として提供します。
モデルファイル
| ファイル | サイズ |
|---|---|
kokoro-e2e.onnx + .onnx.data | 約330 MB |
voices.bin | ボイスembedding |
| 音素辞書 | 言語固有の発音データ |
HuggingFace: soniqo/Kokoro-82M-ONNX
パフォーマンス
| 指標 | 値 |
|---|---|
| パラメーター | 82M |
| 推論バックエンド | ONNX Runtime |
| 出力サンプリングレート | 24 kHz |
Phonemizer
テキストは、言語固有のサポートを備えた辞書ベースのphonemizerを使用して音素トークンに変換されます。Android実装には、英語、フランス語、スペイン語、イタリア語、ポルトガル語、ヒンディー語、日本語、中国語用のphonemizerが含まれています。
パイプライン統合
Androidでは、Kokoro TTSはSpeechPipelineの一部です。STTが音声を文字起こしした後、テキストが音素化され、音声に合成されます。パイプラインは完全なVAD → STT → TTSフローを自動的に管理します。
val modelDir = ModelManager.ensureModels(context)
val pipeline = SpeechPipeline(SpeechConfig(modelDir = modelDir))
pipeline.events.collect { event ->
when (event) {
is SpeechEvent.TranscriptionCompleted -> println(event.text)
else -> {}
}
}
pipeline.start()
pipeline.pushAudio(samples) // 16kHz mono float32
ソースコード: github.com/soniqo/speech-android