Aller au contenu principal

Intégration de Qwen3-TTS

Exécutez localement Qwen3-TTS d'Alibaba pour bénéficier d'une synthèse vocale multilingue de haute qualité. Ce guide explique comment configurer le serveur TTS compatible OpenAI inclus avec Libre WebUI.

Présentation​

Qwen3-TTS est un système avancé de synthèse vocale qui propose :

  • 9 voix prédéfinies couvrant l'anglais, le chinois, le japonais et le coréen
  • La prise en charge de 10 langues, notamment l'allemand, le français, l'espagnol, l'italien, le portugais et le russe
  • Le clonage vocal à partir d'échantillons audio de 3 secondes
  • La conception de voix à l'aide de descriptions en langage naturel
  • Le contrôle par instructions des émotions et de la prosodie

Le serveur inclus encapsule Qwen3-TTS dans une API compatible OpenAI, ce qui permet à Libre WebUI de l'utiliser au moyen du système d'extensions standard.

Prérequis​

ComposantMinimumRecommandé
Python3.12+3.12 (pas 3.14)
VRAM GPU4GB (modèles 0.6B)8GB+ (modèles 1.7B)
RAM8GB16GB+
Disque5GB10GB

Plateformes prises en charge​

PlateformeMoteurRemarques
GPU NVIDIACUDAMeilleures performances, prise en charge de bfloat16
Apple SiliconMPSUtilisez les modèles 0.6B pour économiser la mémoire
CPUPyTorchPlus lent ; utilisez les modèles 0.6B
Utilisateurs d'Apple Silicon

Utilisez la variante de modèle customvoice-0.6b sur Mac afin d'éviter la pression sur la mémoire. Les modèles 1.7B peuvent rendre instables les machines dotées de 16GB de mémoire unifiée.

Démarrage rapide​

1. Installer le serveur​

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. Démarrer le serveur​

# 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

Le serveur s'exécute par défaut à l'adresse http://localhost:8100.

3. Configurer Libre WebUI​

L'extension est préconfigurée dans plugins/qwen-tts.json. Activez-la dans Paramètres → Extensions → Qwen3 TTS.

4. La tester​

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

Modèles disponibles​

ModèleTailleCas d'usage
customvoice-1.7b~3.5GBVoix prédéfinies avec contrôle par instructions
customvoice-0.6b~1.5GBVariante légère pour une VRAM limitée
voicedesign-1.7b~3.5GBCréation de voix à partir de descriptions textuelles
base-1.7b~3.5GBClonage vocal à partir d'échantillons de 3 secondes
base-0.6b~1.5GBClonage vocal léger

Voix​

Voix prédéfinies (modèles CustomVoice)​

VoixLangueDescription
RyanAnglaisMasculine, claire et naturelle
AidenAnglaisMasculine, ton chaleureux
VivianChinoisFéminine, professionnelle
SerenaChinoisFéminine, conviviale
Uncle_FuChinoisMasculine, mûre
DylanChinoisMasculine, dialecte de Pékin
EricChinoisMasculine, dialecte du Sichuan
Ono_AnnaJaponaisFéminine
SoheeCoréenFéminine

Alias de voix OpenAI​

Pour assurer la compatibilité avec les clients TTS OpenAI, le serveur fait correspondre les noms de voix OpenAI :

Voix OpenAICorrespond à
alloyRyan
echoAiden
fableVivian
onyxUncle_Fu
novaSerena
shimmerOno_Anna

Référence de l'API​

Génération de parole​

Point de terminaison : POST /v1/audio/speech

{
"model": "qwen3-tts",
"input": "Text to convert to speech",
"voice": "Ryan",
"response_format": "wav",
"instruct": "Speak with enthusiasm",
"language": "English"
}
ParamètreTypeValeur par défautDescription
modelstringqwen3-ttsIdentifiant du modèle
inputstringrequisTexte à synthétiser (10,000 caractères max.)
voicestringryanNom de la voix (voir le tableau ci-dessus)
response_formatstringwavFormat audio (seul wav est pris en charge)
instructstring""Instruction relative aux émotions ou à la prosodie
languagestringdétection automatiqueRemplace la détection de la langue

Réponse : fichier audio (audio/wav)

Conception de voix​

Point de terminaison : POST /v1/audio/voice-design

Créez des voix personnalisées à partir de descriptions en langage naturel.

{
"model": "qwen3-tts-voicedesign",
"input": "Welcome to our service.",
"voice_description": "A warm, friendly female voice with a slight British accent",
"language": "English"
}
remarque

Le modèle voicedesign-1.7b doit être chargé.

Clonage vocal​

Point de terminaison : POST /v1/audio/voice-clone

Clonez une voix à partir d'un échantillon audio d'au moins 3 secondes.

curl -X POST http://localhost:8100/v1/audio/voice-clone \
-F "input=Hello, this is my cloned voice." \
-F "reference_text=This is what was said in the reference." \
--output cloned.wav
ParamètreTypeDescription
inputstringTexte à synthétiser
reference_audiofileÉchantillon audio d'au moins 3 secondes
reference_textstringTranscription de l'enregistrement de référence
remarque

Le modèle base-1.7b ou base-0.6b doit être chargé.

Répertorier les voix​

Point de terminaison : GET /v1/voices

{
"voices": [
{"id": "ryan", "name": "Ryan", "language": "English"},
{"id": "aiden", "name": "Aiden", "language": "English"},
...
]
}

Contrôle de l'état​

Point de terminaison : GET /health

{ "status": "healthy", "model_loaded": true }

Configuration du serveur​

python server.py [OPTIONS]
OptionValeur par défautDescription
--host0.0.0.0Hôte auquel se lier
--port8100Port auquel se lier
--modelcustomvoice-1.7bVariante du modèle à charger

Accès réseau​

Pour accéder au serveur depuis d'autres machines de votre réseau :

# 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 ...

Mettez à jour le point de terminaison de l'extension dans 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"
}
}
}

Fonctionnalités de production​

Nettoyage du texte​

Le serveur nettoie automatiquement le texte d'entrée afin d'empêcher le modèle de se bloquer :

  • Suppression des émojis et symboles
  • Suppression de la mise en forme Markdown (*bold*, _italic_, etc.)
  • Réduction des caractères répétés (FUUUUU → FUU)
  • Suppression des indications scéniques (*(action)*, (whispers))
  • Normalisation des espaces

Découpage du texte​

Les textes longs sont automatiquement scindés aux limites des phrases :

  • 500 caractères maximum par segment
  • Délai maximal de 30 secondes par segment
  • Les segments qui échouent sont ignorés et les autres continuent
  • Les segments sont concaténés en une seule réponse audio

Cela évite les dépassements de délai sur les longues réponses de l'IA tout en conservant un débit naturel.

Configuration à plusieurs GPU​

Sur les systèmes dotés de plusieurs GPU, le serveur impose l'exécution sur un seul GPU afin d'éviter les incompatibilités de périphériques entre tenseurs :

device_map = {"": "cuda:0"} # Uses first GPU only

Pour utiliser un GPU précis :

CUDA_VISIBLE_DEVICES=1 python server.py --model customvoice-1.7b

Dépannage​

Échec du téléchargement du modèle​

Le modèle est téléchargé depuis Hugging Face lors de la première exécution. En cas d'échec :

# Set Hugging Face token for gated models
export HF_TOKEN=hf_...

# Or download manually
huggingface-cli download Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice

Mémoire insuffisante (Apple Silicon)​

RuntimeError: MPS backend out of memory

Utilisez la variante de modèle plus petite :

python server.py --model customvoice-0.6b

Mémoire CUDA insuffisante​

torch.cuda.OutOfMemoryError: CUDA out of memory
  1. Fermez les autres applications qui utilisent le GPU
  2. Utilisez la variante de modèle 0.6B
  3. Réduisez la taille des segments dans server.py (max_chunk_size=300)

Dépassement du délai du serveur​

Si la génération dépasse le délai sur un texte long :

  1. Le serveur découpe automatiquement le texte et poursuit avec les segments restants
  2. Consultez les journaux du serveur pour identifier les segments ayant dépassé le délai
  3. Envisagez de raccourcir le texte d'entrée

Le son est incorrect​

  • Syllabes répétées : généralement causées par des émojis ou des caractères spéciaux. Le nettoyeur doit les traiter automatiquement.
  • Mauvaise langue : définissez explicitement le paramètre language dans la requête.
  • Pauses peu naturelles : le texte est peut-être scindé aux mauvais endroits. Recherchez une ponctuation inhabituelle.

Configuration de l'extension​

L'extension incluse (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"
}

Ressources​