Qwen3-TTS-integratie
Voer Qwen3-TTS van Alibaba lokaal uit voor hoogwaardige, meertalige tekst-naar-spraak. Deze handleiding behandelt het instellen van de OpenAI-compatibele TTS-server die met Libre WebUI wordt meegeleverd.
Overzicht
Qwen3-TTS is een geavanceerd tekst-naar-spraaksysteem met:
- 9 vooraf gebouwde stemmen in het Engels, Chinees, Japans en Koreaans
- Ondersteuning voor 10 talen, waaronder Duits, Frans, Spaans, Italiaans, Portugees en Russisch
- Stemklonen op basis van audiofragmenten van 3 seconden
- Stemontwerp met beschrijvingen in natuurlijke taal
- Instructiegestuurde emotie en prosodie
De meegeleverde server verpakt Qwen3-TTS in een OpenAI-compatibele API, zodat Libre WebUI hem via het standaardplug-insysteem kan gebruiken.
Vereisten
| Onderdeel | Minimum | Aanbevolen |
|---|---|---|
| Python | 3.12+ | 3.12 (niet 3.14) |
| GPU-VRAM | 4GB (0.6B-modellen) | 8GB+ (1.7B-modellen) |
| RAM | 8GB | 16GB+ |
| Schijfruimte | 5GB | 10GB |
Platformondersteuning
| Platform | Backend | Opmerkingen |
|---|---|---|
| NVIDIA GPU | CUDA | Beste prestaties, ondersteuning voor bfloat16 |
| Apple Silicon | MPS | Gebruik 0.6B-modellen voor geheugenefficiëntie |
| CPU | PyTorch | Langzamer; gebruik 0.6B-modellen |
Gebruik op een Mac de modelvariant customvoice-0.6b om geheugendruk te voorkomen. De 1.7B-modellen kunnen op computers met 16GB uniform geheugen instabiliteit veroorzaken.
Snel aan de slag
1. De server installeren
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. De server starten
# 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
De server draait standaard op http://localhost:8100.
3. Libre WebUI configureren
De plug-in is vooraf geconfigureerd in plugins/qwen-tts.json. Schakel hem in via Settings → Plugins → Qwen3 TTS.
4. Testen
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
Beschikbare modellen
| Model | Grootte | Toepassing |
|---|---|---|
customvoice-1.7b | ~3.5GB | Vooraf gebouwde stemmen met instructiebesturing |
customvoice-0.6b | ~1.5GB | Lichtgewicht variant voor beperkt VRAM |
voicedesign-1.7b | ~3.5GB | Stemmen maken op basis van tekstbeschrijvingen |
base-1.7b | ~3.5GB | Stemklonen op basis van fragmenten van 3 seconden |
base-0.6b | ~1.5GB | Lichtgewicht stemklonen |
Stemmen
Vooraf gebouwde stemmen (CustomVoice-modellen)
| Stem | Taal | Beschrijving |
|---|---|---|
| Ryan | Engels | Man, helder en natuurlijk |
| Aiden | Engels | Man, warme toon |
| Vivian | Chinees | Vrouw, professioneel |
| Serena | Chinees | Vrouw, vriendelijk |
| Uncle_Fu | Chinees | Man, volwassen |
| Dylan | Chinees | Man, dialect van Beijing |
| Eric | Chinees | Man, dialect van Sichuan |
| Ono_Anna | Japans | Vrouw |
| Sohee | Koreaans | Vrouw |
Aliassen voor OpenAI-stemmen
Voor compatibiliteit met OpenAI TTS-clients koppelt de server de namen van OpenAI-stemmen als volgt:
| OpenAI-stem | Verwijst naar |
|---|---|
alloy | Ryan |
echo | Aiden |
fable | Vivian |
onyx | Uncle_Fu |
nova | Serena |
shimmer | Ono_Anna |
API-referentie
Spraak genereren
Eindpunt: POST /v1/audio/speech
{
"model": "qwen3-tts",
"input": "Text to convert to speech",
"voice": "Ryan",
"response_format": "wav",
"instruct": "Speak with enthusiasm",
"language": "English"
}
| Parameter | Type | Standaard | Beschrijving |
|---|---|---|---|
model | string | qwen3-tts | Model-ID |
input | string | vereist | Te synthetiseren tekst (max. 10.000 tekens) |
voice | string | ryan | Stemnaam (zie bovenstaande tabel) |
response_format | string | wav | Audioformaat (alleen wav wordt ondersteund) |
instruct | string | "" | Instructie voor emotie/prosodie |
language | string | automatische detectie | Taaldetectie overschrijven |
Antwoord: audiobestand (audio/wav)
Stemontwerp
Eindpunt: POST /v1/audio/voice-design
Maak aangepaste stemmen op basis van beschrijvingen in natuurlijke taal.
{
"model": "qwen3-tts-voicedesign",
"input": "Welcome to our service.",
"voice_description": "A warm, friendly female voice with a slight British accent",
"language": "English"
}
Vereist dat het model voicedesign-1.7b is geladen.
Stemklonen
Eindpunt: POST /v1/audio/voice-clone
Kloon een stem uit een audiofragment van minstens 3 seconden.
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
| Parameter | Type | Beschrijving |
|---|---|---|
input | string | Te synthetiseren tekst |
reference_audio | file | Audiofragment van minstens 3 seconden |
reference_text | string | Transcriptie van de referentieaudio |
Vereist dat het model base-1.7b of base-0.6b is geladen.
Stemmen weergeven
Eindpunt: GET /v1/voices
{
"voices": [
{"id": "ryan", "name": "Ryan", "language": "English"},
{"id": "aiden", "name": "Aiden", "language": "English"},
...
]
}
Statuscontrole
Eindpunt: GET /health
{ "status": "healthy", "model_loaded": true }
Serverconfiguratie
python server.py [OPTIONS]
| Optie | Standaard | Beschrijving |
|---|---|---|
--host | 0.0.0.0 | Host om aan te binden |
--port | 8100 | Poort om aan te binden |
--model | customvoice-1.7b | Te laden modelvariant |
Netwerktoegang
Zo opent u de server voor andere computers in uw netwerk:
# 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 ...
Werk het plug-ineindpunt bij in 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"
}
}
}
Productiefuncties
Tekstopschoning
De server schoont invoertekst automatisch op om vastlopende modellen te voorkomen:
- Verwijdert emoji's en symbolen
- Verwijdert Markdown-opmaak (
*bold*,_italic_, enzovoort) - Kort herhaalde tekens in (
FUUUUU→FUU) - Verwijdert toneelaanwijzingen (
*(action)*,(whispers)) - Normaliseert witruimte
Tekst opdelen
Lange tekst wordt automatisch op zinsgrenzen gesplitst:
- Maximaal 500 tekens per deel
- Time-out van 30 seconden per deel
- Mislukte delen worden overgeslagen; de overige gaan door
- Delen worden samengevoegd tot één audioantwoord
Dit voorkomt time-outs bij lange AI-antwoorden en behoudt tegelijkertijd een natuurlijke spraakstroom.
Configuratie met meerdere GPU's
Op systemen met meerdere GPU's dwingt de server uitvoering op één GPU af om verschillen tussen tensorapparaten te voorkomen:
device_map = {"": "cuda:0"} # Uses first GPU only
Zo gebruikt u een specifieke GPU:
CUDA_VISIBLE_DEVICES=1 python server.py --model customvoice-1.7b
Problemen oplossen
Modeldownload mislukt
Het model wordt bij de eerste uitvoering gedownload van Hugging Face. Als dat mislukt:
# Set Hugging Face token for gated models
export HF_TOKEN=hf_...
# Or download manually
huggingface-cli download Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice
Onvoldoende geheugen (Apple Silicon)
RuntimeError: MPS backend out of memory
Gebruik de kleinere modelvariant:
python server.py --model customvoice-0.6b
Onvoldoende CUDA-geheugen
torch.cuda.OutOfMemoryError: CUDA out of memory
- Sluit andere GPU-toepassingen
- Gebruik de 0.6B-modelvariant
- Verlaag de deelgrootte in server.py (
max_chunk_size=300)
Time-out van server
Als het genereren van lange tekst een time-out bereikt:
- De server deelt tekst automatisch op en gaat verder met de overige delen
- Controleer in de serverlogboeken welke delen een time-out bereikten
- Overweeg de invoertekst in te korten
Audio klinkt onjuist
- Herhaalde lettergrepen: meestal veroorzaakt door emoji's of speciale tekens. De opschoning hoort dit automatisch af te handelen.
- Verkeerde taal: stel de parameter
languageexpliciet in de aanvraag in. - Onnatuurlijke pauzes: tekst wordt mogelijk op onjuiste grenzen gesplitst. Controleer op ongebruikelijke interpunctie.
Plug-inconfiguratie
De meegeleverde plug-in (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"
}
Bronnen
- Qwen3-TTS GitHub - Officiële repository
- Qwen3-TTS-demo - Probeer hem online
- Alibaba Cloud TTS-documentatie - Documentatie voor de cloud-API