ManzGPU

TTS con voz personalizada

Hype-Generator 3000™: It's a game-changer

En esta guía aprenderás a utilizar Qwen TTS (mediante qwentts.cpp) para sintetizar textos en local clonando voces a partir de un audio de referencia

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:

Texto Referencia qwentts.cpp Audio WAV

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:

DetalleMínimoRecomendado
🧠 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.cpp con 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):

BackendScriptNvidiaAMDObservaciones
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-codec Pre-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):

ModoPara 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):

Variante0.6B1.7BTokenizerPara 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.6B o 1.7B? El 0.6B es más rápido y cabe en casi cualquier GPU/CPU. El 1.7B clona mejor y pronuncia mejor en español. Si tu equipo puede, empieza directamente con el 1.7B, si tu hardware es limitado, usa 0.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 --model indica la ruta del modelo talker.
  • 2️⃣ Con el parámetro --codec indica la ruta del modelo tokenizer.
  • 3️⃣ Con el parámetro --lang le indicas el idioma.
  • 4️⃣ Con el parámetro -o le indicas el archivo de audio que se generará.
  • 5️⃣ Por último, con < prompt.txt indicamos 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
SpeakerDescripciónIdioma nativoEjemplo (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 --instructDescripciónEjemplo
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.txt tenemos la transcripción exacta de lo que se dice en el audio de referencia.
  • 2️⃣ En prompt.txt tenemos 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 TTS son pequeños y rápidos, pero si usas CPU, usa 0.6B.
  • Necesitas el talker correcto según caso de uso: base, customvoice y voicedesign.
  • La calidad del clon depende totalmente de la referencia. Usa referencias de buena calidad.