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 は4つのことを行う:Python 3.11 と torch 2.8.0 を備えた .venv を MPS/CPU 用に構築し、アップストリームを固定コミット 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 ではまったく起動しない: 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 で動作(8.4 GB の代わりに 4.2 GB)— だが、 16 GB ではそれでもぎりぎり。コードに組み込まれた結果:

  • メモリ内にはちょうど1つのモデルが存在する — base または instruct; 切り替え = 完全な再ロード(数分、ログに明示される);

  • 合成はグローバルロックで直列化される — 16 GB での2つの並列リクエストは 高速化ではなく OOM を引き起こす;

  • アイドル 1800 秒で自動停止 — 意図的に長い:再起動には約40秒の シェーダーコンパイルが必要なため、プロセスを生かしておく方が有利;

  • 自動書き起こし用の Whisper — CPU 上の int8、認識後すぐにアンロードされる。

速度と4つの最適化

M4 での素朴なアップストリーム起動は 実時間の ×186 だった — ウクライナ語3秒が 9分かかった。4つの修正後、×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 に変換(8.4 GB の代わりに 4.2 GB)、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 р. は モデルがそのまま読み上げる。2つの選択肢:テキストを最初から単語で書くか、 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 と矛盾し、クローンされた音声の商用利用には注意が必要。 家庭での使用には問題ない。

Related MCP Connectors

Related MCP Servers