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
| Composant | Minimum | Recommandé |
|---|---|---|
| Python | 3.12+ | 3.12 (pas 3.14) |
| VRAM GPU | 4GB (modèles 0.6B) | 8GB+ (modèles 1.7B) |
| RAM | 8GB | 16GB+ |
| Disque | 5GB | 10GB |
Plateformes prises en charge
| Plateforme | Moteur | Remarques |
|---|---|---|
| GPU NVIDIA | CUDA | Meilleures performances, prise en charge de bfloat16 |
| Apple Silicon | MPS | Utilisez les modèles 0.6B pour économiser la mémoire |
| CPU | PyTorch | Plus lent ; utilisez les modèles 0.6B |
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èle | Taille | Cas d'usage |
|---|---|---|
customvoice-1.7b | ~3.5GB | Voix prédéfinies avec contrôle par instructions |
customvoice-0.6b | ~1.5GB | Variante légère pour une VRAM limitée |
voicedesign-1.7b | ~3.5GB | Création de voix à partir de descriptions textuelles |
base-1.7b | ~3.5GB | Clonage vocal à partir d'échantillons de 3 secondes |
base-0.6b | ~1.5GB | Clonage vocal léger |
Voix
Voix prédéfinies (modèles CustomVoice)
| Voix | Langue | Description |
|---|---|---|
| Ryan | Anglais | Masculine, claire et naturelle |
| Aiden | Anglais | Masculine, ton chaleureux |
| Vivian | Chinois | Féminine, professionnelle |
| Serena | Chinois | Féminine, conviviale |
| Uncle_Fu | Chinois | Masculine, mûre |
| Dylan | Chinois | Masculine, dialecte de Pékin |
| Eric | Chinois | Masculine, dialecte du Sichuan |
| Ono_Anna | Japonais | Féminine |
| Sohee | Coréen | Féminine |
Alias de voix OpenAI
Pour assurer la compatibilité avec les clients TTS OpenAI, le serveur fait correspondre les noms de voix OpenAI :
| Voix OpenAI | Correspond à |
|---|---|
alloy | Ryan |
echo | Aiden |
fable | Vivian |
onyx | Uncle_Fu |
nova | Serena |
shimmer | Ono_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ètre | Type | Valeur par défaut | Description |
|---|---|---|---|
model | string | qwen3-tts | Identifiant du modèle |
input | string | requis | Texte à synthétiser (10,000 caractères max.) |
voice | string | ryan | Nom de la voix (voir le tableau ci-dessus) |
response_format | string | wav | Format audio (seul wav est pris en charge) |
instruct | string | "" | Instruction relative aux émotions ou à la prosodie |
language | string | détection automatique | Remplace 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"
}
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_audio=@reference.wav" \
-F "reference_text=This is what was said in the reference." \
--output cloned.wav
| Paramètre | Type | Description |
|---|---|---|
input | string | Texte à synthétiser |
reference_audio | file | Échantillon audio d'au moins 3 secondes |
reference_text | string | Transcription de l'enregistrement de référence |
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]
| Option | Valeur par défaut | Description |
|---|---|---|
--host | 0.0.0.0 | Hôte auquel se lier |
--port | 8100 | Port auquel se lier |
--model | customvoice-1.7b | Variante 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
- Fermez les autres applications qui utilisent le GPU
- Utilisez la variante de modèle 0.6B
- 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 :
- Le serveur découpe automatiquement le texte et poursuit avec les segments restants
- Consultez les journaux du serveur pour identifier les segments ayant dépassé le délai
- 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
languagedans 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
- Qwen3-TTS sur GitHub - Dépôt officiel
- Démonstration de Qwen3-TTS - Essayez-le en ligne
- Documentation TTS d'Alibaba Cloud - Documentation de l'API cloud