Ga naar hoofdinhoud

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

OnderdeelMinimumAanbevolen
Python3.12+3.12 (niet 3.14)
GPU-VRAM4GB (0.6B-modellen)8GB+ (1.7B-modellen)
RAM8GB16GB+
Schijfruimte5GB10GB

Platformondersteuning

PlatformBackendOpmerkingen
NVIDIA GPUCUDABeste prestaties, ondersteuning voor bfloat16
Apple SiliconMPSGebruik 0.6B-modellen voor geheugenefficiëntie
CPUPyTorchLangzamer; gebruik 0.6B-modellen
Gebruikers van Apple Silicon

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

ModelGrootteToepassing
customvoice-1.7b~3.5GBVooraf gebouwde stemmen met instructiebesturing
customvoice-0.6b~1.5GBLichtgewicht variant voor beperkt VRAM
voicedesign-1.7b~3.5GBStemmen maken op basis van tekstbeschrijvingen
base-1.7b~3.5GBStemklonen op basis van fragmenten van 3 seconden
base-0.6b~1.5GBLichtgewicht stemklonen

Stemmen

Vooraf gebouwde stemmen (CustomVoice-modellen)

StemTaalBeschrijving
RyanEngelsMan, helder en natuurlijk
AidenEngelsMan, warme toon
VivianChineesVrouw, professioneel
SerenaChineesVrouw, vriendelijk
Uncle_FuChineesMan, volwassen
DylanChineesMan, dialect van Beijing
EricChineesMan, dialect van Sichuan
Ono_AnnaJapansVrouw
SoheeKoreaansVrouw

Aliassen voor OpenAI-stemmen

Voor compatibiliteit met OpenAI TTS-clients koppelt de server de namen van OpenAI-stemmen als volgt:

OpenAI-stemVerwijst naar
alloyRyan
echoAiden
fableVivian
onyxUncle_Fu
novaSerena
shimmerOno_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"
}
ParameterTypeStandaardBeschrijving
modelstringqwen3-ttsModel-ID
inputstringvereistTe synthetiseren tekst (max. 10.000 tekens)
voicestringryanStemnaam (zie bovenstaande tabel)
response_formatstringwavAudioformaat (alleen wav wordt ondersteund)
instructstring""Instructie voor emotie/prosodie
languagestringautomatische detectieTaaldetectie 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"
}
notitie

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
ParameterTypeBeschrijving
inputstringTe synthetiseren tekst
reference_audiofileAudiofragment van minstens 3 seconden
reference_textstringTranscriptie van de referentieaudio
notitie

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]
OptieStandaardBeschrijving
--host0.0.0.0Host om aan te binden
--port8100Poort om aan te binden
--modelcustomvoice-1.7bTe 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 (FUUUUUFUU)
  • 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
  1. Sluit andere GPU-toepassingen
  2. Gebruik de 0.6B-modelvariant
  3. Verlaag de deelgrootte in server.py (max_chunk_size=300)

Time-out van server

Als het genereren van lange tekst een time-out bereikt:

  1. De server deelt tekst automatisch op en gaat verder met de overige delen
  2. Controleer in de serverlogboeken welke delen een time-out bereikten
  3. 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 language expliciet 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