Llasa TTSモデルのシンプルな高速推論サーバーです。vLLM、SGLang、またはTransformersを推論バックエンドとして選択できます。
Llasaは、LLaMAアーキテクチャをベースにしたText-to-Speech (TTS) モデルです。テキストを入力として受け取り、対応するspeech tokenを出力します。これらのspeech tokenは、XCodec2によって音声波形に変換されます。
- 2025-10-25: キャプション対応モデル(Anime-Llasa-3B-Captions)のサポート追加、
system_promptパラメータ対応、メタデータ対応UI(gradio_ui_captions.py)追加 - 2025-10-17: 44.1kHz出力対応、XCodec2-44.1kHzモデルのサポート追加、
--output-sample-rateオプション追加 - 2024-10-09: SGLang / Transformersバックエンドのサポートを追加、不具合修正など
テキスト入力
↓
[テキスト正規化]
↓
[vLLM/SGLang/Transformers + Llasa] → Speech token生成
↓
[XCodec2] → 音声波形デコード
↓
WAV音声出力(16kHz または 44.1kHz)
- 柔軟なバックエンド: vLLM、SGLang、またはTransformersを推論エンジンとして選択可能
- 高速推論: vLLM/SGLangによる最適化されたLLM推論
- 音声クローニング: リファレンス音声による声質制御のサポート
- メタデータ制御: キャプション対応モデル(Anime-Llasa-3B-Captions)では、システムプロンプトで音声の特徴(感情、声質、スタイルなど)を細かく制御可能
- RESTful API: FastAPIベースの使いやすいAPI
- Web UI: Gradio製のブラウザインターフェースを利用可能(通常版とメタデータ対応版の2種類)
- 柔軟な設定: GPU設定、モデルパラメータの細かい調整が可能
WSL2のUbuntu 24.04、Python 3.12、CUDA 12.9の環境で動作確認済みです。
# XCodec2のインストール(44.1kHz対応版、16kHzモデルとの後方互換性あり)
uv pip install https://huggingface.co/NandemoGHS/Anime-XCodec2-44.1kHz/resolve/main/xcodec2-0.1.6.tar.gz
# 推論バックエンドのインストール(いずれか1つ以上を選択)
# vLLMを使用する場合
uv pip install vllm==0.10.2 --torch-backend=auto
uv pip install -r requirements.txt
# SGLangを使用する場合
uv pip install "sglang[all]==0.5.3" --prerelease=allow
uv pip install -r requirements.txt
# transformersを使用する場合
uv pip install -r requirements.txt
# 環境によってはCUDAのバージョンにあったtorchの再インストールが必要かもしれません
# uv pip install -U torch torchaudio --index-url https://download.pytorch.org/whl/cu***
# 開発環境が必要な場合
uv pip install -r requirements-dev.txtpython run_server.pyサーバーは http://localhost:8000 で起動します。
# SGLangバックエンドを使用
python run_server.py --backend sglang
# Transformersバックエンドを使用
python run_server.py --backend transformers
# FP8モデルを使用
python run_server.py --llasa-model-id NandemoGHS/Anime-Llasa-3B-FP8
# キャプション対応モデルを使用
python run_server.py --llasa-model-id NandemoGHS/Anime-Llasa-3B-Captions
# 44.1kHzモデルを使用(output-sample-rateの設定が必須)
python run_server.py --xcodec2-model-id NandemoGHS/Anime-XCodec2-44.1kHz --output-sample-rate 44100
# カスタムポートで起動
python run_server.py --port 9000
# vLLM/SGLangの設定を調整 (マルチGPUなど)
python run_server.py --backend sglang --gpu-memory-utilization 0.9 --tensor-parallel-size 2
# すべてのオプションを確認
python run_server.py --help利用可能な引数:
--backend: 推論バックエンド(選択肢: vllm, sglang, transformers、デフォルト: vllm)--llasa-model-id: Llasaモデル ID(デフォルト: NandemoGHS/Anime-Llasa-3B)--xcodec2-model-id: XCodec2モデル ID(デフォルト: NandemoGHS/Anime-XCodec2)--tensor-parallel-size: vLLM/SGLangのTensor Parallelのサイズ(デフォルト: 1、マルチGPU時に使用)--gpu-memory-utilization: GPU メモリ使用率(デフォルト: 0.8)--max-model-len: コンテキスト長(デフォルト: 2048)--device: 仕様デバイス(デフォルト: cuda)--output-sample-rate: 出力音声のサンプリングレート(Hz)(デフォルト: 16000)- 重要: 44.1kHzモデル(
NandemoGHS/Anime-XCodec2-44.1kHz)を使用する場合は44100を指定する必要があります
- 重要: 44.1kHzモデル(
--host: バインドホスト(デフォルト: 0.0.0.0)--port: バインドポート(デフォルト: 8000)--reload: 自動リロード有効化
上記の推論サーバを使い、ブラウザから簡単に音声生成ができる簡易的なWeb UIも提供しています。
python gradio_ui.pyWeb UIは http://localhost:7860 で起動します。
キャプション対応モデル(NandemoGHS/Anime-Llasa-3B-Captions)を使用する場合は、メタデータ入力に対応した専用UIを使用できます:
python gradio_ui_captions.pyこのUIでは、以下のメタデータを指定して音声の特徴を細かく制御できます:
- caption: 音声の説明(推奨)
- emotion: 感情タグ(angry, sad, happy, seriousなど)
- profile: 話者プロファイル(若い女性声、大人の男性声など)
- mood: ムード(恥ずかしさ、悲しみなど)
- speed: 話速(ゆっくり、速いなど)
- prosody: 抑揚・リズム(震え声、平坦など)
- pitch_timbre: ピッチ・声質(高め、低め、息多めなど)
- style: スタイル(ナレーション風、会話調など)
- notes: 特記事項(距離感、吐息など)
プリセット例も用意されており、簡単に試すことができます。
# 推論サーバーのURLを指定
python gradio_ui.py --server-url http://192.168.1.100:8000
# カスタムポートでWeb UIを起動
python gradio_ui.py --port 8080
# 公開リンクを生成(外部アクセス可能)
python gradio_ui.py --share
# 環境変数で推論サーバーのURLを設定
LLASA_SERVER_URL=http://192.168.1.100:8000 python gradio_ui.py利用可能な引数:
--server-url: APIサーバーのURL(デフォルト: http://localhost:8000、 環境変数LLASA_SERVER_URLでも設定可能)--host: Web UIのホスト(デフォルト: 0.0.0.0)--port: Web UIのポート(デフォルト: 7860)--share: Gradio公開リンクを生成
テキストから音声を生成します。
パラメータ:
text(必須): 生成するテキストreference_audio(オプション): リファレンス音声ファイル(WAV形式推奨)reference_text(オプション): リファレンス音声のテキストsystem_prompt(オプション): システムプロンプト(キャプション対応モデル用。メタデータを含む)temperature(デフォルト: 0.8): Llasaのtemperaturetop_p(デフォルト: 1.0): Llasaのtop-prepetition_penalty(デフォルト: 1.1): Llasaのrepetition penaltymax_tokens(デフォルト: 2048): 生成する最大トークン数
レスポンス: WAV形式の音声データ(wav、デフォルト16kHz、モノラル)
- サンプリングレートは
--output-sample-rateオプションで変更可能
import requests
url = "http://localhost:8000/tts"
data = {
"text": "こんにちは、これはテスト音声です。",
}
response = requests.post(url, data=data)
with open("output.wav", "wb") as f:
f.write(response.content)import requests
url = "http://localhost:8000/tts"
data = {
"text": "これは生成したい新しいテキストです。",
"reference_text": "これはリファレンス音声のテキストです。",
}
files = {
"reference_audio": open("reference.wav", "rb"),
}
response = requests.post(url, data=data, files=files)
with open("output.wav", "wb") as f:
f.write(response.content)import requests
url = "http://localhost:8000/tts"
# システムプロンプトを構築
system_prompt = """emotion: serious
profile: 落ち着いた女性声
mood: シリアス、深刻
speed: 一定
prosody: メリハリがある、断定的
pitch_timbre: 中低音、張りのある声
style: ナレーション風
notes:
caption: 落ち着いた中低音の女性声。シリアスな雰囲気で、張りのある声で断定的に話す。ナレーションのようなスタイル。"""
data = {
"text": "今思えば、あの時すでに運命の歯車は狂っていたのだろう",
"system_prompt": system_prompt,
}
response = requests.post(url, data=data)
with open("output.wav", "wb") as f:
f.write(response.content)あるいは、utils.pyのbuild_system_prompt()関数を使用してより簡単に構築できます:
import requests
from llasa_server.utils import build_system_prompt
url = "http://localhost:8000/tts"
# メタデータからシステムプロンプトを構築
system_prompt = build_system_prompt(
caption="落ち着いた中低音の女性声。シリアスな雰囲気で、張りのある声で断定的に話す。ナレーションのようなスタイル。",
emotion="serious",
profile="落ち着いた女性声",
mood="シリアス、深刻",
speed="一定",
prosody="メリハリがある、断定的",
pitch_timbre="中低音、張りのある声",
style="ナレーション風",
)
data = {
"text": "今思えば、あの時すでに運命の歯車は狂っていたのだろう",
"system_prompt": system_prompt,
}
response = requests.post(url, data=data)
with open("output.wav", "wb") as f:
f.write(response.content)# シンプルなTTS
curl -X POST "http://localhost:8000/tts" \
-F "text=こんにちは、これはテスト音声です。" \
-o output.wav
# リファレンス音声付き
curl -X POST "http://localhost:8000/tts" \
-F "text=これは生成したい新しいテキストです。" \
-F "reference_text=これはリファレンス音声のテキストです。" \
-F "[email protected];type=audio/wav" \
-o output.wav-
APIサーバーを起動:
python run_server.py
-
別のターミナルでWeb UIを起動:
python gradio_ui.py
-
ブラウザで
http://localhost:7860にアクセス -
UIで以下を設定:
- APIサーバーURL: 必要に応じて変更(デフォルト: http://localhost:8000)
- リファレンス音声: オプションで音声ファイルをアップロード
- リファレンステキスト: リファレンス音声を使用する場合は必須
- 生成するテキスト: 生成したいテキストを入力
- パラメータ: Temperature、Top-p、Repetition Penaltyを調整
-
「音声を生成」ボタンをクリック
-
キャプション対応モデルでAPIサーバーを起動:
python run_server.py --llasa-model-id NandemoGHS/Anime-Llasa-3B-Captions
-
別のターミナルでメタデータ対応UIを起動:
python gradio_ui_captions.py
-
ブラウザで
http://localhost:7860にアクセス -
UIで以下を設定:
- APIサーバーURL: 必要に応じて変更(デフォルト: http://localhost:8000)
- リファレンス音声: オプションで音声ファイルをアップロード
- リファレンステキスト: リファレンス音声を使用する場合は必須
- 生成するテキスト: 生成したいテキストを入力
- メタデータ: caption(推奨)および他のメタデータフィールドを入力
- captionは短い日本語で音声の特徴を記述(例:「落ち着いた女性声、シリアスな雰囲気」)
- その他のフィールドはオプション(emotion, profile, mood, speed, prosody, pitch_timbre, style, notes)
- パラメータ: Temperature、Top-p、Repetition Penaltyを調整
-
「音声を生成」ボタンをクリック
Examplesタブでプリセット例を選択して、すぐに試すこともできます。
curl http://localhost:8000/health- vLLM / SGLang / Transformers: Llasa LLMモデル(NandemoGHS/Anime-Llasa-3B)の推論
- XCodec2: Speech tokenから音声波形への変換(NandemoGHS/Anime-XCodec2)
- FastAPI: REST APIサーバー
- Gradio: Web UIフロントエンド
llasa-server/
├── llasa_server/
│ ├── __init__.py
│ ├── api.py # FastAPI エンドポイント
│ ├── codec.py # XCodec2 ラッパー
│ ├── config.py # サーバー設定管理
│ ├── engine_vllm.py # vLLM エンジン
│ ├── engine_base.py # エンジン抽象基底クラス
│ ├── engine_sglang.py # SGLang エンジン
│ ├── engine_transformers.py # Transformers エンジン
│ ├── server.py # メインサーバークラス
│ └── utils.py # ユーティリティ類(メタデータ構築関数含む)
├── run_server.py # APIサーバー起動スクリプト
├── gradio_ui.py # Gradio Web UI(通常版)
├── gradio_ui_captions.py # Gradio Web UI(メタデータ対応版)
├── example_client.py # 推論のサンプルスクリプト
├── requirements.txt # 必要ライブラリ
├── requirements-dev.txt # 開発用ライブラリ
└── README.md # このドキュメント
このリポジトリのコードはMITライセンスの下で提供されています。
利用しているモデルのライセンスについては、各モデルの提供元を確認してください。デフォルトで使われているAnime-Llasa-3BおよびAnime-XCodec2はCC BY-NC 4.0ライセンスです。