Skip to main content
Glama

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

方法

端点

功能

GET

/health

状态、设备、内存中加载的模型

GET

/voices

音色名称(支持 gender、language 过滤;full=1 → 带元数据)

GET

/languages

24 种语言 + 21 种方言

POST

/clone_voice

参考音频 + 转写文本 → 音色

DELETE

/voices/{name}

删除音色(不触碰原始录音文件)

POST

/tts

文本 → 响应中的音频字节

POST

/synthesize

文本 → DATA_DIR 中的文件,返回带路径的 JSON

POST

/voice_design

音色描述 → 音频(instruct)

POST

/edit

录音编辑:semantic | acoustic(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.mp3

MCP

参见 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 相矛盾,对于克隆音色的商业使用要谨慎。对于 家庭使用则没有问题。

Related MCP Connectors

Related MCP Servers