Qwen3-TTS 統合
Alibaba の Qwen3-TTS をローカルで実行し、高品質な多言語テキスト読み上げを利用します。このガイドでは、Libre WebUI に含まれる OpenAI 互換 TTS サーバーのセットアップ方法を説明します。
概要
Qwen3-TTS は、次の機能を備えた高度なテキスト読み上げシステムです。
- 英語、中国語、日本語、韓国語をカバーする 9 種類の組み込み音声
- ドイツ語、フランス語、スペイン語、イタリア語、ポルトガル語、ロシア語を含む 10 言語への対応
- 3 秒の音声サンプルからの ボイスクローニング
- 自然言語の説明を使う 音声デザイン
- 感情と韻律を調整する 指示制御
同梱サーバーは Qwen3-TTS を OpenAI 互換 API でラップしているため、Libre WebUI の標準プラグインシステムから利用できます。
要件
| コンポーネント | 最小 | 推奨 |
|---|---|---|
| Python | 3.12+ | 3.12(3.14 は不可) |
| GPU VRAM | 4GB(0.6B モデル) | 8GB+(1.7B モデル) |
| RAM | 8GB | 16GB+ |
| ディスク | 5GB | 10GB |
対応プラットフォーム
| プラットフォーム | バックエンド | 備考 |
|---|---|---|
| NVIDIA GPU | CUDA | 最高のパフォーマンス、bfloat16 対応 |
| Apple Silicon | MPS | メモリ効率を重視する場合は 0.6B モデルを使用 |
| CPU | PyTorch | 低速。0.6B モデルを使用 |
Mac では、メモリ不足を避けるため customvoice-0.6b モデルのバリアントを使用してください。ユニファイドメモリが 16GB のマシンでは、1.7B モデルによってシステムが不安定になる可能性があります。
クイックスタート
1. サーバーをインストールする
cd examples/qwen-tts-server
# Create virtual environment (Python 3.12 required)
python3.12 -m venv venv
source venv/bin/activate # Linux/macOS
# or: venv\Scripts\activate # Windows
# Install dependencies
pip install -r requirements.txt
2. サーバーを起動する
# NVIDIA GPU (recommended)
python server.py --model customvoice-1.7b
# Apple Silicon
python server.py --model customvoice-0.6b
# CPU (slower)
python server.py --model customvoice-0.6b
サーバーは既定で http://localhost:8100 で動作します。
3. Libre WebUI を設定する
プラグインは plugins/qwen-tts.json にあらかじめ設定されています。設定 → プラグイン → Qwen3 TTS で有効にしてください。
4. 動作を確認する
curl http://localhost:8100/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"model": "qwen3-tts", "input": "Hello, welcome to Libre WebUI!", "voice": "Ryan"}' \
--output speech.wav
利用可能なモデル
| モデル | サイズ | 用途 |
|---|---|---|
customvoice-1.7b | ~3.5GB | 指示制御に対応した組み込み音声 |
customvoice-0.6b | ~1.5GB | VRAM が限られる環境向けの軽量バリアント |
voicedesign-1.7b | ~3.5GB | テキストの説明から音声を作成 |
base-1.7b | ~3.5GB | 3 秒のサンプルからボイスクローニング |
base-0.6b | ~1.5GB | 軽量なボイスクローニング |
音声
組み込み音声(CustomVoice モデル)
| 音声 | 言語 | 説明 |
|---|---|---|
| Ryan | 英語 | 男性、明瞭で自然 |
| Aiden | 英語 | 男性、温かみのある声 |
| Vivian | 中国語 | 女性、プロフェッショナル |
| Serena | 中国語 | 女性、親しみやすい |
| Uncle_Fu | 中国語 | 男性、落ち着いた大人の声 |
| Dylan | 中国語 | 男性、北京方言 |
| Eric | 中国語 | 男性、四川方言 |
| Ono_Anna | 日本語 | 女性 |
| Sohee | 韓国語 | 女性 |
OpenAI 音声エイリアス
OpenAI TTS クライアントとの互換性のため、サーバーは OpenAI の音声名を次のように割り当てます。
| OpenAI の音声 | 割り当て先 |
|---|---|
alloy | Ryan |
echo | Aiden |
fable | Vivian |
onyx | Uncle_Fu |
nova | Serena |
shimmer | Ono_Anna |
API リファレンス
音声の生成
エンドポイント: POST /v1/audio/speech
{
"model": "qwen3-tts",
"input": "Text to convert to speech",
"voice": "Ryan",
"response_format": "wav",
"instruct": "Speak with enthusiasm",
"language": "English"
}
| パラメーター | 型 | 既定値 | 説明 |
|---|---|---|---|
model | string | qwen3-tts | モデル識別子 |
input | string | required | 合成するテキスト(最大 10,000 文字) |
voice | string | ryan | 音声名(上の表を参照) |
response_format | string | wav | 音声形式(対応は wav のみ) |
instruct | string | "" | 感情/韻律の指示 |
language | string | auto-detect | 言語検出を上書き |
レスポンス: 音声ファイル(audio/wav)
音声デザイン
エンドポイント: POST /v1/audio/voice-design
自然言語の説明からカスタム音声を作成します。
{
"model": "qwen3-tts-voicedesign",
"input": "Welcome to our service.",
"voice_description": "A warm, friendly female voice with a slight British accent",
"language": "English"
}
voicedesign-1.7b モデルを読み込む必要があります。
ボイスクローニング
エンドポイント: POST /v1/audio/voice-clone
3 秒以上の音声サンプルから声を複製します。
curl -X POST http://localhost:8100/v1/audio/voice-clone \
-F "input=Hello, this is my cloned voice." \
-F "reference_audio=@reference.wav" \
-F "reference_text=This is what was said in the reference." \
--output cloned.wav
| パラメーター | 型 | 説明 |
|---|---|---|
input | string | 合成するテキスト |
reference_audio | file | 3 秒以上の音声サンプル |
reference_text | string | 参照音声の文字起こし |
base-1.7b または base-0.6b モデルを読み込む必要があります。
音声一覧
エンドポイント: GET /v1/voices
{
"voices": [
{"id": "ryan", "name": "Ryan", "language": "English"},
{"id": "aiden", "name": "Aiden", "language": "English"},
...
]
}
ヘルスチェック
エンドポイント: GET /health
{ "status": "healthy", "model_loaded": true }
サーバー設定
python server.py [OPTIONS]
| オプション | 既定値 | 説明 |
|---|---|---|
--host | 0.0.0.0 | バインドするホスト |
--port | 8100 | バインドするポート |
--model | customvoice-1.7b | 読み込むモデルバリアント |
ネットワークアクセス
ネットワーク上のほかのマシンからサーバーへアクセスするには、次のようにします。
# Start server on all interfaces
python server.py --host 0.0.0.0 --port 8100
# Access from another machine
curl http://192.168.1.100:8100/v1/audio/speech ...
plugins/qwen-tts.json のプラグインエンドポイントを更新します。
{
"endpoint": "http://192.168.1.100:8100/v1/audio/speech",
"capabilities": {
"tts": {
"endpoint": "http://192.168.1.100:8100/v1/audio/speech"
}
}
}
本番運用向け機能
テキストのサニタイズ
モデルの停止を防ぐため、サーバーは入力テキストを自動的にサニタイズします。
- 絵文字と記号を削除
- Markdown の書式(
*bold*、_italic_など)を除去 - 繰り返し文字を短縮(
FUUUUU→FUU) - ト書き(
*(action)*、(whispers))を削除 - 空白を正規化
テキストの分割
長いテキストは文の境界で自動的に分割されます。
- 1 チャンクあたり最大 500 文字
- 1 チャンクあたり 30 秒のタイムアウト
- 失敗したチャンクはスキップし、残りを続行
- チャンクを 1 つの音声レスポンスに連結
これにより、自然な音声の流れを保ちながら、長い AI 応答でのタイムアウトを防ぎます。
マルチ GPU 構成
複数の GPU を搭載するシステムでは、tensor device の不一致を避けるため、サーバーは単一 GPU での実行を強制します。
device_map = {"": "cuda:0"} # Uses first GPU only
特定の GPU を使用するには、次のようにします。
CUDA_VISIBLE_DEVICES=1 python server.py --model customvoice-1.7b
トラブルシューティング
モデルのダウンロードに失敗する
モデルは初回起動時に Hugging Face からダウンロードされます。失敗する場合は、次を試してください。
# Set Hugging Face token for gated models
export HF_TOKEN=hf_...
# Or download manually
huggingface-cli download Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice
メモリ不足(Apple Silicon)
RuntimeError: MPS backend out of memory
小さいモデルバリアントを使用します。
python server.py --model customvoice-0.6b
CUDA のメモリ不足
torch.cuda.OutOfMemoryError: CUDA out of memory
- GPU を使うほかのアプリケーションを終了します。
- 0.6B モデルのバリアントを使用します。
- server.py のチャンクサイズを小さくします(
max_chunk_size=300)。
サーバーがタイムアウトする
長いテキストの生成がタイムアウトする場合:
- サーバーはテキストを自動的に分割し、残りのチャンクを続行します。
- どのチャンクがタイムアウトしたか、サーバーログで確認します。
- 入力テキストを短くすることを検討します。
音声が不自然
- 音節が繰り返される: 通常は絵文字や特殊文字が原因です。サニタイザーで自動的に処理されるはずです。
- 言語が違う: リクエストで
languageパラメーターを明示的に設定します。 - 間が不自然: テキストが不適切な境界で分割されている可能性があります。通常と異なる句読点がないか確認してください。
プラグイン設定
同梱プラグイン(plugins/qwen-tts.json):
{
"id": "qwen-tts",
"name": "Qwen3 TTS",
"type": "tts",
"endpoint": "http://localhost:8100/v1/audio/speech",
"auth": {
"header": "",
"key_env": ""
},
"model_map": [
"qwen3-tts",
"qwen3-tts-customvoice",
"qwen3-tts-voicedesign",
"qwen3-tts-clone"
],
"capabilities": {
"tts": {
"endpoint": "http://localhost:8100/v1/audio/speech",
"model_map": [
"qwen3-tts",
"qwen3-tts-customvoice",
"qwen3-tts-voicedesign",
"qwen3-tts-clone"
],
"config": {
"voices": [
"Ryan",
"Aiden",
"Vivian",
"Serena",
"Uncle_Fu",
"Dylan",
"Eric",
"Ono_Anna",
"Sohee"
],
"default_voice": "Ryan",
"formats": ["wav"],
"default_format": "wav",
"max_characters": 10000,
"supports_streaming": false,
"no_auth_required": true
}
}
},
"description": "Qwen3-TTS local TTS server (NVIDIA CUDA, Apple MPS, or CPU)",
"documentation_url": "https://github.com/QwenLM/Qwen3-TTS"
}
リソース
- Qwen3-TTS GitHub - 公式リポジトリ
- Qwen3-TTS デモ - オンラインで試す
- Alibaba Cloud TTS ドキュメント - Cloud API ドキュメント