Intermédiaire 10 minQwen

Qwen3-TTS en local : synthèse vocale et voix clonée

Qwen3-TTS est la famille de modèles de synthèse vocale publiée en open-weights par l'équipe Qwen d'Alibaba, sous licence Apache 2.0. Elle tient dans quelques gigaoctets, parle français parmi une dizaine de langues, et sait faire trois choses distinctes : lire un texte avec une voix prédéfinie, inventer une voix à partir d'une description, ou reproduire un timbre à partir d'un court extrait audio. Ce guide montre comment faire tourner Qwen3-TTS en local avec le paquet Python officiel, quelle variante choisir, et dans quel cadre le clonage de voix reste acceptable. Aucune mesure de qualité ou de vitesse n'est avancée ici : nous n'en avons pas réalisé, et les sources officielles sont à consulter pour les versions courantes.

Par Thomas P.·Màj 2026-10-15·Testé sur Windows, macOS, Linux

#Pourquoi Qwen3-TTS plutôt qu'une voix cloud

Les services de synthèse vocale en ligne sonnent bien, mais chaque phrase que vous leur confiez quitte votre machine, est facturée au caractère, et dépend d'un compte qui peut fermer. Pour un lecteur de documents internes, un assistant domotique ou un prototype d'application, une voix qui tourne entièrement en local supprime ces trois dépendances d'un coup.

Dans l'écosystème ouvert, deux familles coexistaient jusqu'ici. D'un côté les modèles très légers comme Piper ou Kokoro : rapides sur processeur, voix fixes, pas de clonage. De l'autre des modèles plus lourds et plus expressifs, souvent centrés sur l'anglais et le chinois. Qwen3-TTS se place entre les deux : des poids compacts, mais une architecture de type LLM qui accepte des consignes de style en langage naturel, et un support explicite du français dès le lancement.

La particularité de la famille est d'être découpée en trois comportements plutôt qu'en un seul modèle à tout faire. Vous ne téléchargez que la variante correspondant à votre besoin, ce qui compte sur un GPU de 8 ou 12 Go partagé avec un LLM de texte.

i
Ce que ce guide ne fait pas
Il ne compare pas la qualité des voix entre Qwen3-TTS, Kokoro ou Voxtral, et ne donne aucun débit. Nous n'avons pas mené de test reproductible ; une telle comparaison exigerait un protocole, du matériel décrit et des fichiers audio publiés. Le guide s'appuie sur le dépôt GitHub QwenLM/Qwen3-TTS et les fiches Hugging Face de l'organisation Qwen, à relire au moment où vous installez : les noms de modèles et les paramètres de l'API Python évoluent.

#Les modèles disponibles : Base, CustomVoice, VoiceDesign

Le kit Réseaux Sociaux Local

Tes vidéos courtes et carrousels fabriqués chez toi : voix off IA naturelle, sous-titres mot à mot, montage automatique et textes de publication, sans abonnement.

  • Espace en ligne à vie
  • PDF + fichiers
  • Mises à jour à vie

Au lancement, la famille comprend deux tailles de modèle, 0,6 et 1,7 milliard de paramètres, déclinées en trois variantes fonctionnelles, plus un tokenizer audio partagé. Les identifiants Hugging Face suivent le motif Qwen/Qwen3-TTS-12Hz-<taille>-<variante>. Le « 12Hz » désigne la fréquence du codec audio : le modèle produit douze trames de jetons acoustiques par seconde de parole, ce qui explique sa frugalité en calcul par rapport à des codecs plus denses.

CustomVoice
Voix prédéfinies, chacune avec un timbre et une langue d'origine, pilotables par une consigne de style (« parle lentement, ton rassurant »). C'est la variante à prendre pour lire un texte sans se poser de question de voix. Disponible en 0,6B et 1,7B.
VoiceDesign
Vous décrivez la voix voulue en langage naturel (âge, genre perçu, énergie, accent, émotion) et le modèle l'invente. Aucun enregistrement de référence, donc aucune personne réelle imitée. Publiée en 1,7B.
Base
Clonage à partir d'un extrait audio de quelques secondes et de sa transcription. C'est la variante la plus puissante et la seule qui pose une question de consentement, traitée plus bas. Disponible en 0,6B et 1,7B.
Tokenizer-12Hz
Le codec audio qui encode et décode la parole. Il est téléchargé automatiquement par les variantes ci-dessus ; vous n'avez à le manipuler qu'en cas d'usage avancé.

Les langues annoncées sont le chinois, l'anglais, le japonais, le coréen, l'allemand, le français, le russe, le portugais, l'espagnol et l'italien, avec en plus plusieurs dialectes chinois. Le paramètre de langue accepte soit un nom explicite comme « French », soit « Auto » pour laisser le modèle détecter la langue du texte. Pour du français, forcer la valeur évite les hésitations de prononciation sur les noms propres et les anglicismes.

→
Quelle taille choisir
Les poids en bfloat16 occupent environ deux octets par paramètre : de l'ordre de 1,2 Go pour la version 0,6B et 3,4 Go pour la 1,7B, hors codec et mémoire de travail. C'est un calcul, pas une mesure. Si votre GPU héberge déjà un modèle de texte, la 0,6B laisse plus de place ; si la synthèse vocale est l'usage principal, la 1,7B est celle que l'équipe Qwen met en avant dans ses exemples et la seule qui propose VoiceDesign.

#Prérequis matériel et logiciel

Système
Linux x86_64 est la cible documentée par le dépôt. macOS et Windows sont possibles avec des réserves détaillées dans la section dédiée.
GPU
Une carte NVIDIA avec CUDA est la voie prévue. Une RTX 3060 12 Go suffit largement pour la 1,7B seule ; l'exécution sur processeur fonctionne pour tester une phrase mais n'est pas adaptée à un usage interactif.
Python
Le dépôt recommande Python 3.12 dans un environnement virtuel dédié. Évitez d'installer dans l'environnement système ou dans celui d'un autre projet audio : les versions de PyTorch et de transformers imposées par le paquet peuvent entrer en conflit.
Espace disque
Comptez quelques gigaoctets par variante téléchargée, dans le cache Hugging Face (~/.cache/huggingface par défaut).
Réseau
Uniquement au premier lancement, pour télécharger les poids. Ensuite, tout fonctionne hors ligne.

Un dernier prérequis n'est pas technique : si vous comptez utiliser la variante Base, disposez d'un enregistrement dont vous avez le droit d'exploiter la voix. Votre propre voix est le cas le plus simple et le plus sûr pour apprendre.

#Étape 1 : installer le paquet qwen-tts

Le paquet Python officiel s'appelle qwen-tts sur PyPI et s'importe sous le nom qwen_tts. Il tire PyTorch et transformers comme dépendances. L'installation ci-dessous utilise un environnement virtuel standard ; conda fonctionne aussi bien si c'est votre habitude.

Terminal
# Environnement isolé
python3.12 -m venv ~/qwen3-tts
source ~/qwen3-tts/bin/activate
pip install --upgrade pip

# Paquet officiel
pip install -U qwen-tts

# Lecture et écriture de fichiers audio pour les exemples
pip install soundfile

Le dépôt propose en option FlashAttention 2 pour accélérer l'inférence sur GPU récents. Sa compilation est longue et échoue sur certaines combinaisons CUDA/PyTorch. Ce n'est pas indispensable : sans lui, le modèle utilise l'attention standard de PyTorch. Installez-le seulement une fois que le reste fonctionne.

Terminal (optionnel)
pip install -U flash-attn --no-build-isolation

Vérifiez que l'import passe et que PyTorch voit bien votre GPU avant d'aller plus loin.

Terminal
python -c "import torch, qwen_tts; print(torch.__version__, torch.cuda.is_available())"
!
Dépendances système audio
Les bibliothèques audio Python s'appuient parfois sur des outils système (libsndfile pour soundfile, sox ou ffmpeg selon les versions du paquet). Si un import échoue sur une bibliothèque manquante, installez-la avec votre gestionnaire de paquets (apt, dnf, pacman) puis relancez. Le message d'erreur nomme toujours la bibliothèque attendue.

#Étape 2 : générer une première phrase en français avec Qwen3-TTS

La variante CustomVoice est la plus directe pour un premier essai : pas d'enregistrement de référence, pas de description à rédiger. On charge le modèle, on choisit une voix dans la liste du dépôt, on passe le texte et la langue. Le premier appel télécharge les poids depuis Hugging Face.

premiere_voix.py
import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice",
    device_map="cuda:0",
    dtype=torch.bfloat16,
)

wavs, sr = model.generate_custom_voice(
    text="Bonjour, ceci est un test de synthèse vocale locale avec Qwen3-TTS.",
    language="French",
    speaker="Ryan",
    instruct="Ton calme et posé, débit modéré.",
)

sf.write("sortie_custom_voice.wav", wavs[0], sr)
print("Fichier écrit à", sr, "Hz")

Trois paramètres méritent une explication. Le champ speaker désigne une des voix prédéfinies ; la liste exacte, avec la langue d'origine et la description de chaque timbre, figure dans le README et la fiche Hugging Face du modèle CustomVoice. Toutes ces voix peuvent lire du français, mais chacune garde un accent cohérent avec sa langue native, ce qui est un choix esthétique et non un défaut. Le champ instruct est une consigne de style en langage naturel : émotion, rythme, intention. Il est facultatif. Enfin, la fonction renvoie une liste de formes d'onde et la fréquence d'échantillonnage, ce qui permet de passer plusieurs textes en lot.

Génération en lot
textes = [
    "Première phrase à lire.",
    "Deuxième phrase, avec une intonation différente.",
]
wavs, sr = model.generate_custom_voice(
    text=textes,
    language=["French", "French"],
    speaker=["Ryan", "Serena"],
    instruct=["Neutre.", "Enjouée, un peu plus rapide."],
)
for i, w in enumerate(wavs):
    sf.write(f"lot_{i}.wav", w, sr)
→
Sur un GPU partagé avec Ollama
Ollama garde ses modèles chargés en mémoire pendant la durée fixée par OLLAMA_KEEP_ALIVE. Si la synthèse vocale échoue sur une erreur de mémoire CUDA alors que la carte devrait suffire, déchargez le modèle de texte le temps du test, ou chargez Qwen3-TTS en 0,6B. Un 7B en Q4_K_M occupe déjà environ 5 Go.

#Étape 3 : concevoir une voix par description

VoiceDesign répond à un besoin fréquent : vous voulez une voix qui n'existe pas dans la liste, sans imiter personne. On décrit le résultat en une ou deux phrases et le modèle produit un timbre cohérent avec la consigne. C'est aussi la variante à préférer pour un produit, puisqu'aucune voix réelle n'est reproduite.

voice_design.py
import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign",
    device_map="cuda:0",
    dtype=torch.bfloat16,
)

wavs, sr = model.generate_voice_design(
    text="Votre rendez-vous est confirmé pour demain à quatorze heures.",
    language="French",
    instruct="Voix féminine d'une quarantaine d'années, grave et chaleureuse, "
             "articulation nette, rythme lent, sans emphase.",
)

sf.write("sortie_voice_design.wav", wavs[0], sr)

La description fonctionne mieux quand elle décrit des caractéristiques acoustiques (hauteur, vitesse, énergie, netteté) que des métaphores. « Voix de présentateur radio nocturne » donne des résultats moins stables que « voix masculine grave, lente, feutrée ». Une voix conçue ainsi n'est pas figée d'un appel à l'autre : si vous avez besoin de la même voix sur des centaines de phrases, générez un premier extrait qui vous convient, puis utilisez-le comme référence avec la variante Base. Vous clonez alors une voix synthétique, ce qui ne pose aucun problème de consentement.

#Étape 4 : cloner une voix, avec le consentement de son propriétaire

La variante Base reproduit un timbre à partir d'un court extrait audio et de sa transcription. Quelques secondes de parole propre suffisent pour obtenir une voix reconnaissable. C'est la fonction la plus impressionnante de la famille, et celle qui demande le plus de rigueur avant même d'écrire une ligne de code.

!
Consentement : la règle, pas l'option
La voix d'une personne est un attribut de sa personnalité, protégé en France au titre de la vie privée (article 9 du Code civil), et un enregistrement vocal est une donnée personnelle au sens du RGPD. Cloner la voix d'un tiers sans son accord explicite et documenté vous expose civilement, et pénalement si l'usage est trompeur. Le règlement européen sur l'IA impose par ailleurs, depuis août 2026, de signaler qu'un contenu audio est généré ou manipulé artificiellement. Clonez votre propre voix, celle d'une personne qui a donné un accord écrit pour un usage précis, ou une voix synthétique issue de VoiceDesign. Rien d'autre.

Pour préparer la référence, enregistrez une phrase de cinq à dix secondes dans un endroit calme, sans musique de fond ni réverbération, en parlant naturellement. Transcrivez-la mot pour mot, ponctuation comprise : c'est ce texte que le modèle aligne sur l'audio pour apprendre le timbre. Un fichier WAV mono est le format le plus sûr.

clonage.py
import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-Base",
    device_map="cuda:0",
    dtype=torch.bfloat16,
)

wavs, sr = model.generate_voice_clone(
    text="Voici une phrase que je n'ai jamais prononcée, lue avec ma propre voix.",
    language="French",
    ref_audio="ma_reference.wav",
    ref_text="Bonjour, je m'appelle Thomas et j'enregistre cette phrase pour tester le clonage.",
)

sf.write("sortie_clone.wav", wavs[0], sr)

Le dépôt documente deux usages avancés utiles en production. D'abord, la possibilité de pré-calculer une « empreinte » de la voix de référence une fois pour toutes, puis de la réutiliser sur chaque phrase sans recharger l'audio : c'est ce qu'il faut pour un lecteur de documents ou un assistant qui parle en continu. Ensuite, un mode où seule l'empreinte du locuteur est utilisée, sans la transcription, plus rapide mais moins fidèle. Les noms exacts de ces paramètres figurent dans le README ; ils ont changé entre les premières versions du paquet, d'où l'importance de lire la documentation installée plutôt qu'un tutoriel daté.

Ce qui améliore le résultat
Une référence propre, une transcription exacte, une langue forcée plutôt que « Auto », et un texte cible ponctué (le modèle respire aux virgules et aux points).
Ce qui le dégrade
Du bruit de fond, une référence trop courte ou trop longue, un chuchotement, une transcription approximative, et des chiffres écrits en nombres plutôt qu'en lettres pour les cas ambigus.
Ce qu'il faut documenter
Qui a donné son accord, pour quel usage, à quelle date, et où est conservé l'enregistrement. Un simple fichier texte à côté de la référence suffit pour un projet personnel ; un vrai registre de traitement pour un usage professionnel.

#Étape 5 : interface web et serveur

Le paquet installe une démo Gradio en ligne de commande, pratique pour essayer les voix et les consignes sans écrire de script. Elle charge un modèle au démarrage et expose une page web locale.

Terminal
qwen-tts-demo Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice --ip 127.0.0.1 --port 8000

Gardez l'adresse d'écoute sur 127.0.0.1 tant que la machine n'est pas protégée : Gradio n'authentifie personne par défaut, et une interface de clonage de voix exposée sur un réseau n'est pas anodine. Si vous devez y accéder depuis un autre poste, passez par un tunnel SSH ou un reverse proxy avec authentification, comme pour n'importe quel service local.

Pour une intégration applicative, l'équipe Qwen oriente vers vLLM-Omni, l'extension multimodale de vLLM, qui permet de servir le modèle avec une API HTTP et une sortie en flux (le son commence à sortir avant la fin de la génération). C'est la voie à étudier pour un assistant vocal où la latence compte ; pour une génération en lot de fichiers audio, le script Python direct suffit et évite une couche de plus.

#Apple Silicon et Windows : des pistes communautaires, signalées comme telles

Le dépôt officiel documente Linux avec CUDA. Sur les autres plateformes, ce qui suit relève de l'écosystème communautaire : nous n'avons pas vérifié ces chemins nous-mêmes, et leur état change d'un mois à l'autre.

Mac Apple Silicon
Le paquet officiel repose sur PyTorch ; on peut tenter device_map="mps" avec dtype float16 ou float32 (bfloat16 n'est pas toujours pris en charge par MPS), en s'attendant à des opérations non supportées. La voie la plus naturelle sur Mac est un portage MLX : le projet communautaire mlx-audio a annoncé une prise en charge de Qwen3-TTS. Vérifiez sur son dépôt quelles variantes sont couvertes et avec quel niveau de maturité avant de vous y engager.
Windows natif
PyTorch avec CUDA s'installe normalement, mais FlashAttention est difficile à compiler sous Windows : laissez-le de côté et utilisez l'attention par défaut. Certaines dépendances audio demandent des binaires système (ffmpeg dans le PATH, par exemple). Des installateurs « un clic » tiers circulent ; ils embarquent souvent une version figée du paquet et il faut lire ce qu'ils installent.
Windows via WSL2
C'est la voie la plus proche de la documentation officielle : une distribution Ubuntu sous WSL2 avec le pilote NVIDIA Windows récent voit le GPU et suit exactement les commandes de ce guide. Le coût est une couche de plus et un accès aux fichiers Windows légèrement plus lent.
i
Formats quantifiés
À la différence des modèles de texte, il n'existe pas de chemin Ollama ou GGUF officiel pour Qwen3-TTS : la synthèse vocale fait intervenir un codec audio que llama.cpp ne gère pas tel quel. Des conversions communautaires peuvent apparaître ; traitez-les comme des expérimentations tant que le dépôt QwenLM ne les référence pas.

#Dépannage

CUDA out of memory au chargement
Un autre processus occupe la carte (Ollama, un navigateur avec accélération, une session Stable Diffusion). Vérifiez avec nvidia-smi, libérez, ou basculez sur la variante 0,6B.
Téléchargement interrompu ou dépôt introuvable
Vérifiez l'identifiant exact du modèle sur la page Hugging Face de l'organisation Qwen ; les noms de variantes ont pu évoluer depuis la rédaction. Un téléchargement partiel se reprend en relançant le script.
Erreur d'import liée à transformers ou torch
Conflit de versions avec un autre projet installé dans le même environnement. Recréez un environnement virtuel propre et réinstallez uniquement qwen-tts et soundfile.
Prononciation étrange en français
Forcez language="French" au lieu de « Auto », écrivez les nombres en lettres quand la lecture est ambiguë, et ponctuez. Les sigles se lisent mieux séparés par des points ou des espaces.
Clone qui ne ressemble pas à la référence
Réenregistrez la référence dans le calme, vérifiez la transcription mot à mot, et testez la 1,7B si vous étiez en 0,6B. Un extrait trop long n'aide pas : quelques secondes de parole nette valent mieux qu'une minute bruitée.
Silence ou fichier vide
Vérifiez que vous écrivez bien wavs[0] et non la liste entière, et que la fréquence d'échantillonnage renvoyée par le modèle est celle passée à soundfile.
Lenteur extrême
Le modèle tourne probablement sur CPU. Le test torch.cuda.is_available() de l'étape 1 doit renvoyer True ; sinon, réinstallez PyTorch avec la version CUDA correspondant à votre pilote.

#Pour aller plus loin

Qwen3-TTS couvre la partie « parler » d'une chaîne vocale locale. Pour l'autre moitié, la compréhension, et pour comparer avec des modèles de synthèse plus légers, le site traite déjà plusieurs sujets voisins. Les versions des paquets et des modèles cités dans ce guide sont celles du dépôt QwenLM/Qwen3-TTS au moment de la rédaction ; en cas d'écart, le dépôt et les fiches Hugging Face font foi.

Kokoro TTS : une voix locale convaincante et légère
Le modèle de 82 millions de paramètres qui parle plus vite que le temps réel sur processeur, sans clonage. Le bon choix quand la frugalité prime sur l'expressivité. https://quelllm.fr/guide/kokoro-tts-voix-locale
Assistant vocal 100 % local : Whisper + Ollama + Piper
La chaîne complète écoute, raisonnement, réponse parlée. Qwen3-TTS peut y remplacer Piper pour la synthèse si votre GPU le permet. https://quelllm.fr/guide/assistant-vocal-local-whisper-piper
Fiche modèle Voxtral 4B TTS
L'autre modèle de synthèse vocale ouvert récent côté européen, pour situer Qwen3-TTS dans le paysage sans comparaison chiffrée. https://quelllm.fr/modele/voxtral-4b-tts
Ce guide vous a aidé ?

Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.