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-ttsuv 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 放进你的口袋”。以下几个方面使其与众不同:

  1. 仅 CPU – 兼容任何现代 CPU,无需 CUDA 或 GPU。
  2. 极小体积 – 100 M 参数 transformer 模型(约 30 MB),仓库体积轻盈。
  3. 音频流式 – 在模型持续合成时可实时流式播放音频。
  4. 支持声音克隆 – 提供 wav 文件即可生成针对该录音的声音状态。
  5. 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  # 或 pod­c‑tts serve(pip 安装)
访问 http://localhost:8000 – 浏览器内置界面响应迅速,并且在模型内存中保持 ~6 倍实时速度。

HTTP API

API 暴露 /generate 端点,接收 POST JSON 负载:

{ "text": "Hello, world!", "voice": "alba" }
可通过 curl 调用:
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 许可证下开源。欢迎在以下领域进行贡献:

  1. 新声音 – Fork 模型,修改 voice_catalog.md,提交 PR。
  2. 多语言支持 – 迁移当前英文检查点。
  3. 量化 – 添加 int8 或 float16 版本,以实现更小的运行时。
  4. 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 是极佳的选择。


进一步资源

原创文章: 查看原文

分享本文