ttsfm
兼容OpenAI TTS API的免费语音合成工具,一条命令完成本地部署
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
兼容OpenAI TTS API的免费语音合成工具,一条命令完成本地部署
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样的场景:你正在开发一款有声书应用,需要将大量文字内容转换为自然流畅的语音。传统的方案要么依赖云服务付费 API,要么自建 TTS 模型——前者成本高昂,后者门槛极高。
TTSFM(Text-to-Speech Free & Mirrored)正是为解决这一痛点而生:它完整兼容 OpenAI 的 TTS API 接口,让你无需修改任何代码,就能用免费的自托管服务替代 OpenAI 的付费端点。
图1:Docker 部署状态 —— 已有大量开发者使用 Docker 方式部署
TTSFM 起源于作者对 OpenAI TTS API 高昂定价的思考。OpenAI 的 TTS 服务虽然效果出众,但按调用次数计费的方式让很多个人开发者和小型团队望而却步。作者发现 openai.fm 等平台提供了类似的后端服务,于是着手构建了一个完全兼容 OpenAI 接口规范的开源层。
项目的核心理念不是"破解",而是接口兼容:开发者只需将 base_url 从 https://api.openai.com 切换到 http://localhost:8000(本地部署),就能在完全不动业务代码的情况下切换到免费自托管方案。这种设计哲学让项目获得了大量"不想改代码但想省钱"的开发者青睐。
项目由独立开发者 dbcccc 维护,采用 MIT 许可证,目前在 GitHub 上已获得 728 颗星,Docker Hub 拉取量超过 10 万次。
如果把 OpenAI TTS API 想象成一个"专业的配音演员",那 TTSFM 就像是一个"模仿能力极强的配音学员"——他不一定在任何场景下都完全替代前者,但在大部分日常场景中表现几乎一致,而且随叫随到、不收费用。
从技术架构上看,TTSFM 是一个典型的反向代理 + SDK 封装项目:
TTSFM 完整支持 OpenAI TTS 的全部 11 种语音:alloy(通用)、ash(低沉)、ballad(叙事)、coral(温暖)、echo(回声)、fable(故事)、nova(明亮)、onyx(磁性)、sage(智者)、shimmer(柔和)、verse(诗意)。每种语音都经过调优,在不同语速和音频格式下表现稳定。
支持 MP3、WAV、OPUS、AAC、FLAC、PCM 六种格式,这是相比很多同类工具的显著优势。其中 OPUS/AAC/FLAC/PCM 格式需要 full 版 Docker 镜像(包含 ffmpeg),精简版镜像仅支持 MP3 和 WAV。
语速调节范围是 0.25x 到 4.0x,基于 ffmpeg 实现。对于有声书制作、视频配音等场景,这个功能非常实用——可以将正常语速的内容加速到 1.5x 适合通勤听,或减速到 0.75x 便于学习跟读。
超长文本(超过模型单次处理上限)会被自动分片,每个片段独立生成音频后再无缝合并。这解决了其他 TTS 工具常见的"长文本截断"问题。用户无需感知分片逻辑,只需传入完整文本,SDK 自动处理一切。
支持实时流式音频输出,音频块(chunk)在生成过程中就陆续送达客户端。这对于需要边生成边播放的交互场景(如 AI 语音助手)至关重要。实现基于 Socket.IO,架构文档中有详细的组件交互图。
图2:Star History 增长趋势 —— 项目持续获得社区关注
ttsfm/ # 核心 SDK 包
├── client.py # 同步 TTSClient (~30KB,核心实现)
├── async_client.py # 异步客户端 AsyncTTSClient
├── audio.py # 音频处理(chunk 合并、格式转换)
├── models.py # 数据模型(Voice、AudioFormat、TTSRequest 等)
├── capabilities.py # 运行时功能检测 API
├── exceptions.py # 异常体系(APIException、NetworkException 等)
└── utils.py # 工具集(header 伪造、URL 构建、重试策略)
ttsfm-web/ # Web 服务层
├── app.py # Flask 主应用(~30KB,含全部路由)
├── websocket_handler.py # WebSocket 流式处理器
├── templates/ # Jinja2 模板(Playground UI)
└── static/ # CSS/JS 静态资源
Per-request TTSClient 实例化:在 Web 应用中,每个请求都会创建独立的 TTSClient 实例,而非复用全局客户端。这看似浪费资源(每次都要初始化连接池),但巧妙避免了多线程/多协程环境下的 session 竞争问题。
Argon2 密码哈希保护:Web UI 的管理后台使用 Argon2 算法对密码进行哈希,这是目前最难被 GPU/ASIC 暴力破解的算法之一。虽然增加了 CPU 开销,但考虑到很多用户会将 TTSFM 部署在有公网访问的环境里,这个选择体现了安全意识。
Sanitisation + Deterministic Headers:项目对输入文本做了清理(去除特殊字符、截断超长内容),同时为每个请求构造"真实感"的 HTTP 头(User-Agent、Accept-Language 等)。这是为了规避上游服务的简单反爬策略。
双镜像策略:full 镜像(~300MB)内置 ffmpeg,支持所有格式和语速调节;slim 镜像(~100MB)仅包含基础依赖。这种精细化的镜像分层让资源受限环境(如树莓派、边缘设备)也能运行。
核心依赖极为精简:requests + aiohttp + python-dotenv。Web 端额外引入 Flask、Flask-CORS、Flask-SocketIO、Argon2-cffi。没有引入重型 ML 框架,定位清晰——纯工具层。
测试覆盖:pytest + pytest-asyncio + pytest-cov,通过 GitHub Actions CI 保障每次提交的测试通过率。
图3:项目作者 GitHub 头像
Docker 部署(最简路径):
docker run -p 8000:8000 dbcccc/ttsfm:latest
一行命令,1 分钟内即可启动。容器同时提供:
http://localhost:8000 —— 可视化操作界面http://localhost:8000/v1/audio/speechhttp://localhost:8000/docsPython SDK 方式:
pip install ttsfm[web]
SDK 接口与 OpenAI 官方 SDK 高度一致,从 OpenAI 切换过来几乎没有学习成本。
命令行工具:
ttsfm "Hello, world" --voice nova --format mp3 --output hello.mp3
适合快速测试和脚本集成。
Web UI 体验:Flask + Jinja2 渲染的 Playground 界面提供了语音选择、文本输入、格式选择、语速调节等可视化操作,适合不懂命令行的用户。
项目 README 明确标注"仅用于教育和研究目的",承认是对 openai.fm 服务的逆向工程。这意味着:
TTSFM 本身不包含任何 TTS 模型,所有能力都桥接自 openai.fm。如果上游服务宕机、收费或关闭,项目将失去全部功能。这是一个根本性的依赖风险。
由于是对上游 API 的封装,TTSFM 的语音质量上限就是上游的质量。用户无法通过微调模型或更换底座引擎来提升效果。
虽然项目有 README.zh.md(中文版说明),但 docs/ 目录下的所有技术文档(架构说明、WebSocket 调试指南等)都是英文,对中文开发者有一定门槛。
TTSFM 的出现折射出当前 AI 服务商业化进程中的一个有趣现象:接口标准化催生了"中间层套利"市场。当行业普遍遵循 OpenAI 的 API 规范时,任何能够桥接到低成本或免费后端的兼容层都有生存空间。
从技术趋势看,语音合成正在经历从"云端专属"到"本地可及"的民主化进程。TTSFM 虽然依赖上游服务,但它是这一趋势的积极参与者——它降低了开发者的试错成本,让更多人能够参与到语音应用创新的实验中来。
此外,项目在代码质量上的追求也值得关注:Argon2 密码保护、per-request 实例化规避竞争条件、双镜像分层优化——这些不是"免费工具"的标配做法,体现的是开发者的工程品味。
第一步:部署服务
docker run -p 8000:8000 dbcccc/ttsfm:latest
第二步:验证功能
curl http://localhost:8000/api/capabilities
第三步:体验 Web UI
打开浏览器访问 http://localhost:8000,选择语音,输入文本,点击生成。
第四步:接入 Python 代码
from ttsfm import TTSClient, AudioFormat, Voice
client = TTSClient()
response = client.generate_speech(
text="TTSFM 让语音合成触手可及",
voice=Voice.NOVA,
response_format=AudioFormat.MP3,
)
response.save_to_file("output")
总结:TTSFM 是一个定位精准、工程扎实的开源工具。对于需要快速接入 TTS 能力、又不希望被云服务锁定或被高价 API 绑定的开发者来说,它提供了一个务实且免费的选项。虽然存在法律灰区和上游依赖风险,但在"研究和学习"的框架下,它是一个值得收藏进工具箱的项目。