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_audio=@reference.wav" \
-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 (FUUUUUFUU)
  • 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