100M 参数的 TTS,Mac CPU 上跑得比实时还快

我给 Home Assistant 找本地语音通知方案时,绕了一圈又回到 Kyutai。之前用过他们的 Moshi,好听但吃显卡;这次发布的 Pocket TTS 反着来——100M 参数,纯 CPU 跑,MacBook Air M4 上 6 倍实时。我在 16GB 小主机上试了下,结论是:英文场景可以用了,中文再等等。

为什么选它

本地 TTS 我折腾过好几条路线:Kokoro-82M 快但音色固定,GPT-SoVITS 克隆强但配置重,云端 API 省心却按字扣费。Pocket TTS 的卖点很直接:

  • 100M 参数,模型小到能塞进浏览器 WASM;
  • 不需要 GPU,PyTorch CPU 版就行;
  • 零样本声音克隆,5 秒参考音频就够了;
  • 流式输出,首包延迟约 200ms。

这定位不是追 SOTA 音质,而是把”能用”的语音合成搬到边缘设备上。对我来说,NAS 或笔记本能跑、不依赖外网、不泄露文本内容,优先级比 99% 像真人更高。

安装比想象中轻

官方支持 Python 3.10 到 3.14,我用 uv 装:

uv pip install pocket-tts
pocket-tts generate --text "Hello from a local model." --voice alba

第一次会下载模型和默认音色,之后就能离线跑。没有 CUDA 依赖,不需要改任何环境变量,这点比大多数 TTS 仓库省心。

生成一段 10 秒左右的英文,在我的机器上耗时不到 2 秒。官方数据是 MacBook Air M4 上约 6 倍实时、只吃 2 个 CPU 核心,实测基本吻合。

声音克隆是亮点

Pocket TTS 的克隆不是微调,而是把参考音频编码成一个”声音状态”(voice state),后续推理直接复用。流程大概这样:

pocket-tts export-voice --audio my_voice.wav --output my_voice.safetensors
pocket-tts generate --text "This sounds like me." --voice my_voice.safetensors

导出的 safetensors 文件很小,加载毫秒级。我试了 5 秒自己的录音,相似度谈不上以假乱真,但语调节奏已经能对得上。样本质量影响很大:底噪多或混响重的音频,克隆出来也会带着那股”脏”味。

本地 API 模式

除了 CLI,它还带一个 serve 命令,把模型常驻内存,暴露一个接近 OpenAI 格式的 HTTP 端点:

pocket-tts serve --host 0.0.0.0 --port 8000

这样 Home Assistant、Node-RED 或者其他脚本都能直接 POST 文本过来取音频。不需要自己写模型加载和缓存逻辑,对小规模部署很友好。

几个实实在在的坑

别光看宣传,实际问题我列一下:

  • 没有中文。 目前只支持英、法、德、西、葡、意六种语言。中文、日文、韩文都还没排上,想用来看中文通知的直接劝退。
  • GPU 不加速。 因为它按 batch_size=1 流式生成,官方测试在 Apple Silicon 上 GPU 没优势;CUDA 上也只有约 2.6 倍提升。别为了它专门开显卡。
  • int8 量化仅限 CPU。 想在 CUDA 上跑量化会直接报错,这点文档里写得不显眼。
  • 不能插停顿。 文本里没法通过标点或特殊标记控制 silence 长度,长句一口气念完,做播客还得后期切。
  • 音色授权有讲究。 代码是 MIT,但预置音色的授权每张 voice card 单独写,商用前先核对。

我的判断

Pocket TTS 不是那种”替代 ElevenLabs”的方案,但它在”本地、低资源、可克隆”这个三角里找到了舒服的位置。英文通知、有声读物、游戏配音、IoT 语音反馈,这些场景它都能胜任。中文支持出来之前,我会先把它接进英文自动化流程里。

如果你也在找一条不花钱、不上云的 TTS 链路,可以先加进候选名单。

发表评论