1. Introducción
Si en la guía de whisper.cpp convertíamos voz en texto (STT, speech-to-text), aquí vamos a hacer justo lo contrario: convertir texto en voz (TTS, text-to-speech). Para ello usaremos qwentts.cpp, un motor de inferencia (al estilo de llama.cpp) que permite ejecutar en local el modelo Qwen3-TTS sin necesidad de Python, conexión a internet o suscripciones de pago:
Qwen3-TTS es un modelo de la familia Qwen (Alibaba), que es uno de los TTS abiertos más populares y potentes. Entre sus características principales se encuentran:
- 10 idiomas principales: Disponible como inglés, español, chino, japonés, coreano, etc...
- Modalidad Base: Clonación de una sola vez en pocos segundos.
- Modalidad CustomVoice: 9 voces premium y control de estilo por instrucciones
- Modalidad VoiceDesign: Permite diseñar una voz desde una descripción de texto.
- Modelos pequeño de 0.6B parámetros y otro un poco más grande de 1.7B parámetros.
- Licencia Apache 2.0: Mucho más permisivo que otras licencias como la de Fish S2 Pro.
¿Para qué puede interesar?
- 🎙️ Narración: pasar artículos, guiones o libros a audio sin pagar servicios de pago.
- 🗣️ Clonación de voz: doblar tus propios vídeos con tu voz (o voces consistentes para personajes).
- 🎭 Diseño de voces: crear una voz (
hombre joven, tono grave y pausado) sin grabar nada. - 🤖 Agentes locales: darle voz a un asistente junto a
llama.cpp+whisper.cpp.
Requisitos:
| Detalle | Mínimo | Recomendado |
|---|---|---|
| 🧠 RAM | 8 GB | 16 GB |
| 🎮 GPU/VRAM | CPU (0.6B) o 4 GB VRAM |
6 GB+ VRAM (0.6B o 1.7B) |
| 💾 Disco | 3 GB (talker 1.7B + tokenizer) |
10 GB (varios modos/cuantizaciones) |
Necesitaremos seguir estos pasos que explicaremos a continuación:
- Compilar
qwentts.cppcon el script adecuado para nuestra GPU - Descargar un modelo talker y el tokenizer
- Sintetizar audios desde CLI o clonar voces
2. Instalación
En el momento de escribir esta guía, qwentts.cpp no tiene releases precompiladas, así que lo normal es descargar y compilarlo, seleccionando el backend más apropiado para nuestro caso (dependiendo de la GPU que tengas):
sudo apt update
sudo apt install -y git build-essential cmake
git clone --recurse-submodules https://github.com/ServeurpersoCom/qwentts.cpp.git
cd qwentts.cpp
Elegir backend
Elige el script según tu tarjeta gráfica (GPU). Si tienes Nvidia, usa CUDA; si tienes AMD/Intel, usa Vulkan. Si no tienes una buena GPU, puedes usar perfectamente CPU, ya que los modelos son pequeños (0.6B o 1.7B):
| Backend | Script | Nvidia | AMD | Observaciones |
|---|---|---|---|---|
| CUDA (Nvidia) | ./buildcuda.sh |
✅ | ❌ | Máximo rendimiento en NVIDIA. |
| Vulkan | ./buildvulkan.sh |
✅ | ✅ | Multiplataforma (NVIDIA/AMD/Intel). |
| CPU/RAM | ./buildcpu.sh |
— | — | Sin GPU. Aceptable con el modelo 0.6B. |
| Todos | ./buildall.sh |
✅ | ✅ | Todos los backends, carga dinámica en ejecución. |
Necesitas drivers actualizados (nvidia-smi debe detectar tu GPU) y el CUDA Toolkit para compilar.
./buildcuda.sh
Si un GCC muy nuevo, si falla nvcc usa NVCC_CCBIN=g++-13 ./buildcuda.sh.
Instala Vulkan y compila con su script:
sudo apt install -y vulkan-tools libvulkan-dev glslc
./buildvulkan.sh
Sin GPU:
./buildcpu.sh
Una vez termine, comprueba que todo ha ido bien. Tendrás un ejecutable qwen-tts generado en build/:
./build/qwen-tts --help
Si muestra una pantalla de ayuda con las opciones (--model, --codec, --lang, --ref-wav...), ha ido todo bien. Los otros dos binarios generados son:
- 1️⃣
qwen-codecPre-codificar referencias - 2️⃣
tts-server: Modo servidor
En macOS usa Metal (incluido en los scripts) y en Windows se recomienda WSL. También tienes imágenes de Docker publicadas en cada release.
3. Descarga de modelos
Los pesos GGUF de los modelos no vienen al clonar el repositorio. Están en Serveurperso/Qwen3-TTS-GGUF, que son versiones cuantizadas de las oficiales Qwen/Qwen3-TTS-12Hz-*.
En primer lugar, necesitas dos ficheros: el talker y el tokenizer. Todos los modelos (salvo voicedesign) están en dos tamaños disponibles (0.6B y 1.7B):
| Modo | Para qué |
|---|---|
base |
Clonación rápida desde un audio de referencia con --ref-wav y --ref-text. |
customvoice |
9 voces premium integradas con --speaker y control de estilo por tags. |
voicedesign |
Crear voces desde una descripción en texto con --instruct. Sólo 1.7B. |
Cada uno de estos modelos tiene 4 cuantizaciones disponibles, elige la que se adapte mejor a tu caso concreto (dependiendo de tu hardware):
| Variante | 0.6B | 1.7B | Tokenizer | Para quién |
|---|---|---|---|---|
F32 |
~3.6GB |
~7.7GB |
647MB |
Calidad ultra-alta. |
BF16 |
~1.8GB |
~3.8GB |
360MB |
Fidelidad y calidad muy alta. |
Q8_0 |
~1GB |
2.1GB |
291MB |
Buen equilibrio (Recomendado). ✅ |
Q4_K_M |
629MB |
1.2GB |
255MB |
Menor calidad, menor consumo de GPU. |
Para empezar, puedes bajar el base 1.7B Q8_0 y el tokenizer BF16 a la carpeta models/. Puedes hacerlo manualmente desde la web anterior o mediante código utilizando este script:
mkdir -p models
pip install -U huggingface_hub
huggingface-cli download Serveurperso/Qwen3-TTS-GGUF \
qwen-talker-1.7b-base-Q8_0.gguf qwen-tokenizer-12hz-Q8_0.gguf \
--local-dir models
Si después también quieres voces integradas (o diseño de voces), añade estos talkers:
huggingface-cli download Serveurperso/Qwen3-TTS-GGUF \
qwen-talker-1.7b-customvoice-Q8_0.gguf \
qwen-talker-1.7b-voicedesign-Q8_0.gguf \
--local-dir models
¿
0.6Bo1.7B? El0.6Bes más rápido y cabe en casi cualquier GPU/CPU. El1.7Bclona mejor y pronuncia mejor en español. Si tu equipo puede, empieza directamente con el1.7B, si tu hardware es limitado, usa0.6B.
4. Uso básico a través de CLI
El binario principal es qwen-tts. Para utilizarlo, como mínimo debes indicar:
- 1️⃣ Con el parámetro
--modelindica la ruta del modelo talker. - 2️⃣ Con el parámetro
--codecindica la ruta del modelo tokenizer. - 3️⃣ Con el parámetro
--langle indicas el idioma. - 4️⃣ Con el parámetro
-ole indicas el archivo de audio que se generará. - 5️⃣ Por último, con
< prompt.txtindicamos un fichero con el texto a generar.
En resumen:
./build/qwen-tts \
--model models/qwen-talker-1.7b-base-Q8_0.gguf \
--codec models/qwen-tokenizer-12hz-Q8_0.gguf \
--lang Spanish \
-o out.wav < prompt.txt
Se creará un archivo out.wav con el texto de prompt.txt leído por el sintetizador con la voz por defecto del modo base. Puedes utilizar idiomas como Chinese, English, Japanese, Korean, German, French, Russian, Portuguese, Spanish o Italian.
5. Voces predefinidas
Qwen ya incorpora voces listas para utilizar. Para ello, utilizaremos el modelo talker customvoice, donde tienes 9 voces premium que puedes seleccionar con --speaker:
./build/qwen-tts \
--model models/qwen-talker-1.7b-customvoice-Q8_0.gguf \
--codec models/qwen-tokenizer-12hz-Q8_0.gguf \
--speaker vivian \
--lang Spanish -o vivian.wav < prompt.txt
| Speaker | Descripción | Idioma nativo | Ejemplo (es) |
|---|---|---|---|
vivian |
Femenina joven, brillante. | Chino | |
serena |
Femenina joven, cálida y suave. | Chino | |
uncle_fu |
Masculina madura, grave. | Chino | |
ryan |
Masculina dinámica, rítmica. | Inglés | |
aiden |
Masculina americana, clara. | Inglés | |
ono_anna |
Femenina japonesa, juguetona. | Japonés | |
sohee |
Femenina coreana, cálida. | Coreano | |
eric |
Masculina de Chengdu (dialecto Sichuán). | Chino (Sichuán) | |
dylan |
Masculina joven de Pekín (dialecto Pekín). | Chino (Pekín) |
Cada voz puede hablar cualquier idioma, pero suele sonar mejor en su idioma nativo.
6. Crear voces
Con el talker voicedesign (sólo disponible en versión de 1.7B) puedes describir la voz que quieres conseguir indicando un prompt con --instruct. Esto nos permite diseñar voces a medida:
./build/qwen-tts \
--model models/qwen-talker-1.7b-voicedesign-Q8_0.gguf \
--codec models/qwen-tokenizer-12hz-Q8_0.gguf \
--instruct "male, young adult, moderate pitch, calm narration style" \
--lang Spanish -o voz.wav < prompt.txt
Veamos estas tres voces de ejemplo que he diseñado con un prompt simple:
Prompt con --instruct | Descripción | Ejemplo |
|---|---|---|
male, adult, cinematic calm narration |
Masculina, narrador. | |
female, child, spanish funny style |
Niña, alegre. | |
male, sad, cries, tears, sight, snif |
Hombre, triste. |
Truco útil: diseña una voz, genera una frase corta de referencia y luego úsala como clon (siguiente apartado) para tener un personaje consistente sin recalcular voces cada vez.
7. Clonar voces
Una de las funcionalidades más interesantes (y sorprendentes) es la posibilidad de crear voces basadas en un audio de referencia. Con apenas 5-30 segundos de voz puedes crear voces bastante similares y realistas.
Para ello, necesitas utilizar el modelo base e indicar el audio de referencia con --ref-wav y un fichero de texto con su transcripción con --ref-text:
./build/qwen-tts \
--model models/qwen-talker-1.7b-base-Q8_0.gguf \
--codec models/qwen-tokenizer-12hz-Q8_0.gguf \
--ref-wav referencia.wav --ref-text referencia.txt \
--lang Spanish -o clon.wav < prompt.txt
Es importante tener en cuenta lo siguiente:
- 1️⃣ En
ref.txttenemos la transcripción exacta de lo que se dice en el audio de referencia. - 2️⃣ En
prompt.txttenemos el nuevo texto que sintetizaremos con la voz personalizada. - ✅ El audio de referencia debe escucharse limpio y tener sólo la voz de la persona.
- ✅ La transcripción debe ser literal y en el mismo idioma que el audio de referencia.
Re-codificar la referencia cada vez que sintetizamos y generamos un mensaje de voz sería lento. Con qwen-codec podemos pre-codificarla y aprovechar ese trabajo para hacerlo más rápido en siguientes pasadas.
Con esto generamos un ref.spk y un ref.rvq:
./build/qwen-codec \
--model models/qwen-tokenizer-12hz-Q8_0.gguf \
--talker models/qwen-talker-1.7b-base-Q8_0.gguf \
-i ref.wav
Luego, hacemos lo siguiente:
./build/qwen-tts \
--model models/qwen-talker-1.7b-base-Q8_0.gguf \
--codec models/qwen-tokenizer-12hz-Q8_0.gguf \
--ref-spk ref.spk --ref-rvq ref.rvq --ref-text ref.txt \
--lang Spanish -o clon2.wav < prompt.txt
Como puedes ver, hemos utilizar --ref-spk y --ref-rvq para cargar los perfiles de voz sin tener que volver a repetir ese paso en cada generación de audio. De esta forma, aceleramos la síntesis de voz.
NOTA: Usa siempre voces propias o con consentimiento del autor. Clonar voces de terceros sin permiso está prohibido, vulnera derechos de autor y puede ser ilegal.
8. Server mode
Una funcionalidad interesante de qwen-tts es la posibilidad de levantarlo en modo servidor. Si lo vas a utilizar para generar múltiples audios continuamente, es mejor cargar el modelo en memoria y, sin descargarlo, ir atendiendo peticiones y generar los audios que correspondan.
Para ello, utilizaremos tts-server. Proporciona una API compatible con OpenAI (mediante http://localhost:8080/v1/audio/speech) sólo con arrancarlo:
./build/tts-server \
--model models/qwen-talker-1.7b-base-Q8_0.gguf \
--codec models/qwen-tokenizer-12hz-Q8_0.gguf \
--alias qwen3-tts-base --port 8080
Veamos un ejemplo de petición utilizando curl con peticiones POST:
curl -X POST localhost:8080/v1/audio/speech -H "Content-Type: application/json" \
-d '{"input":"Hola mundo.","language":"Spanish","response_format":"wav","seed":42}' \
-o output.wav
Recuerda
- Los modelos de
Qwen TTSson pequeños y rápidos, pero si usas CPU, usa0.6B. - Necesitas el talker correcto según caso de uso:
base,customvoiceyvoicedesign. - La calidad del clon depende totalmente de la referencia. Usa referencias de buena calidad.

