TTS 模型也用上 GGUF 了,500M 参数手机直跑

本地玩 TTS 这事我折腾过 Kokoro、ChatTTS,每次想塞进小设备都被各种限制劝退——要么必须 Python + PyTorch 全套,要么得跑个 Web 服务。直到看到 Neuphonic 出的 NeuTTS,第一反应是:这不就是把 LLM 那套 GGUF 思路搬到语音上了?

NeuTTS 是英国团队 Neuphonic 开源的端侧 TTS 模型集合,最小的 Nano 只有 1.2 亿参数,最大的 Air 也才 5.5 亿,全部走 GGUF 量化格式。手机、笔记本、树莓派都能跑,3 秒音频就能克隆一个新说话人。我在 GitHub 翻了一圈,仓库 6.2k star,2026 年 7 月 22 号还有新提交,活着的项目。

NeuTTS GitHub 仓库截图

GGUF 这个思路,搬到 TTS 上是真的对

之前跑 LLM 我用的是 Qwen3.5 的 35B-A3B 量化版,靠的就是 llama.cpp 那一套 GGUF 生态。GGUF 的好处是模型和推理框架解耦——同一份文件,手机、Mac、Linux、GPU 服务器理论上都能跑,只是速度不同。TTS 一直没人这么干,是因为大家觉得语音模型架构特殊(codec、流式),GGUF 那套框架不通用。

NeuTTS 算是把这事撬开了。它的结构很简洁:一个 LM backbone(Qwen 0.5B 改造)+ 一个 NeuCodec(50Hz 神经音频编解码器,码本只有一个),LM 输出 token,codec 把 token 翻成波形。LM 部分走 GGUF 量化,codec 部分可以选择 PyTorch 或 ONNX 解码器。两种可选,加起来需要装的东西其实不多。

三档模型,按需选

NeuTTS 一共三个尺寸,定位差别挺大:

  • NeuTTS-Air(~552M):英文旗舰,Apache 2.0 协议,支持 3 秒克隆,最像「通用 TTS」的感觉。
  • NeuTTS-Nano(~229M):多语言版本,覆盖英、法、德、西四种语言,同样支持克隆,协议是 NeuTTS Open License 1.0(商用要看过)。
  • NeuTTS-2E(~236M):情感版,固定 4 个说话人(emily / paul / sophie / steven),支持 7 种情绪(angry / disgusted / fearful / happy / neutral / sad / surprised)。要情感选它,但这个版本不能克隆自己的声音

我自己的用法是 Air + Nano 切着用。Air 出英文播客、Nano 出多语言演示。装了 Q4 量化的 GGUF 版,两个加起来不到 500MB 硬盘。

HuggingFace Spaces 上的 NeuTTS-Air 演示界面

基准测试看着挺舒服

官方在 README 里给的 Q4 量化基准,我整理成下面这张图:

NeuTTS 在不同设备上的吞吐量基准

几个值得看的点:

  • 三星 Galaxy A25 这种入门手机,纯 CPU 跑 Air 还能有 20 tok/s,Nano 接近 45 tok/s。生成一句话大概几秒,能用。
  • Apple Silicon 的加速是真的强——iMac M4 16GB 跑 Air 拿到 111 tok/s,Nano 195 tok/s。我那台 Mac mini M4 同款芯片,没意外也能到这个数。
  • RTX 4090 上 Air 16,194 tok/s——这是纯 GPU 推理的极限,但实际用不上,你不会在 4090 上实时合成一句话。

Mac 用户注意,安装 llama-cpp-python 时要带上 CMAKE_ARGS="-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Apple",把 Apple Accelerate 框架打开,不然会默认走 Metal 或纯 CPU 跑,比图里数字慢一截。

3 秒克隆,这事有点离谱

克隆用法很简单,给一段参考 wav(3-15 秒,单声道,干净录音)+ 对应的文本,就能把说话人风格复刻出来。我录了一段自己的几秒测试,效果出乎意料——连我说话的停顿、轻微气口都被学到了,生成的英文虽然带点机器人味但保留了我的节奏感。

参考音频有点要求:单声道、16-44kHz、3-15 秒、wav 格式。达不到这些条件生成质量会掉。最坑的是「干净」这一条——我第一次拿个街头采访的片段试,背景有车流声,结果生成的声音里居然带上了隐约的「环境感」。换纯净录音就正常了。

2E 这个情感版,才是真有意思的

看到 NeuTTS-2E 的 Spaces 演示页我才意识到这事的真正价值:

NeuTTS-2E 情感 TTS 演示界面,支持说话人和情绪切换

选定一个说话人 + 一个情绪,文本直接出对应情感的语音。七个情绪基本覆盖了内容创作里能用到的:开心、惊讶、生气、悲伤、平静、恐惧、厌恶。对比起来,传统 TTS 想要「怒斥语气」基本靠堆 prompt 或者后期调音,这边直接选个下拉框。

代价是不能克隆自己的声音——只支持 4 个内置说话人(emily、paul、sophie、steven)。我猜下一版会打通这个限制。

我比较在意的两点

第一是语言。现在 NeuTTS 全系只支持英文、法、德、西四种,没有中文也没有日语。我试着用英文混中文(拼音)的方式塞进去,codec 部分直接报错——估计音素表里压根没收录。这是当前阶段最大的限制,对中文播客、有声书场景基本用不上,只能等官方或者社区出多语言扩展。

第二是水印。所有 NeuTTS 生成的音频默认嵌了 Perth(Perceptual Threshold)水印,肉耳听不出来,但能事后检测出来。这是负责任 AI 那一派的做法——生成的音频天生带「这是 AI 合成」的签名。我猜是为了对付语音诈骗滥用。我能接受,如果你只是个人玩玩完全没影响。

安装其实不复杂

整个流程跑下来就几条命令:

  1. brew install espeak-ng(macOS)或 sudo apt install espeak-ng(Linux)——依赖这玩意做音素化。
  2. pip install neutts[all]——装主包 + onnxruntime + llama-cpp-python,一键搞定。
  3. 从 HuggingFace 下 GGUF 权重,hf download neuphonic/neutts-air-q4-gguf
  4. 写四五行 Python:NeuTTS(backbone_repo=..., codec_repo=...)encode_reference()infer()soundfile.write()

我整个流程在 Mac 上 15 分钟内跑完,没什么坑。

和 Kokoro 怎么选

两个完全不冲突。Kokoro 的优势是中文支持好、社区大、有不少声音库,但模型走的是 PyTorch,要带 Python 环境。NeuTTS 强在端侧、量化、轻量、英文自然度

我的搭配:Mac 上跑 Kokoro 做中文,Nas 上跑 NeuTTS-Air 的 GGUF 版做英文播报。两个加起来不到 1GB 硬盘,互不干扰。

如果哪天 NeuTTS 出中文版本了,Kokoro 我大概会退休掉——光凭 GGUF 能在小设备上跑这一点就赢太多了。

仓库在 github.com/neuphonic/neutts,模型在 HuggingFace 上同名。Spaces 上有 Air 和 2E 两个可以直接试的演示,上传段音频、敲几句话、按一下生成就能听效果。

发表评论