GUÍA PRÁCTICA · PIPER TTS

De las grabaciones
a una voz.

Los pasos esenciales para preparar tus datos de voz y entrenar un modelo Piper. Los límites de Kaggle pueden cambiar: revisa tu cuota antes de un entrenamiento largo.

01ESTRUCTURA DEL ARCHIVO

Crear un dataset LJSpeech para Piper TTS

LJSpeech es el formato estándar que espera Piper. Cada frase es un archivo WAV separado, con su transcripción en metadata.csv.

data.zip
├── metadata.csv   # nom_du_fichier|transcription
└── wavs/
    ├── 000001.wav
    └── ...
  1. 01

    Conseguir los archivos de audio

    Usa grabaciones que puedas procesar y redistribuir. Las fuentes pueden ser wikis de juegos, medios propios o datasets públicos.

  2. 02

    Recortar por frases

    Prepara un archivo WAV por frase. Para el recorte automático o la alineación puedes usar:

    • audiosplitter · recorte automático
    • Montreal Forced Aligner (MFA) · alineación forzada
    • faster-whisper + VAD · transcripción y marcas de tiempo
    • Audacity · recorte manual para volúmenes pequeños
  3. 03

    Crear metadata.csv

    Una línea por archivo. El separador es una barra vertical; el nombre debe coincidir exactamente con el archivo en wavs/.

    000001.wav|Esta es una frase de ejemplo.
    000002.wav|Aquí tienes otra frase para el entrenamiento.
  4. 04

    Comprimir el archivo

    Coloca metadata.csv y la carpeta wavs/ en la raíz del archivo.

    zip -r data.zip metadata.csv wavs/
  5. 05

    Subir a Hugging Face

    Crea un repositorio de dataset, por ejemplo user/wheatley-english-ljspeech. Añade data.zip y un README.md con esta configuración:

    ---
    configs:
    - config_name: default
      data_files:
      - split: train
        path: data.zip
    ---
  6. 06

    Publicar en el foro de Piper

    Crea un hilo en el canal de datasets y entrenamiento con el enlace de Hugging Face y la etiqueta adecuada.

    Abrir el canal de Discord ↗
02KAGGLE · GPU

Entrenar una voz en Kaggle

Kaggle asigna la cuota de GPU a tu cuenta y puede variar según la disponibilidad. Revisa el contador antes de lanzar una sesión larga.

Cuota semanal de GPU30 h · a veces más

Kaggle indica una base de 30 horas por semana, que puede ser mayor según la demanda y los recursos disponibles. La cuota se restablece el sábado a las 00:00 UTC.

Duración máxima de una sesión12 horas

La documentación de Kaggle indica un límite continuo de 12 horas para las sesiones de CPU y GPU. Un notebook solo de CPU no consume cuota de GPU, pero su duración sigue limitada.

Acelerador disponibleT4 x2

Kaggle retiró el Tesla P100 el 15 de septiembre de 2026. El T4 x2 sigue disponible en los notebooks; elígelo para entrenar Piper en lugar de seguir guías antiguas del P100.

↻

Continuar tras un corte

Un entrenamiento completo suele superar las 12 horas de una sesión. El notebook Piper de este proyecto continúa desde un checkpoint de Hugging Face: tras un corte o una cuota agotada, vuelve a lanzarlo para seguir desde el último checkpoint guardado.

Antes de un entrenamiento largo

  • Revisa la cuota restante en los ajustes del notebook, en tu perfil o en la página de uso de aceleradores.
  • Detén las sesiones de GPU cuando no las uses.
  • Usa el T4 x2; el P100 ya no está disponible en Kaggle.

Las cuotas, los aceleradores y las interfaces de Kaggle pueden cambiar. Revisa siempre la información de tu cuenta antes de entrenar.

03PIPER · LOCAL TTS

Usar una voz Piper

Instala Piper, consigue los dos archivos de la voz elegida y genera un WAV en local. Los comandos siguientes usan la versión mantenida por Open Home Foundation.

  1. 01

    Instalar Piper

    Piper se distribuye como paquete Python. Las guías antiguas que usan el repositorio rhasspy/piper o su archivo binario corresponden a la versión histórica.

    python -m pip install piper-tts
    python -m piper.download_voices en_US-lessac-medium
  2. 02

    Descargar una voz

    Elige una voz del catálogo y descarga su modelo ONNX y su archivo de configuración JSON asociado. Guarda ambos archivos juntos; la ruta JSON es la ruta del modelo seguida de .json.

    voice.onnx
    voice.onnx.json
  3. 03

    Generar un archivo WAV

    Descarga primero una voz del catálogo Piper, o sustituye el nombre siguiente por la ruta de tu archivo .onnx.

    python -m piper -m ./voice.onnx -f output.wav -- "Bonjour, ceci est un test."
  4. 04

    Leer el texto desde un archivo

    python -m piper -m ./voice.onnx -f output.wav --input-file mon_texte.txt

    Escuchar el sonido en salida directa

    La frecuencia de muestreo depende de la voz. Revisa voice.onnx.json y cambia 22050 si hace falta.

    echo "Bonjour." | python -m piper -m ./voice.onnx --output-raw | aplay -r 22050 -f S16_LE -c 1 -t raw
  5. 05

    Desde Python

    import wave
    from piper import PiperVoice
    
    voice = PiperVoice.load("./voice.onnx")
    with wave.open("output.wav", "wb") as wav_file:
        voice.synthesize_wav("Bonjour le monde.", wav_file)
  6. 06

    Con Home Assistant

    Piper se integra en Home Assistant mediante Wyoming. Añade Piper en Ajustes → Dispositivos y servicios y usa luego la acción tts.speak con la entidad TTS de Piper.

    Configurar Piper en Home Assistant ↗

    Con Node-RED

    El paquete node-red-contrib-piper-tts citado en algunas guías no aparece confirmado en el catálogo público. Una opción es llamar al comando Piper desde el nodo Exec integrado; adapta rutas y permisos a tu instalación.

  7. 07

    Ajustar el resultado

    La calidad depende en parte de los datos de entrenamiento y de la voz elegida. Un valor length-scale más alto ralentiza el habla; uno más bajo la acelera. noise-scale y noise-w modifican la variación de la generación.

    python -m piper -m ./voice.onnx --length-scale 1.5 --noise-scale 0.667 --noise-w 0.8 -f lent.wav -- "Texte lent."
    python -m piper -m ./voice.onnx --length-scale 0.7 --noise-scale 0.667 --noise-w 0.8 -f rapide.wav -- "Texte rapide."
04NODE.JS · TYPESCRIPT

Integrar Piper en un proyecto Node.js con pipertts

pipertts lleva Piper a Node.js, con escritura de archivos o audio en memoria. El modo recomendado es PiperNativeTTS: inferencia 100 % nativa en proceso (ONNX más puente espeak compilado), sin Python, unas 10 veces más rápida que el wrapper. Las voces (.onnx más .onnx.json) siguen siendo archivos separados.

  1. 01

    Instalar las dependencias

    La documentación anuncia Node.js 18+ y TypeScript 5+. El modo nativo no pide nada más: basta un npm install. El modo wrapper clásico (PiperTTS con python3 -m piper) exige además Python y el módulo Piper. La selección por identificador de catálogo puede descargar el modelo y su configuración en models/.

    npm install pipertts
    # mode wrapper uniquement : python3 -m pip install piper-tts
  2. 02

    Inicio rápido con una voz del catálogo

    import { PiperNativeTTS, resolveModelPathFromOptions } from "pipertts";
    import * as fs from "node:fs";
    
    const modelPath = await resolveModelPathFromOptions({
      model: "en_US-lessac-medium",
      modelsDir: "./models",
    });
    const tts = await PiperNativeTTS.load({ modelPath });
    
    const { audio } = await tts.synthesize("Hello from Piper.");
    fs.writeFileSync("./hello.wav", audio);
  3. 03

    Usar un modelo local

    Para una voz descargada a mano, pasa la ruta del archivo ONNX. Su archivo .onnx.json asociado debe estar al lado; puedes indicar configPath si está en otro lugar.

    import { PiperNativeTTS } from "pipertts";
    
    const tts = await PiperNativeTTS.load({
      modelPath: "./models/my-voice.onnx",
    });
    const { audio, sampleRate } = await tts.synthesize("Hello.", { speakerId: 0 });
  4. 04

    API y formatos

    synthesize() devuelve audio (Buffer), sampleRate y text; outputFile también escribe en disco. Opciones: speakerId (varias voces y estilos), lengthScale (> 1 ralentiza, < 1 acelera), noiseScale, noiseWScale, sentenceSilence, normalizeAudio, volumen y outputFormat (wav, raw, mp3, ogg u opus). mp3 y opus tienen soluciones JS puras; ogg pide FFmpeg. phonemize() y synthesizeChunks() dan acceso de bajo nivel, frase por frase.

  5. 05

    Wrapper heredado (PiperTTS)

    PiperTTS lanza python3 -m piper, un proceso por síntesis: unas 10 veces más lento, solo para entornos donde el motor nativo no funciona. Exige Python y el módulo Piper.

    import { PiperTTS } from "pipertts";
    
    const tts = await PiperTTS.create({
      modelPath: "./models/en_US-lessac-medium.onnx",
    });
    await tts.synthesizeToFile("Hello from the legacy wrapper.", "./hello.wav");