Closed7

「FireRedTTS2」を試す

kun432kun432

GitHubレポジトリ

https://github.com/FireRedTeam/FireRedTTS2

FireRedTTS-2

概要

FireRedTTS-2は複数話者の対話生成に対応した長尺ストリーミングTTSシステムであり、話者切替の確実性と文脈に応じたプロソディを備えた、安定かつ自然な音声を提供します。

ハイライト🔥

  • 長尺の会話音声生成:現時点では4話者による3分間の対話をサポートします。学習コーパスを拡張することで、より多くの話者・より長い会話へ容易にスケールできます。

  • 多言語対応:英語、中国語、日本語、韓国語、フランス語、ドイツ語、ロシア語を含む複数言語をサポートします。ゼロショット音声クローンにより、クロスリンガルやコードスイッチングのシナリオに対応します。

  • 超低レイテンシ:新しい12.5Hzストリーミング音声トークナイザに基づき、テキストと音声が交互に並ぶシーケンス上で動作するデュアルTransformer構成を採用。柔軟な文単位生成を可能にし、初回パケットの遅延を削減します。具体的には、L20 GPU上で初回パケット遅延が最小140msでありつつ高品質な音声を維持します。

  • 高い安定性:モノローグおよびダイアログの両テストにおいて、高い類似度と低いWER/CERを達成します。

  • ランダム音色生成:ASR/音声対話データの作成に有用です。

ロードマップ

  • 2025/09
    • 事前学習済みチェックポイントと推論コードをリリース。
    • Web UIツールを追加。
  • 2025/10
    • 多言語対応を強化したベースモデルをリリース。
    • 特定の対話/多言語データ向けのファインチューニング用コード & チュートリアルを提供。
    • エンドツーエンドのText-to-Blogパイプライン。

謝辞

  • Moshi および Sesame CSM による新規なデュアルTransformer手法に感謝します。加えて、Sesame CSM の構造と推論のコア実装を適用しました。
  • 文章トークナイザはQwen2.5-1.5Bのソリューションを参照しました。
  • 音響デコーダはXcodec2のVocosベース実装を参照しました。

⚠️ 使用上の注意 ❗️❗️❗️❗️❗️❗️

  • 本プロジェクトにはゼロショット音声クローン機能が含まれます。学術研究目的に限って利用してください。
  • いかなる違法行為にも使用しないでください❗️❗️❗️❗️❗️❗️
  • 本モデルの不正使用に対し、開発者は一切の責任を負いません。
  • 本プロジェクトに関連する濫用悪用不正の事例を発見した場合は、直ちにチームへ報告してください。

モデル

https://huggingface.co/FireRedTeam/FireRedTTS2

ライセンスは多分Apache-2.0。

kun432kun432

余談

開発元であるFireRedTeamは他にも以下をリリースしている

FireRedTTS2の前身であるFireRedTTS1
https://github.com/FireRedTeam/FireRedTTS/tree/main

FireRedTTS1ベースでストリーミングに対応したFireRedTTS-1S
https://github.com/FireRedTeam/FireRedTTS

FireRedASR
https://github.com/FireRedTeam/FireRedASR

上記を組み合わせてた双方向チャットができるFireRedChat
https://github.com/FireRedTeam/FireRedChat

FireRedTTS2の謝辞にもある通り、Moshiなどに代表されるような、よりリアルな会話ソリューションを目指しているのではないかと思われる。

なお、FireRedTTS-1S を少し試してみたのだけど、いろいろライブラリの依存がきつい感があって、自分の環境では動かせなかった。

kun432kun432

インストール

READMEに従って試してみる。今回はローカルのUbuntu-22.04サーバ(RTX4090)で。

レポジトリクローン

git clone https://github.com/FireRedTeam/FireRedTTS2 && cd FireRedTTS2

uvでPython仮想環境を作成

uv venv -p 3.12

PyTorchをインストール

uv pip install "torch==2.7.1" "torchvision==0.22.1" "torchaudio==2.7.1" --torch-backend=auto

依存パッケージをインストール

uv pip install -e .
uv pip install -r requirements.txt

モデルをダウンロード

git lfs install
git clone https://huggingface.co/FireRedTeam/FireRedTTS2 pretrained_models/FireRedTTS2

使い方

推論は

  • GradioのWebUI
  • Python

が用意されている。

まずはGradioのWebUIで。

GRADIO_SERVER_NAME="0.0.0.0" uv run gradio_demo.py --pretrained-dir "./pretrained_models/FireRedTTS2"

こんな感じの画面になる。中国語はわからないので英語に切り替えている。

基本的にWebUIは対話音声(ダイアログ)の生成専用みたい。サンプルコードだと一人の音声(モノローグ)もあるみたいだけど、それは後ほど。

まずはランダムな音声でやってみる。右上のVoice Modeを"Random Voice"に変更。

入力画面が変わるので対話を入力して生成。サンプルの対話文はChatGPTで適当に生成してもらった。"[S1]...[S2]...[S1]..." という感じで入力すれば良いみたい。まず英語から。

[S1] Hi! I'd like to chat. Is it okay if we start with hobbies?
[S2] Of course! What hobby are you into lately?
[S1] Photography, and guitar sometimes. On days off I take street snaps around town.
[S2] Nice! For photography, do you shoot more film or digital? And for guitar, are you into electric or acoustic?
[S1] Mostly digital. For guitar, acoustic. I keep my gear on the lighter side.
[S2] Lightweight gear is perfect for street shots. If you want to shoot quickly, aperture priority with auto ISO is easy to handle.
[S1] Yeah, I'll try those settings. I'm struggling with composition feeling stale.
[S2] To beat the rut, try these three simple steps: (1) fix your distance to the subject, (2) leave negative space on just one side, (3) shoot single frames with pauses instead of bursts.
[S1] OK, I'll start with fixing the distance.

生成された。上記のサンプルだと50秒ぐらい。

実際に生成されたもの。

https://audio.com/kun432/audio/fireredtts-2-sample-en-01

ランダムな音声を選択しているので、再度生成すると音声が変わる。再生成したものは以下。

https://audio.com/kun432/audio/fireredtts-2-sample-en-02

次に日本語でもやってみる。上のサンプルの対話文を日本語にしたもの。

[S1]こんにちは!雑談したいです。趣味の話からいいですか?
[S2]もちろん!最近ハマっている趣味は何ですか?
[S1]写真撮影と、たまにギターです。休日に街角スナップ撮ってます。
[S2]いいですね。写真はフィルムとデジタル、どちらが多いですか?あとギターはエレキとアコギどちら派?
[S1]デジタルが多いです。ギターはアコギ。機材は軽めで揃えてます。 
[S2]機材が軽いのは街スナップに相性抜群です。もし素早く撮るなら、絞り優先とオートISOの組み合わせが扱いやすいですよ。 
[S1]うん、設定は試してみます。構図がマンネリで悩んでます。 
[S2]マンネリ対策なら、1. 被写体との距離を固定、2. 片側だけに余白を作る、3.連写ではなく単写で間を置く、の3ステップが簡単ですよ。 
[S1]OK。じゃあ距離固定からやってみます。

生成されたもの。ちょっと発話ミス(「!」を「あたる」と発話してたり、発話されない箇所があったり)はあるものの、結構自然な気がする。

実際に生成されたものは以下のような感じ。ランダムで選択された音声によって結構印象が変わるかな。

https://audio.com/kun432/audio/fireredtts-2-sample-ja-01

https://audio.com/kun432/audio/fireredtts-2-sample-ja-02

次に音声クローン。

こちらはリファレンスとなる音声データが必要になる。レポジトリにある英語の音声データを使用させてもらう。

https://github.com/FireRedTeam/FireRedTTS2/tree/main/examples/chat_prompt

それぞれのファイルの発話内容は以下のような感じだった。

  • en/S1.flac(examples_chat_prompt_en_S1.flac): I think we should just talk about what happened and move on because there's gonna be other jails and you and and and Sir Saif isn't done yet. It's not he's not it's not done yet.
  • en/S2.flac(examples_chat_prompt_en_S2.flac): You know, maybe, sorry, maybe, maybe I pushed, maybe I pushed too hard. I was really excited. I didn't mean to make you snap.

Voice Mode を "Voice Clone" に変更、それぞれの音声ファイルをアップロードしてテキストを設定、最後に発話したい対話分を入力して生成。

生成されたもの

https://audio.com/kun432/audio/fireredtts-2-sample-clone-01

読み間違いやちょっと英語が残ってる感はあるけど、リファレンスとなる音声データも日本語で揃えてあげれば、発話精度は上がりそうな気がする。

なお、VRAMは14GBぐらい。

出力
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.172.08             Driver Version: 570.172.08     CUDA Version: 12.8     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 4090        On  |   00000000:01:00.0 Off |                  Off |
|  0%   51C    P8             11W /  450W |   13994MiB /  24564MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
kun432kun432

次にPythonで。

音声プロンプトを使った対話音声の生成。

sample_dialogue.py
import os
import sys
import torch
import torchaudio
from fireredtts2.fireredtts2 import FireRedTTS2

device = "cuda"

fireredtts2 = FireRedTTS2(
    pretrained_dir="./pretrained_models/FireRedTTS2",
    gen_type="dialogue",
    device=device,
)

text_list = [
    "[S1]こんにちは!雑談したいです。趣味の話からいいですか?",
    "[S2]もちろん!最近ハマっている趣味は何ですか?",
    "[S1]写真撮影と、たまにギターです。休日に街角スナップ撮ってます。",
    "[S2]いいですね。写真はフィルムとデジタル、どちらが多いですか?あとギターはエレキとアコギどちら派?",
    "[S1]デジタルが多いです。ギターはアコギ。機材は軽めで揃えてます。 ",
    "[S2]機材が軽いのは街スナップに相性抜群です。もし素早く撮るなら、絞り優先とオートISOの組み合わせが扱いやすいですよ。 ",
    "[S1]うん、設定は試してみます。構図がマンネリで悩んでます。 ",
    "[S2]マンネリ対策なら、1. 被写体との距離を固定、2. 片側だけに余白を作る、3.連写ではなく単写で間を置く、の3ステップが簡単ですよ。 ",
    "[S1]OK。じゃあ距離固定からやってみます。",
]

# 音声プロンプトの音声ファイル
prompt_wav_list = [
    "examples/chat_prompt/zh/S1.flac",
    "examples/chat_prompt/zh/S2.flac",
]

# 音声プロンプトのテキスト
prompt_text_list = [
    "[S1]啊,可能说更适合美国市场应该是什么样子。那这这个可能说当然如果说有有机会能亲身的去考察去了解一下,那当然是有更好的帮助。",
    "[S2]比如具体一点的,他觉得最大的一个跟他预想的不一样的是在什么地方。",
]

all_audio = fireredtts2.generate_dialogue(
    text_list=text_list,
    prompt_wav_list=prompt_wav_list,
    prompt_text_list=prompt_text_list,
    temperature=0.9,
    topk=30,
)
torchaudio.save("chat_clone.wav", all_audio, 24000)
uv run sample_dialogue.py

生成されたもの

https://audio.com/kun432/audio/fireredtts-2-sample-dialogue

次に、対話ではなく、1人の音声の発話。ランダム音声と音声クローンの2パターンで生成してある。

sample_monologue.py
import os
import sys
import torch
import torchaudio
from fireredtts2.fireredtts2 import FireRedTTS2

device = "cuda"
text = (
   "皆様、新しくリリースされたFireRedTTS2へようこそ。英語、中国語、日本語、"
   "韓国語、フランス語、ドイツ語、ロシア語を含む複数言語に対応しています。"
   "さらに、このTTSモデルは長文文脈の対話生成機能を備えています。"
)

fireredtts2 = FireRedTTS2(
    pretrained_dir="./pretrained_models/FireRedTTS2",
    gen_type="monologue",
    device=device,
)

# ランダムな音声
audio = fireredtts2.generate_monologue(
    text=text,
    temperature=0.8,
    topk=30
)
torchaudio.save("monologue_random.wav", audio.cpu(), 24000)

# 音声クローン
audio = fireredtts2.generate_monologue(
    text=text,
    prompt_wav="examples/chat_prompt/zh/S2.flac",
    prompt_text="比如具体一点的,他觉得最大的一个跟他预想的不一样的是在什么地方。",
)
torchaudio.save("monologue_clone.wav", audio.cpu(), 24000)
uv run sample_monologue.py

生成されたもの。前者は悪くない感じで生成されている。

ランダム
https://audio.com/kun432/audio/fireredtts-2-sample-monologue-1

音声クローン
https://audio.com/kun432/audio/fireredtts-2-sample-monologue-2

kun432kun432

一応上記のそれぞれの生成時間をtime.perf_counter()で計測したもの。

  • ランダム: 17.39237472228706
  • クローン: 16.930940056219697

READMEにあるような高速性については、現状、ストリーミング用のインタフェースがどうやら存在しないようなので、確認できない。

というか一応コードはあるけど、コメントアウトされている?

https://github.com/FireRedTeam/FireRedTTS2/blob/663d7df822a6947d988fbd756e6de6668ca3ffbf/fireredtts2/fireredtts2.py#L260

kun432kun432

まとめ

想像していたよりは良かった。ただどうも特定の音声での精度が特に高いような感がある。音声クローンの場合は日本語できちんと音声プロンプトを用意してあげれば精度上がるんではなかろうか?(未確認)

ただ、読み間違いとかは、それなりにあって、修正するようなインタフェースも存在しないので、ロードマップにあるように、多言語向けのベースモデルとファインチューニング用のコードの提供に期待したいところ。

ロードマップ

  • 2025/09
    • 事前学習済みチェックポイントと推論コードをリリース。
    • Web UIツールを追加。
  • 2025/10
    • 多言語対応を強化したベースモデルをリリース。
    • 特定の対話/多言語データ向けのファインチューニング用コード & チュートリアルを提供。
    • エンドツーエンドのText-to-Blogパイプライン。

他のプロジェクト含めて、音声周りでリアルタイムなものを目指しているように思えるので、今後も期待したい。

このスクラップは2日前にクローズされました