大家好,我是何三,独立开发者

说到TTS(文字转语音),很多人第一反应是调OpenAI的API,或者跑Python环境装一堆依赖。

但最近我发现了一个叫 kitten_tts_rs 的开源项目,用Rust重写了KittenTTS,把整个TTS能力塞进了一个不到10MB的二进制文件里,最小模型才25MB。

这是什么概念?你连Python都不用装,下载一个可执行文件就能跑。

对比图

这项目干了什么

kitten_tts_rs 是 second-state 团队做的,他们把原版Python的KittenTTS移植成了Rust实现。

原版KittenTTS本身就很轻量,模型参数从1500万到8000万不等。但Python版本的部署依然需要装onnxruntime、numpy、spacy这些依赖,整个虚拟环境加起来快500MB了。

Rust版本直接把这些全砍了。一个编译好的二进制文件,加上espeak-ng做音素转换,就能跑。

而且不只是CLI工具,它还内置了一个 OpenAI兼容的API服务,支持SSE流式传输。也就是说,你可以直接用它替换OpenAI的TTS接口。

模型有多大

四个模型可选,我直接拉一张图:

模型对比

说实话,25MB这个模型大小让我有点意外。现在动不动就是几个G的大模型,25MB连一张高清图片都比它大。

性能方面,在Mac M4 Pro上测试,nano-int8版本的RTF(Real-Time Factor)只有0.11,意味着生成1秒的音频只需要0.11秒,比实时快了9倍

就算最大的80M参数mini模型,RTF也在0.26左右,依然比实时快4倍。

这对实时语音应用来说,相当够用了。

怎么用

安装

先装espeak-ng(这是唯一的系统依赖):

# macOS
brew install espeak-ng

# Ubuntu/Debian
sudo apt-get install -y espeak-ng

然后从GitHub Releases下载对应的预编译二进制:

# Linux x86_64
curl -LO https://github.com/second-state/kitten_tts_rs/releases/latest/download/kitten-tts-x86_64-linux.tar.gz
tar xzf kitten-tts-x86_64-linux.tar.gz

# macOS Apple Silicon
curl -LO https://github.com/second-state/kitten_tts_rs/releases/latest/download/kitten-tts-aarch64-macos.tar.gz
tar xzf kitten-tts-aarch64-macos.tar.gz

下载模型

curl -LO https://github.com/second-state/kitten_tts_rs/releases/latest/download/kitten-tts-models.tar.gz
tar xzf kitten-tts-models.tar.gz

命令行生成语音

# 基本用法
./kitten-tts ./models/kitten-tts-mini 'Hello, world!' Bruno

# 指定音色、语速和输出文件
./kitten-tts ./models/kitten-tts-mini 'Hello, world!' --voice Luna --speed 1.2 --output hello.wav

# 查看可用音色
./kitten-tts ./models/kitten-tts-mini "" --list-voices

内置了8个音色:Bella、Jasper、Luna、Bruno、Rosie、Hugo、Kiki、Leo,男女各半。

启动API服务

这才是我觉得最有价值的部分:

./kitten-tts-server ./models/kitten-tts-mini --host 0.0.0.0 --port 8080

启动后就是一个标准的OpenAI兼容接口:

curl -X POST http://localhost:8080/v1/audio/speech \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "kitten-tts",
    "input": "Hello, world! This is KittenTTS running as an API server.",
    "voice": "alloy"
  }' \
  --output speech.mp3

注意这里的voice用的是OpenAI的名字(alloy、echo、fable等),项目内部自动映射到KittenTTS的音色。这意味你现有的代码如果调的是OpenAI的TTS接口,改个URL就能直接用

支持mp3、opus、flac、wav、pcm多种输出格式,还能通过SSE做流式传输,适合实时语音对话场景。

工作原理

拆开看其实不复杂,整个流程分六步:

  1. 文本预处理 — 把数字"42"展开成"forty-two","$10.50"展开成"ten dollars and fifty cents"
  2. 音素转换 — 用espeak-ng把英文文本转成IPA音素
  3. Token编码 — 把音素映射成整数token ID
  4. 音色选择 — 从NPZ文件加载音色embedding
  5. ONNX推理 — 输入tokens、音色风格、语速参数,跑模型
  6. 音频编码 — 输出MP3/WAV/Opus等格式

核心推理用的是ONNX Runtime,不需要GPU,纯CPU跑就行。当然如果你想加速,也支持CUDA、TensorRT、CoreML等后端,通过Cargo feature flag开启。

不过作者也说了,对于这种小模型(15M-80M参数),CPU反而更快。他们在M4 Pro上测试,CoreML跑mini模型比CPU慢了1.7倍。原因很简单——模型太小,GPU调度的开销反而大于计算本身。

适合什么场景

我觉得这几个场景特别适合:

  • 边缘设备:树莓派、手机上跑TTS,25MB的模型完全没问题
  • AI Agent:作为Agent的语音输出能力,CLI工具非常方便调用
  • 私有化部署:不想把文本发给OpenAI,本地跑一个API服务就搞定
  • 实时对话:SSE流式传输,接EchoKit这类实时语音应用

最后说两句

独立开发者做产品,TTS是经常用到的能力。之前要么调云服务API(要花钱、有隐私问题),要么本地跑Python(部署麻烦)。

kitten_tts_rs这种"一个二进制+一个小模型"的方案,刚好卡在了一个很舒服的位置:够轻量、够快、部署够简单

项目Apache-2.0协议,222个Star,地址放下面了:

GitHub:https://github.com/second-state/kitten_tts_rs

有兴趣的朋友可以star一下,或者直接跑起来试试。