Intermedio 10 minQwen

Qwen3-TTS en local: síntesis de voz clonada

Qwen3-TTS es la familia de modelos de síntesis de voz publicada con pesos abiertos por el equipo Qwen de Alibaba, bajo licencia Apache 2.0. Cabe en unos pocos gigabytes, habla francés entre una decena de idiomas y sabe hacer tres cosas distintas: leer un texto con una voz predefinida, inventar una voz a partir de una descripción o reproducir un timbre a partir de un breve fragmento de audio. Esta guía muestra cómo ejecutar Qwen3-TTS en local con el paquete oficial de Python, qué variante elegir y en qué contexto la clonación de voz sigue siendo aceptable. Aquí no se proporciona ninguna medición de calidad o velocidad: no hemos realizado ninguna, y deben consultarse las fuentes oficiales para conocer las versiones actuales.

Por Thomas P.·Actualización 2026-10-15·Probado en Windows, macOS y Linux

#¿Por qué Qwen3-TTS en vez de una voz en la nube?

Los servicios de síntesis de voz en línea suenan bien, pero cada frase que les confías sale de tu máquina, se factura por carácter y depende de una cuenta que puede cerrarse. Para un lector de documentos internos, un asistente domótico o un prototipo de aplicación, una voz que funciona completamente en local elimina esas tres dependencias de una vez.

En el ecosistema abierto, hasta ahora coexistían dos familias. Por un lado, modelos muy ligeros como Piper o Kokoro: rápidos en el procesador, voces fijas y sin clonación. Por otro, modelos más pesados y expresivos, a menudo centrados en el inglés y el chino. Qwen3-TTS se sitúa entre ambos: pesos compactos, pero una arquitectura de tipo LLM que acepta instrucciones de estilo en lenguaje natural y compatibilidad explícita con el francés desde el lanzamiento.

La particularidad de la familia es que está dividida en tres comportamientos, en lugar de consistir en un único modelo que lo haga todo. Solo descargas la variante que corresponde a tus necesidades, algo importante en una GPU de 8 o 12 GB compartida con un LLM de texto.

i
Lo que no hace esta guía
No compara la calidad de las voces entre Qwen3-TTS, Kokoro o Voxtral, ni proporciona ninguna tasa. No hemos realizado una prueba reproducible; una comparación de ese tipo exigiría un protocolo, hardware descrito y archivos de audio publicados. La guía se basa en el repositorio de GitHub QwenLM/Qwen3-TTS y en las fichas de Hugging Face de la organización Qwen, que debes volver a consultar cuando instales: los nombres de los modelos y los parámetros de la API de Python evolucionan.

#Modelos disponibles: Base, CustomVoice, VoiceDesign

Kit de Redes Sociales con IA Local

Tus vídeos cortos y carruseles creados en tu ordenador: voz en off de IA natural, subtítulos palabra por palabra, montaje automático y textos de publicación, sin suscripción.

  • Espacio en línea de por vida
  • PDF + archivos
  • Reembolsado 30 d

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-<tamaño>-<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
Voces predefinidas, cada una con un timbre y un idioma de origen, controlables mediante una instrucción de estilo («habla despacio, con un tono tranquilizador»). Es la variante que debes elegir para leer un texto sin tener que preocuparte por la voz. Disponible en 0,6B y 1,7B.
VoiceDesign
Describes la voz que quieres en lenguaje natural (edad, género percibido, energía, acento, emoción) y el modelo la inventa. No se necesita ninguna grabación de referencia, por lo que no se imita a ninguna persona real. Publicado en 1,7B.
Base
Clonación a partir de un fragmento de audio de unos segundos y de su transcripción. Es la variante más potente y la única que plantea una cuestión de consentimiento, tratada más abajo. Disponible en 0,6B y 1,7B.
Tokenizer-12Hz
El códec de audio que codifica y decodifica el habla. Las variantes anteriores lo descargan automáticamente; solo tienes que manipularlo en caso de uso avanzado.

Los idiomas anunciados son chino, inglés, japonés, coreano, alemán, francés, ruso, portugués, español e italiano, además de varios dialectos chinos. El parámetro de idioma acepta tanto un nombre explícito como «French» como «Auto» para que el modelo detecte el idioma del texto. Para el francés, forzar el valor evita dudas de pronunciación con los nombres propios y los anglicismos.

→
Qué tamaño elegir
Los pesos en bfloat16 ocupan aproximadamente dos bytes por parámetro: del orden de 1,2 GB para la versión 0,6B y 3,4 GB para la 1,7B, sin contar el códec ni la memoria de trabajo. Es un cálculo, no una medición. Si tu GPU ya aloja un modelo de texto, la 0,6B deja más espacio; si la síntesis de voz es el uso principal, la 1,7B es la que el equipo Qwen destaca en sus ejemplos y la única que ofrece VoiceDesign.

#Requisitos de hardware y software

Sistema
Linux x86_64 es el objetivo documentado por el repositorio. macOS y Windows son posibles con las salvedades detalladas en la sección específica.
GPU
Una tarjeta NVIDIA con CUDA es la opción prevista. Una RTX 3060 de 12 GB es más que suficiente para la 1,7B por sí sola; la ejecución en procesador sirve para probar una frase, pero no es adecuada para un uso interactivo.
Python
El repositorio recomienda Python 3.12 en un entorno virtual específico. Evita instalarlo en el entorno del sistema o en el de otro proyecto de audio: las versiones de PyTorch y transformers exigidas por el paquete pueden entrar en conflicto.
Espacio en disco
Calcula unos pocos gigabytes por variante descargada, en la caché de Hugging Face (~/.cache/huggingface de forma predeterminada).
Red
Solo en el primer lanzamiento, para descargar los pesos. Después, todo funciona sin conexión.

Hay un último requisito previo que no es técnico: si tienes previsto utilizar la variante Base, debes disponer de una grabación cuya voz tengas derecho a utilizar. Tu propia voz es el caso más sencillo y seguro para aprender.

#Paso 1: instalar el paquete qwen-tts

El paquete oficial de Python se llama qwen-tts en PyPI y se importa con el nombre qwen_tts. Instala PyTorch y transformers como dependencias. La instalación siguiente utiliza un entorno virtual estándar; conda también funciona si es lo que sueles usar.

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

El repositorio ofrece opcionalmente FlashAttention 2 para acelerar la inferencia en GPU recientes. Su compilación es larga y falla con algunas combinaciones de CUDA y PyTorch. No es imprescindible: sin ella, el modelo utiliza la atención estándar de PyTorch. Instálala solo cuando el resto funcione.

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

Comprueba que import passe y que PyTorch detecta correctamente tu GPU antes de continuar.

Terminal
python -c "import torch, qwen_tts; print(torch.__version__, torch.cuda.is_available())"
!
Dependencias del sistema de audio
Las bibliotecas de audio de Python a veces dependen de herramientas del sistema (libsndfile para soundfile, sox o ffmpeg según las versiones del paquete). Si una importación falla por falta de una biblioteca, instálala con tu gestor de paquetes (apt, dnf, pacman) y vuelve a intentarlo. El mensaje de error siempre indica el nombre de la biblioteca esperada.

#Paso 2: generar una primera frase en francés con Qwen3-TTS

La variante CustomVoice es la más directa para una primera prueba: no requiere una grabación de referencia ni redactar una descripción. Se carga el modelo, se elige una voz de la lista del repositorio, y se introducen el texto y el idioma. La primera llamada descarga los pesos desde 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")

Tres parámetros merecen una explicación. El campo speaker designa una de las voces predefinidas; la lista exacta, con el idioma de origen y la descripción de cada timbre, figura en el README y en la ficha de Hugging Face del modelo CustomVoice. Todas estas voces pueden leer francés, pero cada una conserva un acento coherente con su idioma nativo, lo que es una elección estética y no un defecto. El campo instruct es una instrucción de estilo en lenguaje natural: emoción, ritmo e intención. Es opcional. Por último, la función devuelve una lista de formas de onda y la frecuencia de muestreo, lo que permite procesar varios textos por lotes.

Generación por lotes
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)
→
En una GPU compartida con Ollama
Ollama mantiene sus modelos cargados en memoria durante el tiempo establecido por OLLAMA_KEEP_ALIVE. Si la síntesis de voz falla por un error de memoria CUDA aunque la tarjeta debería ser suficiente, descarga el modelo de texto durante la prueba o carga Qwen3-TTS en 0,6B. Un 7B en Q4_K_M ya ocupa aproximadamente 5 GB.

#Paso 3: diseñar una voz mediante una descripción

VoiceDesign responde a una necesidad frecuente: quieres una voz que no aparezca en la lista, sin imitar a nadie. Describes el resultado en una o dos frases y el modelo produce un timbre coherente con la instrucción. También es la variante preferible para un producto, ya que no reproduce ninguna voz real.

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 descripción funciona mejor cuando describe características acústicas (altura, velocidad, energía y claridad) que cuando usa metáforas. «Voz de presentador de radio nocturno» da resultados menos estables que «voz masculina grave, lenta y aterciopelada». Una voz diseñada así no queda fijada de una llamada a otra: si necesitas la misma voz en cientos de frases, genera un primer fragmento que te convenza y úsalo después como referencia con la variante Base. De este modo clonas una voz sintética, lo que no plantea ningún problema de consentimiento.

#Paso 4: clonar una voz, con el consentimiento de su propietario

La variante Base reproduce un timbre a partir de un breve fragmento de audio y su transcripción. Bastan unos segundos de habla limpia para obtener una voz reconocible. Es la función más impresionante de la familia y la que exige mayor rigor incluso antes de escribir una sola línea de código.

!
Consentimiento: la regla, no la opción
La voz de una persona es un atributo de su personalidad, protegido en Francia en virtud del derecho a la privacidad (artículo 9 del Código Civil), y una grabación de voz es un dato personal en el sentido del RGPD. Clonar la voz de un tercero sin su consentimiento explícito y documentado te expone a responsabilidad civil, y penal si el uso es engañoso. Además, desde agosto de 2026, el reglamento europeo sobre IA exige indicar que un contenido de audio ha sido generado o manipulado artificialmente. Clona tu propia voz, la de una persona que haya dado su consentimiento por escrito para un uso concreto o una voz sintética creada con VoiceDesign. Nada más.

Para preparar la referencia, graba una frase de cinco a diez segundos en un lugar tranquilo, sin música de fondo ni reverberación, hablando con naturalidad. Transcríbela palabra por palabra, incluida la puntuación: ese es el texto que el modelo alinea con el audio para aprender el timbre. Un archivo WAV mono es el formato más seguro.

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)

El repositorio documenta dos usos avanzados útiles en producción. Primero, la posibilidad de precalcular de una vez la «huella» de la voz de referencia y reutilizarla después en cada frase sin volver a cargar el audio: eso es lo necesario para un lector de documentos o un asistente que habla de forma continua. Después, un modo en el que solo se utiliza la huella del hablante, sin la transcripción; es más rápido, pero menos fiel. Los nombres exactos de estos parámetros figuran en el README; cambiaron entre las primeras versiones del paquete, de ahí la importancia de leer la documentación instalada en lugar de un tutorial obsoleto.

Lo que mejora el resultado
Una referencia limpia, una transcripción exacta, un idioma forzado en lugar de «Auto» y un texto de destino puntuado (el modelo respira en las comas y los puntos).
Lo que lo empeora
Ruido de fondo, una referencia demasiado corta o demasiado larga, un susurro, una transcripción aproximada y cifras escritas con números en vez de letras en los casos ambiguos.
Lo que hay que documentar
Quién dio su consentimiento, para qué uso, en qué fecha y dónde se conserva la grabación. Un simple archivo de texto junto a la referencia basta para un proyecto personal; para un uso profesional, hace falta un registro de tratamiento real.

#Paso 5: interfaz web y servidor

El paquete instala una demo de Gradio desde la línea de comandos, práctica para probar las voces y las indicaciones sin escribir un script. Carga un modelo al iniciarse y muestra una página web local.

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

Mantén la dirección de escucha en 127.0.0.1 mientras la máquina no esté protegida: Gradio no autentica a nadie de forma predeterminada, y exponer una interfaz de clonación de voz en una red no es algo trivial. Si necesitas acceder desde otro equipo, utiliza un túnel SSH o un proxy inverso con autenticación, como con cualquier servicio local.

Para una integración en una aplicación, el equipo Qwen recomienda vLLM-Omni, la extensión multimodal de vLLM, que permite servir el modelo con una API HTTP y una salida en flujo (el sonido empieza a salir antes de que termine la generación). Es la vía que conviene estudiar para un asistente de voz en el que la latencia sea importante; para generar archivos de audio por lotes, basta con el script de Python directo y se evita añadir otra capa.

#Apple Silicon y Windows: vías comunitarias, indicadas como tales

El repositorio oficial documenta Linux con CUDA. En las demás plataformas, lo que sigue pertenece al ecosistema comunitario: no hemos verificado estas vías personalmente y su estado cambia de un mes a otro.

Mac Apple Silicon
El paquete oficial se basa en PyTorch; puedes intentar device_map="mps" con dtype float16 o float32 (bfloat16 no siempre es compatible con MPS), contando con que puede haber operaciones no compatibles. La opción más natural en Mac es un port de MLX: el proyecto comunitario mlx-audio ha anunciado compatibilidad con Qwen3-TTS. Comprueba en su repositorio qué variantes están cubiertas y con qué nivel de madurez antes de comprometerte.
Windows nativo
PyTorch con CUDA se instala normalmente, pero FlashAttention es difícil de compilar en Windows: déjalo de lado y utiliza la atención predeterminada. Algunas dependencias de audio requieren binarios del sistema (ffmpeg en el PATH, por ejemplo). Circulan instaladores de terceros «de un clic»; a menudo incluyen una versión fija del paquete, así que debes leer qué instalan.
Windows mediante WSL2
Es la vía más cercana a la documentación oficial: una distribución de Ubuntu bajo WSL2 con el controlador NVIDIA reciente de Windows detecta la GPU y sigue exactamente los comandos de esta guía. El coste es añadir una capa y acceder a los archivos de Windows con algo más de lentitud.
i
Formatos cuantizados
A diferencia de los modelos de texto, no existe una ruta Ollama ni un GGUF oficial para Qwen3-TTS: la síntesis de voz utiliza un códec de audio que llama.cpp no gestiona tal cual. Pueden aparecer conversiones comunitarias; considéralas experimentales mientras el repositorio QwenLM no las incluya como referencia.

#Solución de problemas

CUDA out of memory al cargar
Otro proceso está ocupando la tarjeta (Ollama, un navegador con aceleración, una sesión de Stable Diffusion). Compruébalo con nvidia-smi, libera memoria o cambia a la variante 0,6B.
Descarga interrumpida o repositorio no encontrado
Comprueba el identificador exacto del modelo en la página de Hugging Face de la organización Qwen; los nombres de las variantes pueden haber cambiado desde la redacción. Una descarga parcial se reanuda al volver a ejecutar el script.
Error de import liée en transformers o torch
Conflicto de versiones con otro proyecto instalado en el mismo entorno. Crea de nuevo un entorno virtual limpio y reinstala únicamente qwen-tts y soundfile.
Pronunciación extraña en francés
Fuerza language="French" en lugar de «Auto», escribe los números con letras cuando la lectura sea ambigua y utiliza signos de puntuación. Las siglas se leen mejor separadas por puntos o espacios.
El clon no se parece a la referencia
Vuelve a grabar la referencia en un lugar silencioso, verifica la transcripción palabra por palabra y prueba la 1,7B si estabas usando la 0,6B. Un fragmento demasiado largo no ayuda: unos pocos segundos de voz nítida valen más que un minuto con ruido.
Silencio o archivo vacío
Comprueba que escribes exactamente wavs[0] y no la lista completa, y que la frecuencia de muestreo devuelta por el modelo es la que se pasó a soundfile.
Lentitud extrema
Probablemente el modelo se está ejecutando en la CPU. La prueba torch.cuda.is_available() del paso 1 debe devolver True; de lo contrario, reinstala PyTorch con la versión de CUDA correspondiente a tu controlador.

#Para ir más allá

Qwen3-TTS cubre la parte de «hablar» de una cadena de voz local. Para la otra mitad, la comprensión, y para compararlo con modelos de síntesis más ligeros, el sitio ya trata varios temas relacionados. Las versiones de los paquetes y modelos citados en esta guía son las del repositorio QwenLM/Qwen3-TTS en el momento de redactarla; en caso de discrepancia, prevalecen el repositorio y las fichas de Hugging Face.

Kokoro TTS: una voz local convincente y ligera
El modelo de 82 millones de parámetros que habla más rápido que el tiempo real en un procesador, sin clonación. La opción adecuada cuando la frugalidad prima sobre la expresividad. https://quelllm.fr/guide/kokoro-tts-voix-locale
Asistente de voz 100 % local: Whisper + Ollama + Piper
La cadena completa: escucha, razonamiento y respuesta hablada. Qwen3-TTS puede sustituir a Piper para la síntesis si tu GPU lo permite. https://quelllm.fr/guide/assistant-vocal-local-whisper-piper
Ficha del modelo Voxtral 4B TTS
El otro modelo europeo reciente de síntesis de voz abierta, para situar Qwen3-TTS en el panorama sin una comparación cuantitativa. https://quelllm.fr/modele/voxtral-4b-tts
¿Esta guía te ha ayudado?

¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.