背景:免费的 TTS 这么难找吗?
做 AI 语音合成的时候,我经常需要把文字转成语音。TTS 服务的收费模式很统一——按字符计费,免费额度少得可怜:
- ElevenLabs:10,000 积分/月,大概能合成 6-10 分钟的语音
- OpenAI TTS:没有免费层,直接按量计费
- Google Gemini TTS:也没有免费层
- 阿里云百炼 TTS:有月度免费额度,但用完了需要手动申请
直到看到一条消息:Fish Audio(鱼声)在 2026 年 6 月 23 日宣布将旗舰模型 S2.1 Pro 作为免费 API 开放。
这和其他服务最大的区别是——它把旗舰模型免费开放,公平使用下没有硬性字符上限。这在所有主流 TTS 服务商里是独一份。
是什么:Fish Audio S2.1 Pro Free
Fish Audio 是开源语音技术社区,他们的 S2.1 Pro 是他们最强的 TTS 模型。
核心参数
| 项目 | 数值 |
|---|---|
| API 端点 | POST https://api.fish.audio/v1/tts |
| 免费模型 ID | s2.1-pro-free |
| 定价 | $0.00 / M UTF-8 bytes(同模型付费版 $15) |
| 首句延迟 | ~70-90ms |
| 语言 | 83 种语言(含中文、英语、日语、韩语等) |
| 输出格式 | WAV / MP3(64/128/192kbps)/ Opus |
| 情感标签 | [angry] [sad] [whispering] [laughing] [excited] 等 |
| 声音库 | 2,000,000+ 预设声音 |
| 声音克隆 | 免费层可用 |
和竞品的对比直观一些:
| 服务 | 免费模式 | 免费额度 | 模型层级 |
|---|---|---|---|
| Fish Audio | 完全免费 | 无硬性上限 | 旗舰模型 |
| ElevenLabs | 积分制 | ~6-10 分钟/月 | 基础模型 |
| OpenAI TTS | 无免费层 | — | — |
| 阿里云百炼 TTS | 月度额度 | 有限 | 独立免费模型 |

怎么做:从注册到脚本化
第一步:注册
注册流程比较简单:
- 打开
https://fish.audio/auth/signup - 输入邮箱(支持 QQ 邮箱等国内邮箱)
- 查收验证码邮件(标题:”Fish Audio: Your One-Time Password”,10 分钟有效)
- 填入验证码完成注册
- 登录后到
https://fish.audio/app/api-keys生成 API Key
第二步:直接调 API
拿 Key 后的最简单的测试——一行 curl:
curl -X POST https://api.fish.audio/v1/tts \
-H "Authorization: Bearer 你的API_KEY" \
-H "model: s2.1-pro-free" \
-H "Content-Type: application/json" \
-d '{
"text": "你好,欢迎关注 Fish Audio 免费 TTS。",
"format": "mp3",
"reference_id": "zh-female"
}' \
--output hello.mp3
关键细节:模型 ID 必须在 Header 中传递(--header 'model: s2.1-pro-free'),不是 JSON body。这是 Fish Audio API 的设计,容易忽略。
第三步:脚本化
每次用 curl 太麻烦,写个 Python 脚本封装一下。项目结构如下:
my-tts-project/
├── scripts/
│ └── fish_tts.py # 主脚本
├── test_data/
│ └── demo_cn.mp3 # 中文合成示例
├── env/
│ └── requirements.txt # httpx
└── README.md
核心调用逻辑:
import httpx
def call_tts(api_key, text, model="s2.1-pro-free",
reference_id="zh-female", format="mp3", proxy=None):
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}",
"model": model, # 模型在 header,不是 body!
}
payload = {
"text": text,
"format": format,
"temperature": 0.7,
"top_p": 0.9,
"prosody": {
"speed": 1.0,
"volume": 1.0,
"normalize_loudness": True,
},
}
client_kwargs = {"headers": headers, "timeout": 60}
if proxy:
client_kwargs["proxy"] = proxy # httpx: proxy=url,不是 proxies={}
with httpx.Client(**client_kwargs) as client:
response = client.post("https://api.fish.audio/v1/tts", json=payload)
response.raise_for_status()
return response.content
脚本预设了 6 个精选声音——sarah(英文女声)、adrian(英文男声)、egirl(活力女声)、energetic(活力男声)、zh-female(中文女声)、zh-male(中文男声),支持命令行参数和环境变量两种方式传参:
# 方式1:环境变量
export FISH_API_KEY=***
python3 fish_tts.py "你好,世界" --reference zh-female --output hello.mp3
# 方式2:指定代理
python3 fish_tts.py "你好" --reference zh-female --proxy http://127.0.0.1:7890
# 方式3:列出可选声音
python3 fish_tts.py --list-voices
技术选型用了 httpx 而非 requests:因为 httpx 支持原生代理参数 proxy=(传递 URL 字符串),而 requests 用的是 proxies=(传递字典)。如果你在代理环境下工作,httpx 更顺手。

第四步:集成到工具链
脚本验证通过后,可以根据自己的需求集成到自动化流程中。脚本支持通过环境变量或命令行参数运行,可以配合定时任务、自动化脚本、API 网关等场景使用。
踩坑记录
1. GFW 阻断(最大障碍)
现象:国内直连 api.fish.audio 直接超时。更准确地说——DNS 解析正常(108.160.169.55),但 TCP 连接被阻断。同时 fish.audio 官网也被墙,注册也需要代理环境。
解决方案(按推荐顺序):
| 方案 | 适用场景 | 优缺点 |
|---|---|---|
| 本地代理(Clash/Mihomo) | 日常开发 | 配置简单,全局生效 |
| Cloudflare Worker 中转 | 生产环境 | 零成本,需域名 |
| 海外服务器反向代理 | 高频调用 | 需要服务器,延迟最低 |
脚本中已经内置了 --proxy 参数,配合本地代理一行搞定:
python3 fish_tts.py "你好" --proxy http://127.0.0.1:7890
2. 代理选型踩坑

不是所有代理都能顺利连通 Fish Audio API。实际测试中:
- 直连:完全超时(TCP 被阻断)
- HTTP/HTTPS 代理:部分代理能解析域名,但 TLS 握手阶段失败(exit 35)
- SOCKS5 代理:可以正常连通
如果你的代理是 Clash/Mihomo 系,注意检查是否开启了 UDP 转发和完整的 TLS 支持。如果是自建代理,建议优先用 SOCKS5 协议。
3. httpx 代理参数 vs requests
如果你是 requests 老用户,迁移到 httpx 时注意一个 API 差异:
# requests 写法
requests.get(url, proxies={"http": "...", "https": "..."})
# httpx 写法(更简洁)
httpx.Client(proxy="http://127.0.0.1:7890") # 统一代理,URL 字符串
对于只需要一个统一代理的场景,httpx 更干净。
适用场景
该用 Fish Audio 的时候
- 中文语音合成:因为中文是 Fish Audio 的主要优化方向之一,效果很好
- 需要情感表现力:标签系统可以让语音带上情绪
- 原型开发和测试:免费无上限,适合初期验证
- 多语言内容:一个模型覆盖 83 种语言
不建议的场景
- 超低延迟要求(<50ms):首句延迟 70-90ms,比本地方案慢
- 需要 SLA 保障的线上服务:免费层无 SLA
- 大规模商业应用:ARR > $100 万需联系官方
总结
Fish Audio 把旗舰模型免费开放,是 TTS 市场的一个大动作。如果你有语音合成需求,值得花 10 分钟注册拿 Key 试试——成本和风险都几乎为零。
几条核心建议收尾:
- API Key 存环境变量(不要硬编码到代码里)
- 模型 ID 放 Header(这是最容易忽略的地方)
- 国内用户准备好代理(API 被墙,脚本中已内置
--proxy参数) - 关注官方动态:免费期可能调整,但即使转为收费,也大概率会有合理的免费层
- 先测中文效果:同文本对比多个参考声音,找到最适合你场景的音色