firered-tts
FireRedTTS3 — 多语言 TTS(24 种语言,含乌克兰语)
基于 FireRedTTS3 的本地语音合成服务, 提供 HTTP-API 和 MCP 服务器,端口 :8020。
模型发布于 2026 年 8 月 13 日,Apache 2.0 许可证,权重公开。
开始前需要了解的事项
没有预设音色。 空库 = 无法合成。首先
从任意语音录音中创建音色(add_firered_voice),之后
按名称使用该音色。模型在合成时直接进行 zero-shot 克隆。
需要参考音频的转写文本。 模型仅有音频不够——还需要 音频中内容的文本。不提供的话——我们用 Whisper 识别,但自己提供的 文本总是更准确。
没有重音标记。 既没有词典,也没有 ByT5 回退,更没有手动 Му+дрого。
重音由模型根据上下文自行判断,在同形异义词(за́мок/замо́к)上
会混淆。这是多语言模型的根本性限制。
Related MCP server: STT2TTS MCP
安装
cd /Users/admin/Projects/firered-tts
./setup.sh # venv + залежності + апстрім + патч + вагиsetup.sh 做四件事:创建带 Python 3.11 和 torch 2.8.0 的 .venv
(支持 MPS/CPU),将上游克隆到 vendor/FireRedTTS3 并固定在提交
00570ad,为其打上 Apple Silicon 补丁(见下文),并将
base+redae 权重(约 11.4 GB)下载到 pretrained_models/。
权重单独下载(耗时较长——建议后台运行):
nohup ./download-weights.sh base > data/download.log 2>&1 &
./download-weights.sh instruct # +7.9 ГБ, для дизайну голосу й редагування为什么需要补丁
上游仅针对 NVIDIA 编写,在 Mac 上完全无法运行:
flash_attn 在 Metal 上根本无法编译,设备被硬编码为 cuda,
autocast 被死死绑定在 CUDA 上。补丁将 flash_attention_2 替换为 sdpa
(在任何地方都能用,包括 NVIDIA),使设备变为动态,并添加了
速度优化章节中的优化。完整列表见
src/patch_upstream.py 的头部。
补丁是幂等的,如果替换未命中会直接失败——如果上游 发生了变化,你会立刻知道,而不是在第一次合成时遇到 CUDA 错误。
启动
./run.sh # http://localhost:8020不必单独启动——MCP 服务器会自行拉起后端。后端 在空闲后自动关闭并释放内存。
HTTP API
方法 | 端点 | 功能 |
|
| 状态、设备、内存中加载的模型 |
|
| 音色名称(支持 |
|
| 24 种语言 + 21 种方言 |
|
| 参考音频 + 转写文本 → 音色 |
|
| 删除音色(不触碰原始录音文件) |
|
| 文本 → 响应中的音频字节 |
|
| 文本 → |
|
| 音色描述 → 音频(instruct) |
|
| 录音编辑: |
# 1) завести голос
curl -X POST localhost:8020/clone_voice -H 'Content-Type: application/json' -d '{
"audio": "prompts/зразок.wav", "name": "Богдан",
"prompt_text": "Це зразок мого голосу для клонування.",
"language": "Ukrainian", "gender": "male"}'
# 2) озвучити
curl -X POST localhost:8020/tts -H 'Content-Type: application/json' -d '{
"text": "Сьогодні чудова погода, ходімо гуляти в парк.",
"voice": "Богдан", "format": "mp3"}' -o out.mp3
# Або one-shot — без реєстрації голосу: передай reference_audio замість voice,
# транскрипт зробить Whisper (перший виклик +~30с, далі кешується)
curl -X POST localhost:8020/tts -H 'Content-Type: application/json' -d '{
"text": "Сьогодні чудова погода.", "reference_audio": "prompts/зразок.mp3",
"format": "mp3"}' -o out.mp3MCP
参见 mcp_server/README.md。简要说明:
claude mcp add firered-tts -- /Users/admin/Projects/firered-tts/.venv/bin/python \
/Users/admin/Projects/firered-tts/mcp_server/server.py工具:firered_backend_status、list_firered_voices、
add_firered_voice、delete_firered_voice、synthesize_firered_speech、
design_firered_voice、edit_firered_speech。
内存
Mac mini M4,16 GB。磁盘上的权重:base(7.9)+ redae(3.5)= 11.4 GB。
内存中占用更少——LLM 骨干网络以 half 精度运行(4.2 而非 8.4 GB)——但在
16 GB 上仍然很紧张。代码中已考虑到的后果:
内存中同时只驻留一个模型——
base或instruct; 切换 = 完全重新加载(需要几分钟,有醒目的日志);合成通过全局锁串行化——16 GB 上两个并行请求 会导致 OOM,而不是加速;
空闲 1800 秒后自动停止——故意设得很长:重启需要约 40 秒 的着色器编译,所以保持进程存活更划算;
用于自动转写的 Whisper——CPU 上的
int8,识别完成后 立即卸载。
速度与四项优化
在上游 M4 上朴素运行是 ×186 实时——3 秒乌克兰语
需要计算 9 分钟。经过四项修复后变为 ×3.0,
即快了约 60 倍。具体问题出在哪里(全部通过
tools/profile_steps.py 测量):
1. AR 循环步骤上的 Autocast——最大的问题。 上游用
@torch.autocast 装饰器挂在 _backbone_one_step 上,即区域
在自回归的每一步都打开和关闭。torch 中的权重重转换缓存
只存在于区域内,因此 1.7B 个 fp32 参数每一步都要转成
half。骨干网络步骤:19000 → 2710 毫秒。现在 autocast 已禁用,
转换在骨干网络边界显式进行。
2. 骨干网络使用 fp32。 权重以 float32 保存(3.0B 参数),在 16 GB 上 意味着交换。仅将 LLM 骨干网络转为 half(4.2 GB 而非 8.4), redae 和 flow 解码器保持 fp32——half 会破坏那里的 MPS-matmul。步骤: 2710 → 1387 毫秒。
3. 参考音频每个句子都重新编码。 generate() 对文本的每个
句子都会被调用,每次调用都会对同一个参考录音
运行 redae 编码器:每次 5.6 秒,与文本长度无关。现在
使用以音频内容为键的缓存。6.6 分钟音频——30 次命中对 2
次未命中,约占运行时间的 11%。
4. Metal 着色器编译。 “慢”的最大部分其实是
一次性的:Metal 在首次执行时编译内核。骨干网络步骤的逐次测量:
9873, 2104, 120, 93, 96, 97… 毫秒。因此服务在
启动时进行预热(FIRERED_WARMUP=1)并设置较长的空闲超时。
在 Mac mini M4 / 16 GB 上测量,3.0 秒乌克兰语,模型已预热:
n_timesteps | 时间 | ×实时 | 质量 |
10(默认) | 12 秒 | ×4.0 | 基准 |
6 | 10 秒 | ×3.0 | 差异几乎听不出来 |
4 | 7 秒 | ×2.3 | 明显更粗糙 |
2 | 6 秒 | ×1.9 | 明显伪影 |
预热后生成的分析:flow 解码器 57%,骨干网络 18%,redae 11%——
最有效的杠杆就是 n_timesteps。没有实时,但这已经是
可用的工具,而不是“跑一晚上”。
文本规范化
内置 TN(wetext)只支持中文和英文,因此对乌克兰语
毫无用处,我们不安装它。19:30、250 грн、2026 р.
模型会尽力读出。两种方案:直接以单词形式书写文本,或者
启用 LLM-TN——在 .env 中设置 FIRERED_TN_API_URL / _API_KEY / _MODEL。
任何 OpenAI 兼容端点都可以,包括本地
(llama.cpp / vLLM / Ollama)——这样一切保持离线。
许可证
代码和权重均为 Apache 2.0。上游 README 中特别注明 zero-shot 克隆“solely for academic research purposes”——这与 Apache 2.0 相矛盾,对于克隆音色的商业使用要谨慎。对于 家庭使用则没有问题。
This server cannot be deployed
Maintenance
Related MCP Connectors
Hosted text-to-speech MCP server: 66 voices in 9 languages, long-form narration, podcasts.
71AI voice generation: text-to-speech and voice cloning from any MCP client.
MCP server for Text-to-Speech
- AudexumOAuthcom.audexum
Text to speech and transcription for any AI model: MP3 voiceovers, audio and YouTube to text.
Related MCP Servers
- AlicenseAqualityDmaintenanceA Model Context Protocol server for FlowSpeech text-to-speech. It lets MCP-compatible clients generate human-like audio with context-aware emotion control, pause control, multi-speaker dialogue, and 30+ available voices.317 npmMIT
- AlicenseNot gradedqualityDmaintenanceLocal-first speech-to-text and text-to-speech MCP server. Hot-swappable engines via config.yaml — no code changes, no API keys required.2MIT
- AlicenseNot gradedqualityBmaintenanceA text-to-speech MCP server with 48 voices across 9 languages, supporting emotion spans, SFX tags, and multi-speaker dialogue. Deployable via a single npx command with built-in guardrails and swappable backends.MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for Vietnamese text-to-speech with voice cloning, 10 built-in voices, text normalization, and long-form queuing, running 100% locally.Apache 2.0