メインコンテンツまでスキップ

Qwen3-TTS 統合

Alibaba の Qwen3-TTS をローカルで実行し、高品質な多言語テキスト読み上げを利用します。このガイドでは、Libre WebUI に含まれる OpenAI 互換 TTS サーバーのセットアップ方法を説明します。

概要

Qwen3-TTS は、次の機能を備えた高度なテキスト読み上げシステムです。

  • 英語、中国語、日本語、韓国語をカバーする 9 種類の組み込み音声
  • ドイツ語、フランス語、スペイン語、イタリア語、ポルトガル語、ロシア語を含む 10 言語への対応
  • 3 秒の音声サンプルからの ボイスクローニング
  • 自然言語の説明を使う 音声デザイン
  • 感情と韻律を調整する 指示制御

同梱サーバーは Qwen3-TTS を OpenAI 互換 API でラップしているため、Libre WebUI の標準プラグインシステムから利用できます。

要件

コンポーネント最小推奨
Python3.12+3.12(3.14 は不可)
GPU VRAM4GB(0.6B モデル)8GB+(1.7B モデル)
RAM8GB16GB+
ディスク5GB10GB

対応プラットフォーム

プラットフォームバックエンド備考
NVIDIA GPUCUDA最高のパフォーマンス、bfloat16 対応
Apple SiliconMPSメモリ効率を重視する場合は 0.6B モデルを使用
CPUPyTorch低速。0.6B モデルを使用
Apple Silicon ユーザー

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.5GBVRAM が限られる環境向けの軽量バリアント
voicedesign-1.7b~3.5GBテキストの説明から音声を作成
base-1.7b~3.5GB3 秒のサンプルからボイスクローニング
base-0.6b~1.5GB軽量なボイスクローニング

音声

組み込み音声(CustomVoice モデル)

音声言語説明
Ryan英語男性、明瞭で自然
Aiden英語男性、温かみのある声
Vivian中国語女性、プロフェッショナル
Serena中国語女性、親しみやすい
Uncle_Fu中国語男性、落ち着いた大人の声
Dylan中国語男性、北京方言
Eric中国語男性、四川方言
Ono_Anna日本語女性
Sohee韓国語女性

OpenAI 音声エイリアス

OpenAI TTS クライアントとの互換性のため、サーバーは OpenAI の音声名を次のように割り当てます。

OpenAI の音声割り当て先
alloyRyan
echoAiden
fableVivian
onyxUncle_Fu
novaSerena
shimmerOno_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"
}
パラメーター既定値説明
modelstringqwen3-ttsモデル識別子
inputstringrequired合成するテキスト(最大 10,000 文字)
voicestringryan音声名(上の表を参照)
response_formatstringwav音声形式(対応は wav のみ)
instructstring""感情/韻律の指示
languagestringauto-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
パラメーター説明
inputstring合成するテキスト
reference_audiofile3 秒以上の音声サンプル
reference_textstring参照音声の文字起こし
注記

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]
オプション既定値説明
--host0.0.0.0バインドするホスト
--port8100バインドするポート
--modelcustomvoice-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_ など)を除去
  • 繰り返し文字を短縮(FUUUUUFUU
  • ト書き(*(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
  1. GPU を使うほかのアプリケーションを終了します。
  2. 0.6B モデルのバリアントを使用します。
  3. server.py のチャンクサイズを小さくします(max_chunk_size=300)。

サーバーがタイムアウトする

長いテキストの生成がタイムアウトする場合:

  1. サーバーはテキストを自動的に分割し、残りのチャンクを続行します。
  2. どのチャンクがタイムアウトしたか、サーバーログで確認します。
  3. 入力テキストを短くすることを検討します。

音声が不自然

  • 音節が繰り返される: 通常は絵文字や特殊文字が原因です。サニタイザーで自動的に処理されるはずです。
  • 言語が違う: リクエストで 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"
}

リソース