firered-tts
FireRedTTS3 — мультиязычный TTS (24 языка, вкл. украинский)
Локальный сервис синтеза речи на FireRedTTS3
с HTTP-API и MCP-сервером. Третий в ряду рядом с ukrainian-tts (StyleTTS2, :8000)
и HolosTTS (:8010); этот — на :8020.
Модель вышла 13.08.2026, лицензия Apache 2.0, веса публичные.
Чем отличается от соседей
ukrainian-tts | HolosTTS | firered-tts | |
Языки | украинский | украинский | 24 + 21 диалект |
Пресетные голоса | да | 27 | нет вообще |
Клонирование | нет | да (вектор стиля) | да (zero-shot) |
Нужен транскрипт референса | — | нет | да |
Дизайн голоса по описанию | нет | нет | да (instruct) |
Редактирование записи | нет | нет | да (instruct) |
Размер в памяти | ~1 ГБ | ~4 ГБ | ~7.7 ГБ весов, ~13 ГБ след процесса |
Ударения (укр.) | словарь + ByT5 | словарь + ByT5 | нет |
Три вещи, которые стоит понимать, прежде чем начать:
1. Пресетных голосов нет. Пустая библиотека = синтезировать нечем.
Сначала заводишь голос из любой записи речи (add_firered_voice),
дальше используешь его по имени. Модель клонирует zero-shot прямо во время синтеза.
2. Нужен транскрипт референса. Модели мало самого аудио — нужен ещё текст того, что в нём звучит. Не передашь — распознаём Whisper'ом, но свой текст всегда точнее.
3. Ударений нет. Ни словаря, ни ByT5-фолбека, ни ручного Му+дрого,
как у соседей. Ударения модель ставит сама из контекста, и на омографах
(за́мок/замо́к) она их путает. Это принципиальное ограничение
мультиязычной модели — если ударения критичны, HolosTTS до сих пор лучший выбор
для чистого украинского.
Related MCP server: STT2TTS MCP
Установка
cd /Users/admin/Projects/firered-tts
./setup.sh # venv + залежності + апстрім + патч + вагиsetup.sh делает четыре вещи:
.venvс Python 3.11, torch 2.8.0 под MPS/CPUклонирует апстрим в
vendor/FireRedTTS3на зафиксированном коммите00570adпатчит его под Apple Silicon — см. ниже
тянет веса base+redae (~11.4 ГБ) в
pretrained_models/
Веса отдельно (долго — лучше detached):
nohup ./download-weights.sh base > data/download.log 2>&1 &
./download-weights.sh instruct # +7.9 ГБ, для дизайну голосу й редагуванняЗачем патч
Апстрим написан исключительно под NVIDIA и на Mac не запускается вообще:
Место | Было | Стало |
|
|
|
| то же самое, ×2 |
|
|
| динамическое устройство |
|
| из |
|
| под |
flash_attn — CUDA-only, на Metal не собирается в принципе; sdpa работает
везде, в т.ч. на NVIDIA, так что патч ничего не ломает.
Десятое место в патче стоит отдельно: base.py:317 — это не портативность, а
производительность (кеш кодирования референса, см. «Скорость» ниже).
src/patch_upstream.py идемпотентный и падает, если замена не попала —
если апстрим изменился, ты узнаешь об этом сразу, а не CUDA-ошибкой на
первом синтезе.
Запуск
./run.sh # http://localhost:8020Отдельно запускать не обязательно — MCP-сервер поднимет бекенд сам. Бекенд
выключается после 1800с простоя (IDLE_SHUTDOWN_SECONDS) и освобождает память.
run.sh берёт лок на порт (data/.start-<порт>.lock): второй запуск при
живом сервисе просто выйдет с кодом 0. Это намеренно — autostart дёргают
несколько клиентов сразу, а /health молчит все ~90с загрузки.
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 ГБ. На диске base (7.9) + redae (3.5) = 11.4 ГБ, но в
память идёт ~7.7 ГБ: LLM-бекбон грузится в fp16 (4.2 вместо 8.4 —
см. оптимизацию 2 ниже), остальное остаётся fp32.
Веса — не вся картина. Измерено на живом процессе после синтеза:
phys_footprint: 13 ГБ
phys_footprint_peak: 14 ГБРазница между 7.7 и 13 — кеш MPS-аллокатора, KV-кеш и активации генерации. На
16 ГБ это впритык даже одним процессом, и ps/RSS тут врёт (показывает
десятые гигабайта: MPS-буферы в unified memory в RSS не попадают). Меряй
footprint, не ps.
Последствия, заложенные в код:
в памяти живёт ровно одна модель —
baseилиinstruct; переключение = полная перезагрузка (минуты, громко логируется);синтез сериализован глобальным локом — два параллельных запроса на 16 ГБ дают OOM, а не ускорение;
run.shберёт лок на порт — иначе несколько клиентов, делающих autostart одновременно, поднимают по копии бекенда каждый (реальный случай: семь процессов на 16 ГБ);автоостановка по простою 1800с — дольше, чем у соседей, намеренно: рестарт стоит ~40с компиляции шейдеров, так что держать процесс живым выгоднее;
Whisper для автотранскрипта —
int8на CPU, выгружается сразу после распознавания.
Скорость и четыре оптимизации
Наивный запуск апстрима на M4 давал ×189 реального времени — 3 секунды
украинского считались 9.5 минуты. Три исправления дали ×4.0, то есть в 48
раз быстрее; четвёртое довело до ×2.7. Что именно было не так (замерено
tools/profile_steps.py и инструментацией):
1. Autocast на шаге AR-цикла — главная беда. Апстрим вешает
@torch.autocast декоратором на _backbone_one_step, то есть регион autocast
открывается и закрывается на КАЖДОМ шаге авторегрессии. Кеш перекастов весов
в torch живёт ровно внутри региона, так что 1.7B параметров fp32 перегонялись в
half на каждом шагу. Шаг бекбона: 19000 мс → 2710 мс. Теперь autocast
выключен по умолчанию, а каст делается явно на границе бекбона.
2. Бекбон в fp32. Веса сохранены в float32 (3.0B параметров = 11.4 ГБ), что на 16 ГБ означает своп. Переводим в half лишь LLM-бекбон (4.2 ГБ вместо 8.4), а redae и flow-декодер оставляем fp32 — апстрим там намеренно работает в полной точности, и half ломает MPS-matmul. Шаг: 2710 → 1387 мс.
3. Компиляция Metal-шейдеров. Самая большая часть «медленности» оказалась
разовой: Metal компилирует ядра при первом выполнении. Поштучные замеры шага
бекбона: 9873, 2104, 120, 93, 96, 97… мс. Поэтому сервис делает прогрев на
старте (FIRERED_WARMUP=1) и имеет долгий таймаут простоя — рестарт стоит
~40 секунд компиляции.
4. Кеш кодирования референса. generate() вызывается на КАЖДОЕ предложение,
и каждый вызов заново прогонял redae-энкодер по референсной записи — 5.58с
каждый раз, независимо от длины текста. Ключ кеша — содержимое аудио, а не id
тензора, так что подменить голос кеш не может. На прогоне 6.6 мин аудио (14 чанков):
30 попаданий против 2 промахов ≈ 150с, то есть ~11% времени.
Минута аудио считается ~2.7 минуты (Mac mini M4 / 16 ГБ, прогретая модель, тёплый кеш референса; лучший из 5 чередующихся раундов на 3.0с украинского, медиана даёт ×2.9). Real-time нет, но это уже рабочий инструмент, а не «запусти на ночь».
Профиль прогретой генерации: flow-декодер 57%, бекбон 18%, redae 11%.
n_timesteps — шаги ODE в flow-декодере, самой дорогой части. Параметр
доступен в /tts, MCP и FIRERED_N_TIMESTEPS, но дефолт 10, как в
апстриме: апстрим его не документирует и нигде не предлагает крутить, а ниже 4
качество заметно грубеет. По тому же замеру: 10 → ×2.7, 6 → ×1.9,
4 → ×1.3, 2 → ×1.0. Снижай только под конкретную задачу и со сверкой на слух.
Text normalization
Встроенный TN (wetext) знает лишь китайский и английский, так что для
украинского он бесполезен, и мы его не ставим. 19:30, 250 грн, 2026 р.
модель озвучит как получится.
Два выхода:
писать текст сразу словами;
включить LLM-TN —
FIRERED_TN_API_URL/_API_KEY/_MODELв.env. Подойдёт любой OpenAI-совместимый эндпоинт, включая локальный (llama.cpp / vLLM / Ollama) — тогда всё остаётся офлайн.
Лицензия
Код и веса — Apache 2.0. В README апстрима отдельно написано, что zero-shot клонирование «solely for academic research purposes» — это противоречит Apache 2.0, и на коммерческое использование клонированных голосов смотри осторожно. Для домашнего использования вопрос не стоит.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityCmaintenanceA 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.322MIT
- AlicenseNot gradedqualityBmaintenanceLocal-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 gradedqualityCmaintenanceA 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 gradedqualityCmaintenanceHeadless text-to-speech and speech-to-text server with REST and MCP API, supporting Kokoro TTS and Whisper STT.MIT
Related MCP Connectors
Hosted pay-per-use TTS: 54 neural voices, 9 languages incl. Brazilian Portuguese. $10 free credits.
MCP server exposing the AceDataCloud Fish Audio API (text-to-speech with voice conditioning)
MCP server for Kling AI video generation
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/taral14/firered-tts'
If you have feedback or need assistance with the MCP directory API, please join our Discord server