Pocket‑TTS:轻量级CPU专用文本转语音库
Pocket‑TTS:轻量级CPU专用文本转语音库
文本转语音(TTS)已成为从数字助手到辅助功能工具等各类应用中的核心组件。传统方案往往需要强大的GPU或付费的Web API,使其在边缘设备或对隐私敏感的部署场景下不切实际。Pocket‑TTS 通过在CPU上完全运行,提供高质量、低延迟的TTS体验,解决了这一难题。
简而言之 – Pocket‑TTS 是一个 100 M 参数模型,能够在 2 颗 CPU 核心上进行语音合成,首次块延迟约 200 ms,MacBook Air M4 上实现 ~6 倍实时速度。使用
pip install pocket-tts或uv add pocket-tts安装,然后在 CLI 通过pocket-tts generate或用 Python 调用TTSModel.load_model()。
目录
为什么选择 Pocket‑TTS?
| 功能 | Pocket‑TTS | 典型竞争者 |
|---|---|---|
| 模型尺寸 | 100 M 参数 | 700 M–1 B+ |
| 运行时 | 2 颗 CPU 核心 | GPU 或 TPU |
| 延迟 | ~200 ms | 1–2 s |
| 部署 | pip/uv 安装 | Docker+GPU、Web API |
| 语音库 | 8 种预构建声音 + wav 输入 | 限制或无 |
| 语言 | 仅英文(即将多语言) | 多语言 |
Pocket‑TTS 的理念是“把 TTS 放进你的口袋”。以下几个方面使其与众不同:
- 仅 CPU – 兼容任何现代 CPU,无需 CUDA 或 GPU。
- 极小体积 – 100 M 参数 transformer 模型(约 30 MB),仓库体积轻盈。
- 音频流式 – 在模型持续合成时可实时流式播放音频。
- 支持声音克隆 – 提供 wav 文件即可生成针对该录音的声音状态。
- CLI 与 HTTP 接口 – 简单命令行和快速本地服务器,便于集成。
最终效果是一个即插即用的库,能够在笔记本、Raspberry Pi 类 SBC 以及边缘推理芯片上“一机即用”。
快速开始
Pocket‑TTS 是纯 Python 包,要求 PyTorch 2.5 +。最简单的获取方式是使用 uv(推荐用于独立环境)或 pip。
使用 uv 安装
uv add pocket-tts
uvx pocket-tts generate "Hello World!"
uvx在临时环境中运行命令,适合快速测试。
使用 pip 安装
pip install --upgrade pocket-tts
pocket-tts generate "Hello World!"
上述示例会下载默认声音(alba)并写入文件 tts_output.wav。
Colab 示例
!pip install pocket-tts
from pocket_tts import TTSModel
import scipy.io.wavfile as wav
model = TTSModel.load_model()
voice_state = model.get_state_for_audio_prompt("alba")
audio = model.generate_audio(voice_state, "Hello from Colab!")
wav.write("output.wav", model.sample_rate, audio.cpu().numpy())
第一次加载模型可能需要 ~30 秒,之后的调用会保留在内存中。
声音克隆
Pocket‑TTS 支持通过本地 wav 文件或 Hugging Face 托管的 wav 进行 声音克隆。
pocket-tts generate "This is my cloned voice" --voice ./my_voice.wav
也可以使用 Hugging Face URL:
pocket-tts generate "I love Hugging Face" \
--voice "hf://kyutai/tts-voices/expresso/ex01-ex02_default_001_channel2_198s.wav"
声音文件必须为 ~16 kHz、16‑bit PCM。在仓库中你会在
voice_catalog.md找到示例声音列表。
管理声音状态
若需在短时间内使用多种声音,保持声音状态在内存中:
model = TTSModel.load_model()
voice_alba = model.get_state_for_audio_prompt("alba")
voice_marius = model.get_state_for_audio_prompt("marius")
# 复用不重新初始化模型
CLI 与 HTTP 服务器
CLI
Pocket‑TTS 默认提供两个高级命令:
generate– 根据文本生成 wav 文件。serve– 启动本地 FastAPI HTTP 服务器。
启动服务器后访问 Web UI:
uvx pocket-tts serve # 或 podc‑tts serve(pip 安装)
http://localhost:8000 – 浏览器内置界面响应迅速,并且在模型内存中保持 ~6 倍实时速度。
HTTP API
API 暴露 /generate 端点,接收 POST JSON 负载:
{ "text": "Hello, world!", "voice": "alba" }
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{"text":"Hello","voice":"alba"}' \
--output out.wav
服务器也支持在请求中设置 stream=true 时以块的形式流式音频。
Python API 集成
在服务中嵌入 TTS 时,通常会直接使用库。
from pocket_tts import TTSModel
import torch
model = TTSModel.load_model()
voice_state = model.get_state_for_audio_prompt("alba")
text = "Complex sentence that may be very long ..."
# 音频为一维 torch Tensor
audio = model.generate_audio(voice_state, text)
# 保存或流式
torch.save(audio, "demo.pt")
API 故意保持轻量:模型与声音状态均为普通 PyTorch 对象。若需要重新播放同一声音或在异步环境中运行,请保持缓存。
性能与基准
仓库的 docs/tech_report.md 提供了深入分析,关键要点如下:
- 延迟 – 在 Apple M4 上第一次块约 200 ms;在 Intel i7‑12700K 上约 350 ms。
- 速度 – 在相同 CPU 上可实现 6 倍实时速度。
- CPU 占用 – 仅使用 2 核;内存低于 2 GB。
- 模型大小 – 100 M 参数 – 30 MB 磁盘,加载时约 120 MB VRAM。
其 音频流式 的特性意味着你可以在合成完成前开始播放,对交互式应用至关重要。
扩展与贡献
Pocket‑TTS 在 MIT 许可证下开源。欢迎在以下领域进行贡献:
- 新声音 – Fork 模型,修改
voice_catalog.md,提交 PR。 - 多语言支持 – 迁移当前英文检查点。
- 量化 – 添加 int8 或 float16 版本,以实现更小的运行时。
- WebAssembly – 集成 Rust Candle 版本,在浏览器中运行。
开发指南:
- 运行测试:pytest。
- 构建文档:mkdocs build。
- CI 使用 uv 安装依赖。
欲了解详细说明,请参阅 CONTRIBUTING.md。
许可与使用说明
Pocket‑TTS 采用 MIT 许可证发布。声音资源受各自许可约束(详见 voice_catalog.md)。
免责声明 – 本仓库明确禁止将其用于冒充、虚假信息或滥用等不当用途。请务必遵守合法和道德使用准则。
简而言之
Pocket‑TTS 是一个轻量级、CPU 友好的 TTS 库,可在任何现代处理器上运行。几分钟内安装、生成音频或通过 HTTP 提供服务。对于不想依赖 GPU、追求快速、开源 TTS 的开发者,Pocket‑TTS 是极佳的选择。