Kaggle indique une base de 30 heures par semaine, susceptible d’être supérieure selon la demande et les ressources disponibles. Le quota se réinitialise le samedi à 00:00 UTC.
GUIDE PRATIQUE · PIPER TTS
Des enregistrements
à une voix.
Les étapes essentielles pour préparer vos données vocales et entraîner un modèle Piper. Les limites Kaggle peuvent évoluer : vérifiez votre quota avant un long entraînement.
Créer un jeu de données LJSpeech pour Piper TTS
LJSpeech est le format standard attendu par Piper. Chaque phrase est un fichier WAV séparé, associé à sa transcription dans metadata.csv.
data.zip
├── metadata.csv # nom_du_fichier|transcription
└── wavs/
├── 000001.wav
└── ...- 01
Récupérer les fichiers audio
Utilisez des enregistrements que vous pouvez traiter et redistribuer. Les sources peuvent être des wikis de jeux, des médias que vous possédez, ou des jeux de données publics.
Chercher des jeux LJSpeech sur Hugging Face ↗Télécharger une source vidéo avec yt-dlp - 02
Découper en phrases
Préparez un fichier WAV par phrase. Pour le découpage automatique ou l’alignement, vous pouvez utiliser :
- audiosplitter · découpage automatique
- Montreal Forced Aligner (MFA) · alignement forcé
- faster-whisper + VAD · transcription et horodatages
- Audacity · découpage manuel pour les petits volumes
- 03
Créer metadata.csv
Une ligne par fichier. Le séparateur est une barre verticale ; le nom doit correspondre exactement au fichier présent dans wavs/.
000001.wav|Ceci est une phrase d'exemple. 000002.wav|Voici une autre phrase pour l'entraînement. - 04
Compresser l’archive
Placez metadata.csv et le dossier wavs/ à la racine de l’archive.
zip -r data.zip metadata.csv wavs/ - 05
Téléverser sur Hugging Face
Créez un dépôt de jeu de données, par exemple user/wheatley-english-ljspeech. Ajoutez data.zip et un README.md contenant la configuration :
--- configs: - config_name: default data_files: - split: train path: data.zip --- - 06
Publier sur le forum Piper
Créez un fil dans le canal de jeux de données et d’entraînement avec le lien Hugging Face et le tag approprié.
Ouvrir le canal Discord ↗
Entraîner une voix sur Kaggle
Le quota GPU est attribué par Kaggle au compte et peut varier selon la disponibilité. Consultez le compteur avant de lancer une session longue.
La documentation Kaggle indique une limite continue de 12 heures pour les sessions CPU et GPU. Un notebook CPU ne consomme pas le quota GPU, mais sa durée de session reste limitée.
Kaggle a retiré le Tesla P100 le 15 septembre 2026. Le T4 x2 reste proposé dans les notebooks ; choisissez-le pour l’entraînement Piper plutôt que de suivre d’anciens guides P100.
Reprendre après une coupure
Un entraînement complet dépasse souvent les 12 heures d’une session. Le notebook Piper de ce projet reprend depuis un checkpoint Hugging Face : après une coupure ou un quota épuisé, relancez-le pour continuer depuis le dernier checkpoint enregistré.
Avant un entraînement long
- Vérifiez le quota restant dans les paramètres du notebook, votre profil ou la page d’usage des accélérateurs.
- Arrêtez les sessions GPU quand vous ne les utilisez pas.
- Utilisez le T4 x2 ; le P100 n’est plus disponible sur Kaggle.
Les quotas, accélérateurs et interfaces de Kaggle peuvent changer. Vérifiez toujours les informations affichées dans votre compte avant un entraînement.
Utiliser une voix Piper
Installez Piper, récupérez les deux fichiers de la voix choisie, puis générez un WAV en local. Les commandes ci-dessous utilisent la version maintenue par Open Home Foundation.
- 01
Installer Piper
Piper est distribué comme paquet Python. Les anciens guides qui utilisent le dépôt rhasspy/piper ou son archive binaire correspondent à la version historique.
python -m pip install piper-ttspython -m piper.download_voices en_US-lessac-medium - 02
Télécharger une voix
Choisissez une voix dans le catalogue puis téléchargez son modèle ONNX et son fichier de configuration JSON associé. Gardez les deux fichiers ensemble ; le chemin JSON est le chemin du modèle suivi de .json.
voice.onnx
voice.onnx.json - 03
Générer un fichier WAV
Téléchargez d’abord une voix depuis le catalogue Piper, ou remplacez le nom ci-dessous par le chemin de votre fichier .onnx.
python -m piper -m ./voice.onnx -f output.wav -- "Bonjour, ceci est un test." - 04
Lire le texte depuis un fichier
python -m piper -m ./voice.onnx -f output.wav --input-file mon_texte.txtLire le son en sortie directe
La fréquence d’échantillonnage dépend de la voix. Vérifiez voice.onnx.json et remplacez 22050 si nécessaire.
echo "Bonjour." | python -m piper -m ./voice.onnx --output-raw | aplay -r 22050 -f S16_LE -c 1 -t raw - 05
Depuis 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) - 06
Avec Home Assistant
Piper s’intègre à Home Assistant via Wyoming. Ajoutez Piper dans Paramètres → Appareils et services, puis utilisez l’action tts.speak avec l’entité TTS Piper.
Configurer Piper dans Home Assistant ↗Avec Node-RED
Le paquet node-red-contrib-piper-tts cité dans certains guides n’est pas confirmé dans le catalogue public. Une option consiste à appeler la commande Piper depuis le nœud Exec intégré ; adaptez les chemins et droits d’accès à votre installation.
- 07
Ajuster le rendu
La qualité dépend notamment des données d’entraînement et de la voix choisie. Une valeur length-scale plus élevée ralentit la parole ; une valeur plus basse l’accélère. noise-scale et noise-w modifient la variation de la génération.
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."
Intégrer Piper dans un projet Node.js avec pipertts
pipertts expose Piper dans Node.js, avec écriture de fichiers ou retour audio en mémoire. Le mode recommandé est PiperNativeTTS : inférence 100 % native en processus (ONNX + pont espeak compilé), sans Python, environ 10 fois plus rapide que le wrapper. Les voix (.onnx + .onnx.json) restent des fichiers séparés.
- 01
Installer les dépendances
La documentation annonce Node.js 18+ et TypeScript 5+. Le mode natif ne demande rien d’autre : un npm install suffit. Le mode wrapper classique (PiperTTS via python3 -m piper) exige en plus Python et le module Piper. La sélection par identifiant de catalogue peut télécharger le modèle et sa configuration dans models/.
npm install pipertts # mode wrapper uniquement : python3 -m pip install piper-tts - 02
Démarrage avec une voix du catalogue
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); - 03
Utiliser un modèle local
Pour une voix téléchargée manuellement, passez le chemin du fichier ONNX. Le fichier .onnx.json associé doit être placé à côté ; vous pouvez préciser configPath si son emplacement diffère.
import { PiperNativeTTS } from "pipertts"; const tts = await PiperNativeTTS.load({ modelPath: "./models/my-voice.onnx", }); const { audio, sampleRate } = await tts.synthesize("Hello.", { speakerId: 0 }); - 04
API et formats
synthesize() retourne audio (Buffer), sampleRate et text ; outputFile écrit aussi sur disque. Options : speakerId (multi-voix et multi-styles), lengthScale (> 1 ralentit, < 1 accélère), noiseScale, noiseWScale, sentenceSilence, normalizeAudio, volume et outputFormat (wav, raw, mp3, ogg ou opus). mp3 et opus ont des solutions JS pures ; ogg demande FFmpeg. phonemize() et synthesizeChunks() donnent accès au bas niveau, phrase par phrase.
- 05
Wrapper legacy (PiperTTS)
PiperTTS lance python3 -m piper, un processus par synthèse : environ 10 fois plus lent, à réserver aux environnements où le moteur natif ne tourne pas. Exige Python et le module 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");
