VRAM 4GBのRTX 3050 Ti LaptopでIrodori-TTSの日本語ボイスクローンを試した
目次
Irodori-TTSとは
Irodori-TTSは、Flow MatchingベースのオープンなTTSモデル。
Flow Matchingは拡散モデルの親戚で、ノイズを少しずつ除去していく代わりに、ノイズからデータへまっすぐ向かう経路を学習する。その分少ないステップ数で生成が終わる。
アーキテクチャと学習設計はEcho-TTSを踏襲していて、DACVAEの連続潜在表現を生成ターゲットにしている。
| 項目 | 内容 |
|---|---|
| ベースモデル | Aratako/Irodori-TTS-500M-v3(約1.8GB) |
| アーキテクチャ | Rectified Flow Diffusion Transformer(RF-DiT) |
| コーデック | Semantic-DACVAE-Japanese-32dim、48kHz出力 |
| ボイスクローン | 参照音声からのゼロショット対応 |
| 長さ推定 | v3は長さ予測器内蔵。--seconds 指定不要 |
| 絵文字スタイル制御 | 入力テキスト中の絵文字で感情・非言語表現を制御(対応チェックポイント) |
| 透かし | SilentCipherによる自動ウォーターマーク |
| VoiceDesign版 | Aratako/Irodori-TTS-600M-v3-VoiceDesign。テキストで声質指定できる |
| ライセンス | コードはMIT |
生成音声には音声透かし(人間には聞こえない識別信号)が自動で埋め込まれる。悪用対策が最初から入っているのはこの手のモデルとして良い設計だと思う。
実行環境
| 項目 | 内容 |
|---|---|
| PC | ASUS ROG Zephyrus G14 (GA401QE) |
| OS | Windows 11 Home |
| CPU | AMD Ryzen 7 5800HS(8コア) |
| GPU | NVIDIA GeForce RTX 3050 Ti Laptop(VRAM 4GB) |
| GPUドライバ | 555.97(CUDA 12.5対応) |
| RAM | 16GB |
| Python | 3.10(uvが自動取得) |
| PyTorch | 2.10.0+cu128 |
PyTorchはCUDA 12.8ビルドだが、ドライバがCUDA 12.x系ならマイナーバージョン互換で動く。
導入
パッケージ管理はuv前提。未導入だったのでインストールから始めた。
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
リポジトリをクローンして、CUDA版の依存関係を入れる。
git clone https://github.com/Aratako/Irodori-TTS.git
cd Irodori-TTS
uv sync --extra cu128
バックエンドは --extra(uvのオプション依存グループ)で切り替える方式で、cu128 のほかに rocm(AMD)、xpu(Intel)、cpu が用意されている。
Pythonは .python-version の指定でuvが3.10を自動取得するので、システムのPythonバージョンは気にしなくていい。
GPUが見えているかを確認しておく。
uv run --no-sync python -c "import torch; print(torch.cuda.is_available())"
# → True (NVIDIA GeForce RTX 3050 Ti Laptop GPU)
モデル本体(約1.8GB)は初回推論時にHugging Faceキャッシュへ自動ダウンロードされる。
デフォルト声で生成
まずはお手本なしのデフォルト声で生成する。
uv run --no-sync python infer.py --hf-checkpoint Aratako/Irodori-TTS-500M-v3 `
--text "こんにちは、これはイロドリTTSのテスト音声です。今日はいい天気ですね。" `
--no-ref --output-wav outputs/test1.wav
生成結果はこれ。同じテキストで2回生成した。
所要時間は次のとおり。
| 実行 | 時間 |
|---|---|
| 初回(モデルDL込み) | 317.7秒 |
| 2回目(プロセス全体) | 19.8秒 |
| 2回目のうち生成パイプラインのみ | 約3.2秒 |
全体20秒のうち大半はプロセス起動とモデルロードで、生成自体は6.4秒の音声に対して約3.2秒、実時間の半分。
Gradio UIやサーバ常駐のようにプロセスを立ち上げたままにすれば、毎回かかるのは生成の約3.2秒だけになる。
ボイスクローン
本命のボイスクローン。お手本として、ZONOS2の記事で生成した「カナ」の音声(4.0秒・44.1kHz)を使った。
uv run --no-sync python infer.py --hf-checkpoint Aratako/Irodori-TTS-500M-v3 `
--text "こんにちは、これはお手本の声をもとにしたボイスクローンのテストです。うまく似ているでしょうか。" `
--ref-wav ref_sample.wav --output-wav outputs/cloned_test.wav
生成結果。
4秒のお手本1本でも、声の高さと質感はお手本に近い。
所要時間はプロセス全体で26.0秒、生成パイプラインのみで約6.2秒(うち参照音声のエンコードが約1.1秒)。
デフォルト声の生成より長いのは、テキストが長めなのと参照エンコードが挟まるため。
ハマりどころ
推論はVRAM 4GBでまったく問題なかった。
一方、LoRA学習はデフォルト設定で約4.2GB必要とされていて、この環境ではぎりぎり足りない。
MP3をそのまま指定するとFFmpegのDLLエラーが出る
お手本のMP3をそのまま --ref-wav に指定すると、torchaudio(torchcodec経由)がFFmpegの共有DLLを要求して失敗する。
FFmpeg本体を入れてもいいが、soundfileでWAVに変換するほうが手っ取り早い。
uv run --no-sync python -c "import soundfile as sf; d, sr = sf.read('ref_sample.mp3', dtype='float32'); sf.write('ref_sample.wav', d, sr)"
声質のテキスト指定は別モデル
「落ち着いた女性の声」のようにテキストで声質を指定するVoiceDesignは、ベースモデルではなく Aratako/Irodori-TTS-600M-v3-VoiceDesign を使う。
--caption "落ち着いた女性の声" のようにキャプションを指定する形式で、v3ではお手本音声とキャプションの併用(声はお手本、感情や話し方はテキストで指定)もできる。
リポジトリの正式名称が「A Flow Matching-based TTS Model with Emoji-driven Style Control」であるとおり、入力テキスト中の絵文字で感情や非言語表現を制御できるのがこのモデルの看板機能。今回は試していない。