这是一个部署在 Cloudflare Workers 上的高性能文本转语音(TTS)代理服务。它巧妙地将微软 Edge 强大且自然的语音合成服务,封装成了一个兼容 OpenAI API 格式的接口。这使得开发者可以无缝地将各种现有应用对接到这个免费、高质量的 TTS 服务上。
项目包含两个核心文件:
workers.js: 部署在 Cloudflare 上的核心服务脚本。webui.html: 一个功能完备的本地网页,用于方便地测试和调用服务。
- 🚀 OpenAI 兼容: 完全模拟 OpenAI 的
/v1/audio/speech接口,可被官方的 OpenAI SDK 或任何现有工具直接调用。 - 🗣️ 高质量音色: 利用微软 Edge TTS 提供的多种自然、流畅的神经网络语音。
- ** STREAMING**: 支持流式和标准(非流式)两种响应模式,流式响应可极大降低长文本的首次播放延迟。
- 🧠 智能文本清理: 内置强大的“文本清理流水线”,可自动处理从 PDF 或网页复制的杂乱文本:
- 移除 Markdown 格式。
- 移除 Emoji 表情符号。
- 移除 URL 链接。
- 移除论文或文档中的引用标记数字(如
...文本 1.),同时保留有意义的数字(如年份、数量)。 - 移除所有多余的空格和硬换行,确保中文听感自然连贯。
- 支持自定义关键词过滤。
- 🎛️ 灵活的参数配置: 支持通过 API 请求动态调整所有核心参数,包括音色、语速、音调、分块大小、并发数以及所有清理选项。
- 🌐 零依赖部署: 脚本完全自包含,无需配置 KV、队列等任何外部服务,部署过程极其简单。
- 💻 便捷的测试工具: 提供一个功能丰富的
webui.html,让用户无需编写任何代码即可测试所有功能。
这个 Worker 脚本扮演了一个智能“中间人”的角色。
- 接收请求: 它接收一个格式与 OpenAI TTS API 完全相同的
POST请求。 - 文本预处理: 它会立即运行强大的文本清理流水线,对输入的文本进行净化,以达到最佳的听感。
- 智能决策: 它会快速预估处理这段文本所需的资源。
- 短文本: 如果文本长度在安全范围内,它会采用最高效的“直接同步模式”进行处理。
- 超长文本: 如果文本长度可能触发 Cloudflare 的平台限制,它会自动启用“自我调节机制”,重新计算并调整分块策略,以保证任务 100%成功。
- 分块与并发: 它将处理好的文本分割成多个小块,并根据您指定的并发数,分批次地向微软 Edge TTS 服务器发起请求。
- 返回结果:
- 标准模式: 等待所有音频块返回,拼接成一个完整的 MP3 文件后一次性返回。
- 流式模式: 在收到第一个音频块时就立即开始向客户端发送数据,实现低延迟播放。
部署这个服务非常简单,只需要几分钟。
- 一个 Cloudflare 账户(免费版即可)。
- 登录到您的 Cloudflare 仪表板。
- 在左侧菜单中,找到并点击 Workers 和 Pages。
- 点击 创建应用程序 -> 创建 Worker。
- 为您的 Worker 指定一个独特的名称(例如
my-edge-tts-proxy),这将成为您 URL 的一部分。 - 点击 部署。
- Worker 创建成功后,点击 配置 Worker 按钮。
- 粘贴代码: 在左侧的编辑器中,删除所有现有代码,然后将
workers.js文件的全部内容复制并粘贴进去。 - 添加密钥:
- 在右侧,选择 设置 -> 变量。
- 在“环境变量”下的 机密变量 部分,点击 添加机密变量。
- 变量名称: 输入
API_KEY - 机密值: 输入一个您自己设定的、足够复杂的密码(例如
sk-my-super-secret-key-12345)。这个值将是您调用 API 时的凭证。 - 点击 加密。
- 完成以上配置后,返回代码编辑器页面。
- 点击右上角的 保存并部署 按钮。
恭喜!您的 TTS 代理服务现在已经全球可用了。您的 API 地址就是 Worker 页面上显示的 https://<您的Worker名称>.<您的子域>.workers.dev。
1. 将
webui.html 文件保存到您的本地电脑上。2. 用您的浏览器(如 Chrome, Safari)直接打开这个 HTML 文件。
- 用浏览器访问上方的
https://<您的Worker名称>.<您的子域>.workers.dev,即可使用webui了(本仓库中的webui.html没有实际用途,仅用于归档,因为它的全部内容实际已经在worker.js里有一份了)。 - 在页面的“API 配置”部分,填入您的 Worker URL 和您刚才设置的 API Key。
- 现在,您可以尽情测试所有功能了!
POST https://<您的Worker名称>.<您的子域>.workers.dev/v1/audio/speech
使用 Bearer Token 认证方式。将您的 API Key 放在 Authorization 请求头中。
Authorization: Bearer YOUR_API_KEY
| 参数 (Parameter) | 类型 (Type) | 默认值 (Default) | 描述 (Description) |
|---|---|---|---|
model |
string |
"tts-1" |
模型 ID。支持 tts-1, tts-1-hd,或映射的音色如 tts-1-alloy。 |
input |
string |
必需 | 需要转换为语音的文本。支持任意长度。 |
voice |
string |
"zh-CN-XiaoxiaoNeural" |
直接指定微软的音色名称。当 model 参数未被映射时生效。 |
speed |
number |
1.0 |
语速。范围从 0.25 到 2.0。 |
pitch |
number |
1.0 |
音调。 |
stream |
boolean |
false |
是否使用流式响应。设为 true 可极大降低长文本的首次延迟。 |
concurrency |
number |
10 |
并发请求数。控制同时向微软服务器发送多少个文本块请求。 |
chunk_size |
number |
300 |
文本分块大小(字符数)。Worker 会根据平台限制自动调整此值以确保成功。 |
cleaning_options |
object |
{...} |
一个包含文本清理开关的对象。 |
├ remove_markdown |
boolean |
true |
是否移除 Markdown 格式。 |
├ remove_emoji |
boolean |
true |
是否移除 Emoji。 |
├ remove_urls |
boolean |
true |
是否移除 URL。 |
├ remove_line_breaks |
boolean |
true |
是否移除所有空格和换行符。 |
├ remove_citation_numbers |
boolean |
true |
是否智能移除论文引用标记。 |
├ custom_keywords |
string |
"" |
自定义要移除的关键词,以逗号分隔。 |
curl --location 'https://<YOUR_WORKER_URL>/v1/audio/speech' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "tts-1-alloy",
"input": "你好,这是一个标准的语音合成请求。"
}' \
--output standard.mp3curl --location 'https://<YOUR_WORKER_URL>/v1/audio/speech' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "tts-1-nova",
"input": "这是一个流式请求的示例,对于较长的文本,你能更快地听到声音的开头部分。",
"stream": true
}' \
--output streaming.mp3curl --location 'https://<YOUR_WORKER_URL>/v1/audio/speech' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "tts-1-shimmer",
"input": "这段文本包含 **Markdown** 1、一个链接 https://example.com 和一个表情 😂。",
"cleaning_options": {
"remove_markdown": true,
"remove_urls": true,
"remove_emoji": true,
"remove_citation_numbers": true
}
}' \
--output cleaned.mp3- 字符数限制: 此版本的脚本设计为在 Cloudflare 免费套餐 上稳定运行。为了保证这一点,对于单次请求的文本长度有一个隐性的上限,大约在 12 万字符 左右 (
~50 * 2500)。对于绝大多数应用场景(包括转化整篇长文)都已经完全足够。超过这个长度,API 会返回一个清晰的错误提示。
workers.js: 核心服务逻辑。包含了 API 路由、认证、文本清理、自我调节机制、以及与微软 TTS 服务的交互。这是您需要部署到 Cloudflare 的唯一文件。webui.html: 一个独立的、功能强大的 HTML 测试页面。它无需任何服务器,可以直接在本地用浏览器打开。它封装了所有 API 参数,并提供了一个直观的界面来与您的 Worker 服务进行交互。