Pocket TTS:本地轻量化文本转语音工具
Pocket TTS:本地轻量化文本转语音工具
GitHub: github.com/kyutai-labs/pocket-tts
由 Kyutai Labs 开发,1亿参数模型,纯 CPU 运行,支持声音克隆
💡 核心特点
Pocket TTS 是一款轻量级文本转语音应用,专为 CPU 高效运行而设计:
| 特性 | 说明 |
|---|---|
| 🖥️ 纯 CPU 运行 | 无需 GPU,仅需 2 个 CPU 核心 |
| 📦 模型小巧 | 仅 1 亿参数 |
| ⚡ 低延迟 | 首段音频约 200ms |
| 🚀 速度快 | MacBook Air M4 上约 6 倍实时速度 |
| 🎵 音频流式 | 支持流式输出 |
| 🎤 声音克隆 | 支持使用任意音频克隆声音 |
| 🌐 长文本 | 可处理无限长文本输入 |
| 🇬🇧 语言 | 目前仅支持英语 |
🚀 快速开始
方式一:在线体验(无需安装)
访问 Kyutai 官网 直接在浏览器中试用,输入文本、选择声音、生成语音。
方式二:CLI 命令行使用
安装
推荐使用 uv(自动在隔离环境中安装依赖):
# 安装 uv(如果还没有)
# 详见: https://docs.astral.sh/uv/getting-started/installation/
# 使用 uvx 直接运行(无需安装)
uvx pocket-tts generate
或使用 pip 安装:
pip install pocket-tts
支持 Python 3.10 - 3.14,需要 PyTorch 2.5+(不需要 GPU 版本)
生成语音
# 默认生成(使用默认文本和声音)
uvx pocket-tts generate
# 或
pocket-tts generate
# 指定声音和文本
pocket-tts generate --voice alba --text "Hello, this is a test."
内置声音列表:
| 声音名称 | 描述 |
|---|---|
| alba | 女性声音 |
| marius | 男性声音 |
| javert | 男性声音 |
| jean | 男性声音 |
| fantine | 女性声音 |
| cosette | 女性声音 |
| eponine | 女性声音 |
| azelma | 女性声音 |
声音示例和许可信息:Hugging Face Voices
🎤 声音克隆
Pocket TTS 支持使用任意音频文件克隆声音:
方式一:直接使用音频文件
pocket-tts generate --voice ./my_voice.wav --text "Hello, I'm using my own voice."
建议: 使用前先用 Adobe Podcast 等工具清理音频样本,音频质量会直接影响克隆效果。
方式二:导出声音嵌入(推荐)
处理音频文件进行声音克隆相对较慢,但加载预转换的 safetensors 文件非常快:
# 导出声音嵌入
pocket-tts export-voice ./my_voice.wav --output my_voice.safetensors
# 使用导出的声音
pocket-tts generate --voice my_voice.safetensors --text "Hello!"
更多详情:export-voice 文档
从 Hugging Face 使用声音
pocket-tts generate \
--voice "hf://kyutai/tts-voices/expresso/ex01-ex02_default_001_channel2_198s.wav" \
--text "Hello from Hugging Face voice."
🌐 启动 Web 服务
运行本地 HTTP 服务,通过 Web 界面生成音频:
uvx pocket-tts serve
# 或
pocket-tts serve
访问 http://localhost:8000 使用 Web 界面。
优点: 模型在请求之间保持在内存中,比命令行更快。
更多详情:serve 文档
🐍 Python API 使用
基础用法
from pocket_tts import TTSModel
import scipy.io.wavfile
# 加载模型(只需一次)
tts_model = TTSModel.load_model()
# 获取声音状态(可缓存)
voice_state = tts_model.get_state_for_audio_prompt("alba")
# 生成音频
audio = tts_model.generate_audio(
voice_state,
"Hello world, this is a test."
)
# 保存为 WAV
scipy.io.wavfile.write(
"output.wav",
tts_model.sample_rate,
audio.numpy()
)
声音克隆(Python)
from pocket_tts import TTSModel
import scipy.io.wavfile
tts_model = TTSModel.load_model()
# 使用本地音频文件克隆声音
voice_state = tts_model.get_state_for_audio_prompt("./my_voice.wav")
# 或使用 Hugging Face 上的声音
voice_state = tts_model.get_state_for_audio_prompt(
"hf://kyutai/tts-voices/expresso/ex01-ex02_default_001_channel2_198s.wav"
)
audio = tts_model.generate_audio(
voice_state,
"This is a cloned voice speaking."
)
scipy.io.wavfile.write("cloned_output.wav", tts_model.sample_rate, audio.numpy())
性能优化建议
load_model() 和 get_state_for_audio_prompt() 是相对较慢的操作,建议:
- 保持模型和声音状态在内存中
- 重复使用同一个 voice_state 生成多段音频
- 可以维护多个声音状态以支持多种声音
更多详情:Python API 文档
📝 对比:Pocket TTS vs Edge TTS
| 对比项 | Pocket TTS | Edge TTS |
|---|---|---|
| 运行方式 | 本地运行 | 依赖微软服务 |
| 网络需求 | 首次下载后离线可用 | 需要网络连接 |
| 声音自然度 | ⭐⭐⭐⭐⭐ 非常自然 | ⭐⭐⭐ 一般 |
| 声音克隆 | ✅ 支持任意声音克隆 | ❌ 不支持 |
| 隐私 | ✅ 数据本地处理 | ⚠️ 依赖云端 |
| 延迟 | ⭐⭐⭐⭐⭐ 低(200ms首音) | ⭐⭐⭐ 依赖网络 |
| 多语言 | ❌ 目前仅英语 | ✅ 多语言支持 |
🔧 相关项目
| 项目 | 描述 |
|---|---|
| lukasmwerner/pocket-reader | 浏览器屏幕阅读器 |
| ikidd/pocket-tts-wyoming | Docker 容器,支持 Wyoming 协议,可用于 Home Assistant |
| slaughters85j/pocket-tts | Mac 桌面应用 + macOS 快捷操作 |
| IceFog72/pocket-tts-openapi | 兼容 OpenAI API 的 TTS 服务器,支持声音克隆 |
🌐 浏览器实现
Pocket TTS 足够小巧,可以在浏览器中通过 WebAssembly/JavaScript 运行。社区实现:
| 项目 | 技术 | 演示 |
|---|---|---|
| babybirdprd/pocket-tts | Candle (Rust) + WebAssembly | - |
| ekzhang/jax-js | jax-js | Demo |
| KevinAHM/pocket-tts-onnx-export | ONNX Runtime Web | Demo |
📚 资源链接
| 资源 | 链接 |
|---|---|
| GitHub 仓库 | https://github.com/kyutai-labs/pocket-tts |
| 在线演示 | https://kyutai.org/pocket-tts |
| Hugging Face 模型 | https://huggingface.co/kyutai/pocket-tts |
| 声音库 | https://huggingface.co/kyutai/tts-voices |
| 技术报告 | https://kyutai.org/blog/2026-01-13-pocket-tts |
| 论文 | https://arxiv.org/abs/2509.06926 |
| Colab 示例 | Notebook |
⚠️ 使用限制
- 🌐 仅支持英语(目前)
- 🚫 禁止用途:未经明确合法同意的声音模仿/克隆;错误信息、虚假信息或欺骗;生成非法、有害、诽谤、滥用、骚扰、歧视、仇恨或侵犯隐私的内容。
整理时间:2026-02-02