Skip to content

切换音色与语速

音色集合

Kokoro INT8 模型包内置 103 个音色。每个音色有 id、在 voices.bin 中的索引、 语言与标签:

前缀语言示例 id
zf_中文女声zf_001zf_002……
zm_中文男声zm_009……
af_美式英文女声af_mapleaf_sol
bf_英式英文女声bf_vale

音色条目遵循 KokoroVoiceManifest 结构:

ts
interface KokoroVoiceManifest {
  id: string; // "zf_001"
  index: number; // 在 voices.bin 中的位置
  language: "en" | "zh";
  label: string; // 可读标签
}

只有 Recommended 音色经过认证

在模型 manifest 中,音色被标记为 recommendedexperimental。只有 recommended 音色通过了 Beta 语料。已认证的集合是 zf_001zm_009af_mapleaf_solbf_vale —— 其余均为 Experimental。中文的韵律与标点停顿 在不同音色间差异明显,上线前请用你自己的内容评估其他音色。

切换音色

在每次请求里传 voiceId

ts
const tts = createTts({
  model: kokoroZhInt8,
  voiceId: "zf_001",
  numThreads: 4,
});
await tts.load();

const chinese = await tts.synthesizeToFile({ text: "你好。" });
const english = await tts.synthesizeToFile({
  text: "Hello.",
  voiceId: "af_maple",
});

切换音色不会重载模型。ONNX session 只创建一次;不同的 voiceId 只是在本次 合成中从 voices.bin 里选取不同的 style embedding。切换的代价很低。

如果想改变默认音色,直接在创建时指定即可:

ts
const tts = createTts({ model: kokoroZhInt8, voiceId: "af_maple" });

语速

speed 是生成音频的倍率,有效范围 0.52.0

ts
await tts.synthesizeToFile({ text: "慢一点。", speed: 0.8 });
await tts.synthesizeToFile({ text: "Faster now.", speed: 1.4 });

超出范围的值会在推理开始前被拒绝。

语速是硬性范围,不是建议值

0.52.0 是两端极值。超出范围 SDK 会抛错而不是静默截断,因此任何面向用户的 语速控件都要你自己做校验。

调优线程数

numThreads 映射到 ONNX Runtime 的 intra-op 线程数:

ts
const tts = createTts({
  model: kokoroZhInt8,
  voiceId: "zf_001",
  numThreads: 4,
});

线程不是越多越好 —— 在移动端,超额占用核心可能得不偿失。请在目标机型上用 result.elapsedMs(不含模型加载)做基准测试,选最优值。

文本长度限制

限制项
单次输入总长2000 个 Unicode code point
单个候选分段300 个 code point
模型 token 预算510(有效负载 508)

SDK 会把长文本切分成多段并拼接生成的音频。超出总长限制会抛 TEXT_TOO_LONG; 某一段无法切到上限以下则抛 TEXT_SEGMENT_TOO_LONG

中文数字与日期会在编码前自动归一化 —— 2024年5月1日 会按中文读法朗读,而不是 逐位读数字。