Integracja Qwen3-TTS
Uruchom Qwen3-TTS firmy Alibaba lokalnie, aby uzyskać wysokiej jakości wielojęzyczną zamianę tekstu na mowę. Ten przewodnik opisuje konfigurację serwera TTS zgodnego z OpenAI, dołączonego do Libre WebUI.
Omówienie
Qwen3-TTS to zaawansowany system zamiany tekstu na mowę oferujący:
- 9 gotowych głosów w języku angielskim, chińskim, japońskim i koreańskim
- Obsługę 10 języków, w tym niemieckiego, francuskiego, hiszpańskiego, włoskiego, portugalskiego i rosyjskiego
- Klonowanie głosu z 3-sekundowych próbek audio
- Projektowanie głosu za pomocą opisów w języku naturalnym
- Sterowanie instrukcjami dla emocji i prozodii
Dołączony serwer udostępnia Qwen3-TTS przez API zgodne z OpenAI, dzięki czemu Libre WebUI może używać go przez standardowy system wtyczek.
Wymagania
| Komponent | Minimum | Zalecane |
|---|---|---|
| Python | 3.12+ | 3.12 (nie 3.14) |
| GPU VRAM | 4GB (modele 0.6B) | 8GB+ (modele 1.7B) |
| RAM | 8GB | 16GB+ |
| Dysk | 5GB | 10GB |
Obsługa platform
| Platforma | Backend | Uwagi |
|---|---|---|
| GPU NVIDIA | CUDA | Najlepsza wydajność, obsługa bfloat16 |
| Apple Silicon | MPS | Używaj modeli 0.6B dla oszczędności pamięci |
| CPU | PyTorch | Wolniej; używaj modeli 0.6B |
Na komputerach Mac używaj wariantu customvoice-0.6b, aby ograniczyć presję na pamięć. Modele 1.7B mogą destabilizować systemy z 16GB pamięci zunifikowanej.
Szybki start
1. Instalowanie serwera
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. Uruchamianie serwera
# 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
Serwer domyślnie działa pod adresem http://localhost:8100.
3. Konfigurowanie Libre WebUI
Wtyczka jest wstępnie skonfigurowana w plugins/qwen-tts.json. Włącz ją w Settings → Plugins → Qwen3 TTS.
4. Testowanie
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
Dostępne modele
| Model | Rozmiar | Zastosowanie |
|---|---|---|
customvoice-1.7b | ~3.5GB | Gotowe głosy ze sterowaniem instrukcjami |
customvoice-0.6b | ~1.5GB | Lekki wariant dla ograniczonego VRAM |
voicedesign-1.7b | ~3.5GB | Tworzenie głosów z opisów tekstowych |
base-1.7b | ~3.5GB | Klonowanie głosu z 3-sekundowych próbek |
base-0.6b | ~1.5GB | Lekkie klonowanie głosu |
Głosy
Gotowe głosy (modele CustomVoice)
| Głos | Język | Opis |
|---|---|---|
| Ryan | Angielski | Męski, wyraźny i naturalny |
| Aiden | Angielski | Męski, ciepły ton |
| Vivian | Chiński | Żeński, profesjonalny |
| Serena | Chiński | Żeński, przyjazny |
| Uncle_Fu | Chiński | Męski, dojrzały |
| Dylan | Chiński | Męski, dialekt pekiński |
| Eric | Chiński | Męski, dialekt syczuański |
| Ono_Anna | Japoński | Żeński |
| Sohee | Koreański | Żeński |
Aliasy głosów OpenAI
Dla zgodności z klientami OpenAI TTS serwer mapuje nazwy głosów OpenAI:
| Głos OpenAI | Mapowanie |
|---|---|
alloy | Ryan |
echo | Aiden |
fable | Vivian |
onyx | Uncle_Fu |
nova | Serena |
shimmer | Ono_Anna |
Dokumentacja API
Generowanie mowy
Punkt końcowy: POST /v1/audio/speech
{
"model": "qwen3-tts",
"input": "Text to convert to speech",
"voice": "Ryan",
"response_format": "wav",
"instruct": "Speak with enthusiasm",
"language": "English"
}
| Parametr | Typ | Domyślnie | Opis |
|---|---|---|---|
model | string | qwen3-tts | Identyfikator modelu |
input | string | wymagany | Tekst do syntezy (maks. 10 000 znaków) |
voice | string | ryan | Nazwa głosu (zobacz tabelę wyżej) |
response_format | string | wav | Format audio (obsługiwany tylko wav) |
instruct | string | "" | Instrukcja emocji/prozodii |
language | string | wykrywanie automatyczne | Nadpisanie wykrywania języka |
Odpowiedź: plik audio (audio/wav)
Projektowanie głosu
Punkt końcowy: POST /v1/audio/voice-design
Tworzy niestandardowe głosy z opisów w języku naturalnym.
{
"model": "qwen3-tts-voicedesign",
"input": "Welcome to our service.",
"voice_description": "A warm, friendly female voice with a slight British accent",
"language": "English"
}
Wymaga załadowania modelu voicedesign-1.7b.
Klonowanie głosu
Punkt końcowy: POST /v1/audio/voice-clone
Klonuje głos z próbki audio o długości co najmniej 3 sekund.
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
| Parametr | Typ | Opis |
|---|---|---|
input | string | Tekst do syntezy |
reference_audio | file | Próbka audio co najmniej 3-sekundowa |
reference_text | string | Transkrypcja audio referencyjnego |
Wymaga załadowania modelu base-1.7b lub base-0.6b.
Lista głosów
Punkt końcowy: GET /v1/voices
{
"voices": [
{"id": "ryan", "name": "Ryan", "language": "English"},
{"id": "aiden", "name": "Aiden", "language": "English"},
...
]
}
Kontrola stanu
Punkt końcowy: GET /health
{ "status": "healthy", "model_loaded": true }
Konfiguracja serwera
python server.py [OPTIONS]
| Opcja | Domyślnie | Opis |
|---|---|---|
--host | 0.0.0.0 | Host do powiązania |
--port | 8100 | Port do powiązania |
--model | customvoice-1.7b | Wariant modelu do załadowania |
Dostęp sieciowy
Aby korzystać z serwera z innych komputerów w sieci:
# 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 ...
Zaktualizuj punkt końcowy wtyczki w 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"
}
}
}
Funkcje produkcyjne
Oczyszczanie tekstu
Serwer automatycznie oczyszcza tekst wejściowy, aby zapobiegać zawieszaniu modelu:
- Usuwa emoji i symbole
- Usuwa formatowanie Markdown (
*bold*,_italic_itp.) - Skraca powtarzane znaki (
FUUUUU→FUU) - Usuwa didaskalia (
*(action)*,(whispers)) - Normalizuje białe znaki
Dzielenie tekstu
Długi tekst jest automatycznie dzielony na granicach zdań:
- Maksymalnie 500 znaków na fragment
- Limit 30 sekund na fragment
- Nieudane fragmenty są pomijane, a pozostałe są kontynuowane
- Fragmenty są łączone w jedną odpowiedź audio
Zapobiega to przekraczaniu limitu czasu przy długich odpowiedziach AI, zachowując naturalny przepływ mowy.
Konfiguracja wielu GPU
W systemach z wieloma GPU serwer wymusza wykonanie na jednym GPU, aby uniknąć niezgodności urządzeń tensorów:
device_map = {"": "cuda:0"} # Uses first GPU only
Aby użyć konkretnego GPU:
CUDA_VISIBLE_DEVICES=1 python server.py --model customvoice-1.7b
Rozwiązywanie problemów
Nieudane pobieranie modelu
Przy pierwszym uruchomieniu model jest pobierany z Hugging Face. Jeśli pobieranie się nie powiedzie:
# Set Hugging Face token for gated models
export HF_TOKEN=hf_...
# Or download manually
huggingface-cli download Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice
Brak pamięci (Apple Silicon)
RuntimeError: MPS backend out of memory
Użyj mniejszego wariantu modelu:
python server.py --model customvoice-0.6b
Brak pamięci CUDA
torch.cuda.OutOfMemoryError: CUDA out of memory
- Zamknij inne aplikacje używające GPU
- Użyj wariantu 0.6B
- Zmniejsz rozmiar fragmentu w server.py (
max_chunk_size=300)
Serwer przekracza limit czasu
Jeśli generowanie długiego tekstu przekracza limit czasu:
- Serwer automatycznie dzieli tekst i kontynuuje pozostałe fragmenty
- Sprawdź w logach, które fragmenty przekroczyły limit
- Rozważ skrócenie tekstu wejściowego
Dźwięk brzmi nieprawidłowo
- Powtarzane sylaby: zwykle powodują je emoji lub znaki specjalne. Oczyszczanie powinno obsłużyć je automatycznie.
- Niewłaściwy język: jawnie ustaw parametr
languagew żądaniu. - Nienaturalne pauzy: tekst może być dzielony w niewłaściwych miejscach. Sprawdź nietypową interpunkcję.
Konfiguracja wtyczki
Dołączona wtyczka (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"
}
Zasoby
- Qwen3-TTS GitHub - Oficjalne repozytorium
- Demo Qwen3-TTS - Wypróbuj online
- Dokumentacja Alibaba Cloud TTS - Dokumentacja API chmurowego