firered-tts
FireRedTTS3 — 다국어 TTS (24개 언어, 우크라이나어 포함)
FireRedTTS3 기반 로컬 음성 합성 서비스로,
HTTP-API와 MCP 서버를 갖추고 있다. ukrainian-tts(StyleTTS2, :8000)와
HolosTTS(:8010) 옆에 있는 세 번째 서비스이며, 이번 것은 :8020에서 동작한다.
모델은 2026년 8월 13일에 출시되었고, 라이선스는 Apache 2.0, 가중치는 공개되어 있다.
이웃 서비스와의 차이점
ukrainian-tts | HolosTTS | firered-tts | |
언어 | 우크라이나어 | 우크라이나어 | 24개 + 21개 방언 |
프리셋 음성 | 있음 | 27개 | 전혀 없음 |
클로닝 | 없음 | 있음 (스타일 벡터) | 있음 (zero-shot) |
레퍼런스 전사(transcript) 필요 | — | 없음 | 필요함 |
설명 기반 음성 디자인 | 없음 | 없음 | 있음 (instruct) |
녹음 편집 | 없음 | 없음 | 있음 (instruct) |
메모리 사용량 | ~1 GB | ~4 GB | ~7.7 GB 가중치, ~13 GB 프로세스 |
강세 (우크라이나어) | 사전 + ByT5 | 사전 + ByT5 | 없음 |
시작하기 전에 알아둬야 할 세 가지:
1. 프리셋 음성이 없다. 빈 라이브러리 = 합성할 수단이 없다.
먼저 아무 음성 녹음에서 음성을 등록하고(add_firered_voice),
그다음 이름으로 사용한다. 모델은 합성 중에 zero-shot으로 클로닝한다.
2. 레퍼런스 전사(transcript)가 필요하다. 모델에게는 오디오만으로 부족하다 — 오디오에 담긴 내용의 텍스트도 필요하다. 전달하지 않으면 Whisper로 인식하지만, 직접 작성한 텍스트가 항상 더 정확하다.
3. 강세가 없다. 사전도, ByT5 폴백도, 이웃 서비스의 수동 Му+дрого 방식도 없다.
모델이 문맥에서 강세를 스스로 결정하며, 동음이의어(за́мок/замо́к)에서는
혼동할 것이다. 이것은 다국어 모델의 근본적인 한계다 — 강세가 중요하다면,
순수 우크라이나어에는 HolosTTS가 여전히 더 나은 선택이다.
Related MCP server: STT2TTS MCP
설치
cd /Users/admin/Projects/firered-tts
./setup.sh # venv + залежності + апстрім + патч + вагиsetup.sh는 네 가지 작업을 수행한다:
Python 3.11, MPS/CPU용 torch 2.8.0이 포함된
.venv생성고정 커밋
00570ad에서 업스트림을vendor/FireRedTTS3로 클론Apple Silicon용 패치 적용 — 아래 참조
base+redae 가중치(~11.4 GB)를
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 전용이라 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 GB. 디스크에는 base(7.9) + redae(3.5) = 11.4 GB가 있지만,
메모리에는 ~7.7 GB가 로드된다: LLM 백본은 fp16으로 로드되고(8.4 대신 4.2 —
아래 최적화 2 참조), 나머지는 fp32로 유지된다.
가중치가 전부가 아니다. 합성 후 실제 프로세스에서 측정한 값:
phys_footprint: 13 ГБ
phys_footprint_peak: 14 ГБ7.7과 13의 차이는 MPS 할당자 캐시, KV-캐시, 생성 활성화 때문이다. 16 GB에서는
단일 프로세스로도 빠듯하며, ps/RSS는 여기서 거짓말을 한다(수 GB를
표시함: MPS 버퍼는 unified memory에 있어 RSS에 포함되지 않는다). footprint로
측정하라, ps가 아니라.
코드에 반영된 결과:
메모리에는 정확히 하나의 모델만 상주한다 —
base또는instruct; 전환 = 전체 재로딩(수 분, 로그에 명확히 표시됨);합성은 전역 락으로 직렬화된다 — 16 GB에서 두 개의 병렬 요청은 가속이 아니라 OOM을 유발한다;
run.sh는 포트에 락을 건다 — 그렇지 않으면 동시에 autostart를 수행하는 여러 클라이언트가 각자 백엔드 복사본을 띄우게 된다(실제 사례: 16 GB에서 프로세스 7개);1800초 유휴 자동 종료 — 이웃 서비스보다 의도적으로 길다: 재시작에 ~40초 셰이더 컴파일이 들므로 프로세스를 유지하는 것이 더 이득;
자동 전사를 위한 Whisper — CPU에서
int8, 인식 직후 즉시 언로드.
속도와 네 가지 최적화
M4에서 업스트림을 순수하게 실행하면 실시간의 ×189 — 우크라이나어 3초가
9.5분이 걸렸다. 세 가지 수정으로 ×4.0, 즉 48배 빨라졌고, 네 번째로
×2.7까지 도달했다. 무엇이 문제였는지(tools/profile_steps.py 및
계측으로 측정):
1. AR-루프 단계의 autocast — 가장 큰 문제. 업스트림은 _backbone_one_step에
@torch.autocast 데코레이터를 걸어 autocast 영역이 자기회귀의 매 단계마다
열리고 닫힌다. torch의 가중치 재캐스트 캐시는 영역 내에서만 유지되므로,
1.7B fp32 파라미터가 매 단계 half로 변환되었다. 백본 단계: 19000 ms → 2710 ms.
이제 autocast는 기본적으로 꺼져 있고, 캐스트는 백본 경계에서 명시적으로 수행된다.
2. 백본을 fp32로. 가중치는 float32로 저장되어(3.0B 파라미터 = 11.4 GB), 16 GB에서는 스왑을 의미한다. LLM 백본만 half로 변환하고(8.4 대신 4.2 GB), redae와 flow 디코더는 fp32로 유지한다 — 업스트림은 의도적으로 전체 정밀도로 동작하며, half는 MPS-matmul을 깨뜨린다. 단계: 2710 → 1387 ms.
3. Metal 셰이더 컴파일. '느림'의 가장 큰 부분은 일회성으로 밝혀졌다:
Metal은 첫 실행 시 커널을 컴파일한다. 백본 단계의 개별 측정:
9873, 2104, 120, 93, 96, 97… ms. 따라서 서비스는 시작 시 워밍업을
수행하고(FIRERED_WARMUP=1), 긴 유휴 타임아웃을 가진다 — 재시작에
~40초 컴파일이 들기 때문이다.
4. 레퍼런스 인코딩 캐시. generate()는 모든 문장에 대해 호출되며,
각 호출이 레퍼런스 녹음을 redae 인코더로 다시 통과시켰다 — 텍스트 길이와
무관하게 매번 5.58초. 캐시 키는 텐서 id가 아니라 오디오 내용이므로,
캐시가 음성을 바꿔치기할 수는 없다. 6.6분 오디오 실행(14개 청크)에서:
히트 30회 대 미스 2회 ≈ 150초, 즉 ~11%의 시간.
오디오 1분은 ~2.7분으로 계산된다 (Mac mini M4 / 16 GB, 워밍업된 모델, 따뜻한 레퍼런스 캐시; 우크라이나어 3.0초에 대한 5회 교대 라운드 중 최고, 중앙값은 ×2.9). 실시간은 아니지만, 이제 '밤새 돌려라'가 아니라 실사용 가능한 도구다.
워밍업된 생성 프로파일: flow 디코더 57%, 백본 18%, redae 11%.
n_timesteps — 가장 비싼 부분인 flow 디코더의 ODE 단계. 이 파라미터는
/tts, MCP, FIREDRED_N_TIMESTEPS에서 사용할 수 있지만, 기본값은 업스트림과
동일한 10: 업스트림은 이를 문서화하지도, 조정을 제안하지도 않으며,
4 미만에서는 품질이 눈에 띄게 거칠어진다. 동일한 측정 기준: 10 → ×2.7,
6 → ×1.9, 4 → ×1.3, 2 → ×1.0. 특정 작업에 한해서만, 청취 검증과 함께 낮춰라.
텍스트 정규화
내장 TN(wetext)은 중국어와 영어만 알기 때문에 우크라이나어에는 쓸모가
없어 설치하지 않는다. 19:30, 250 грн, 2026 р.는 모델이 되는 대로
발음한다.
두 가지 해결책:
텍스트를 처음부터 단어로 작성;
LLM-TN 활성화 —
.env에FIRERED_TN_API_URL/_API_KEY/_MODEL. 로컬(llama.cpp / vLLM / Ollama)을 포함한 모든 OpenAI 호환 엔드포인트가 가능하다 — 그러면 모든 것이 오프라인으로 유지된다.
라이선스
코드와 가중치는 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