GUIA PRÁTICO · PIPER TTS

Das gravações
à voz.

As etapas essenciais para preparares os teus dados de voz e treinares um modelo Piper. Os limites do Kaggle podem mudar: verifica a tua cota antes de um treino longo.

01ESTRUTURA DO ARQUIVO

Criar um dataset LJSpeech para Piper TTS

LJSpeech é o formato padrão esperado pelo Piper. Cada frase é um ficheiro WAV separado, associado à sua transcrição em metadata.csv.

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

    Obter os ficheiros de áudio

    Usa gravações que possas processar e redistribuir. As fontes podem incluir wikis de jogos, multimédia que possuis ou datasets públicos.

  2. 02

    Dividir em frases

    Prepara um ficheiro WAV por frase. Para a divisão automática ou o alinhamento, podes usar:

    • audiosplitter · divisão automática
    • Montreal Forced Aligner (MFA) · alinhamento forçado
    • faster-whisper + VAD · transcrição e marcas temporais
    • Audacity · divisão manual para volumes pequenos
  3. 03

    Criar metadata.csv

    Uma linha por ficheiro. O separador é uma barra vertical; o nome deve corresponder exatamente ao ficheiro presente em wavs/.

    000001.wav|Esta é uma frase de exemplo.
    000002.wav|Aqui está outra frase para o treino.
  4. 04

    Comprimir o arquivo

    Coloca metadata.csv e a pasta wavs/ na raiz do arquivo.

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

    Enviar para Hugging Face

    Cria um repositório de dataset, por exemplo user/wheatley-english-ljspeech. Adiciona data.zip e um README.md com a configuração:

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

    Publicar no fórum Piper

    Cria um tópico no canal de datasets e treino com a ligação Hugging Face e a etiqueta adequada.

    Abrir o canal Discord ↗
02KAGGLE · GPU

Treinar uma voz no Kaggle

A cota de GPU é atribuída pelo Kaggle à conta e pode variar conforme a disponibilidade. Consulta o contador antes de iniciares uma sessão longa.

Cota semanal de GPU30 h · por vezes mais

O Kaggle indica uma base de 30 horas por semana, que pode ser superior conforme a procura e os recursos disponíveis. A cota é reposta ao sábado às 00:00 UTC.

Duração máxima de uma sessão12 horas

A documentação do Kaggle indica um limite contínuo de 12 horas para sessões de CPU e GPU. Um notebook só de CPU não consome a cota de GPU, mas a duração da sessão continua limitada.

Acelerador disponívelT4 x2

O Kaggle retirou o Tesla P100 em 15 de setembro de 2026. O T4 x2 continua disponível nos notebooks; escolhe-o para o treino Piper em vez de seguir guias antigos do P100.

↻

Retomar após uma interrupção

Um treino completo ultrapassa muitas vezes as 12 horas de uma sessão. O notebook Piper deste projeto retoma a partir de um checkpoint Hugging Face: após uma interrupção ou cota esgotada, reinicia-o para continuares desde o último checkpoint gravado.

Antes de um treino longo

  • Verifica a cota restante nas definições do notebook, no teu perfil ou na página de utilização de aceleradores.
  • Para as sessões de GPU quando não as estiveres a usar.
  • Usa o T4 x2; o P100 já não está disponível no Kaggle.

As cotas, aceleradores e interfaces do Kaggle podem mudar. Verifica sempre as informações apresentadas na tua conta antes de um treino.

03PIPER · LOCAL TTS

Usar uma voz Piper

Instala o Piper, obtém os dois ficheiros da voz escolhida e gera um WAV localmente. Os comandos abaixo usam a versão mantida pela Open Home Foundation.

  1. 01

    Instalar o Piper

    O Piper é distribuído como pacote Python. Os guias antigos que usam o repositório rhasspy/piper ou o seu arquivo binário correspondem à versão histórica.

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

    Descarregar uma voz

    Escolhe uma voz no catálogo e descarrega o seu modelo ONNX e o ficheiro de configuração JSON associado. Mantém os dois ficheiros juntos; o caminho JSON é o caminho do modelo seguido de .json.

    voice.onnx
    voice.onnx.json
  3. 03

    Gerar um ficheiro WAV

    Descarrega primeiro uma voz do catálogo Piper ou substitui o nome abaixo pelo caminho do teu ficheiro .onnx.

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

    Ler o texto a partir de um ficheiro

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

    Ler o som em saída direta

    A frequência de amostragem depende da voz. Verifica voice.onnx.json e substitui 22050 se necessário.

    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

    Com Home Assistant

    O Piper integra-se com Home Assistant via Wyoming. Adiciona o Piper em Definições → Dispositivos e serviços e usa a ação tts.speak com a entidade TTS Piper.

    Configurar o Piper no Home Assistant ↗

    Com Node-RED

    O pacote node-red-contrib-piper-tts citado em alguns guias não foi confirmado no catálogo público. Uma opção é chamar o comando Piper a partir do nó Exec integrado; adapta os caminhos e permissões à tua instalação.

  7. 07

    Ajustar a reprodução

    A qualidade depende, entre outros, dos dados de treino e da voz escolhida. Um valor length-scale mais alto torna a fala mais lenta; um valor mais baixo acelera-a. noise-scale e noise-w alteram a variação da geração.

    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 o Piper num projeto Node.js com pipertts

O pipertts expõe o Piper em Node.js, com escrita de ficheiros ou áudio em memória. O modo recomendado é PiperNativeTTS: inferência 100% nativa em processo (ONNX + ponte espeak compilada), sem Python, cerca de 10 vezes mais rápida que o wrapper. As vozes (.onnx + .onnx.json) continuam a ser ficheiros separados.

  1. 01

    Instalar as dependências

    A documentação anuncia Node.js 18+ e TypeScript 5+. O modo nativo não exige mais nada: basta um npm install. O modo wrapper clássico (PiperTTS via python3 -m piper) exige ainda Python e o módulo Piper. A seleção por identificador de catálogo pode descarregar o modelo e a sua configuração para models/.

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

    Início rápido com uma voz do 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 um modelo local

    Para uma voz descarregada manualmente, passa o caminho do ficheiro ONNX. O ficheiro .onnx.json associado deve estar ao lado; podes indicar configPath se a localização for diferente.

    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 e formatos

    synthesize() devolve audio (Buffer), sampleRate e text; outputFile também grava em disco. Opções: speakerId (várias vozes e estilos), lengthScale (> 1 torna mais lento, < 1 acelera), noiseScale, noiseWScale, sentenceSilence, normalizeAudio, volume e outputFormat (wav, raw, mp3, ogg ou opus). mp3 e opus têm soluções JS puras; ogg exige FFmpeg. phonemize() e synthesizeChunks() dão acesso de baixo nível, frase a frase.

  5. 05

    Wrapper legado (PiperTTS)

    O PiperTTS lança python3 -m piper, um processo por síntese: cerca de 10 vezes mais lento, a reservar para ambientes onde o motor nativo não funciona. Exige Python e o 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");