Kokoro TTS — Android
Kokoro-82M 是一个轻量级、非自回归的文本转语音模型,通过 ONNX Runtime 运行于 Android。它提供 8 种语言中 50 种预设音色的自然 24 kHz 语音。
支持的语言
| 语言 | 代码 | 示例音色 |
|---|---|---|
| 英文(美国) | 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 |
| 德语 | de | dm_martin, df_victoria (音色包) |
共 50 种预设音色。音色命名约定:[language][gender]_[name] — 例如 af_heart = American Female "Heart"。
德语音色包
德语并不是上面多语言模型包中的一种音色:两个德语音色是 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 | 音色嵌入 |
| 音素字典 | 语言相关的发音数据 |
HuggingFace:soniqo/Kokoro-82M-ONNX
性能
| 指标 | 数值 |
|---|---|
| 参数 | 82M |
| 推理后端 | ONNX Runtime |
| 输出采样率 | 24 kHz |
音素化器
文本通过基于字典的音素化器转换为音素 token,并提供特定语言支持。Android 实现包含英文、法文、西班牙文、意大利文、葡萄牙文、印地文、日文和中文的音素化器。
流水线集成
在 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