Pocket TTS en espagnol d'Espagne : une voix qui tourne sur CPU
Nous avons affiné Pocket TTS de Kyutai pour l'espagnol d'Espagne. Il tourne sur un CPU ordinaire, avec des extraits en quatre langues.
Il nous fallait une voix pour des narrations, des vidéos de démo et des visites guidées du produit, en anglais et en espagnol. Nous ne voulions pas louer un GPU pour ça : une narration, c'est quelques minutes d'audio, et un GPU qui attend entre deux narrations est exactement le genre de gaspillage dont nous parlons ailleurs sur ce site. Nous avons donc choisi Pocket TTS de Kyutai, un modèle de synthèse vocale conçu pour tourner sur CPU, et nous avons affiné son modèle espagnol pour qu'il parle l'espagnol d'Espagne.
Les poids sont sur Hugging Face : inferencekey/pocket-tts-spanish-24l-castilian.
Pourquoi Pocket TTS
- Il tourne sur CPU. Pas de CUDA, pas de ROCm, pas de GPU. Il s'installe avec
pipet une version CPU de PyTorch. - Il est assez rapide. Le modèle anglais lit environ trois fois plus vite que le temps réel sur un CPU de bureau à huit cœurs (chiffres plus bas).
- Il parle plusieurs langues. Kyutai publie des modèles pour l'anglais, l'espagnol, le français, l'allemand, l'italien, le portugais et le néerlandais, chacun en une petite version à 6 couches et une plus grande à 24.
- Il clone une voix à partir d'un court extrait. Nous utilisons la même voix (alba) dans toutes les langues.
- Il a un serveur simple.
pocket-tts servegarde le modèle en mémoire et répond en HTTP : nous faisons tourner un petit pool de serveurs et envoyons une phrase à chacun.
Le problème : un espagnol avec un accent étranger
En anglais, le résultat est naturel dès le départ. En espagnol, on comprenait tout, mais cela ne sonnait pas comme l'Espagne : il lit avec un accent étranger et prononce le "z" et le "c" doux castillans comme un "s" (le seseo de l'espagnol d'Amérique latine). Pour un public en Espagne, c'est la première chose qu'on remarque.
Nous avons donc affiné le modèle espagnol à 24 couches (spanish_24l, environ 316 millions de paramètres dans la partie qui génère la voix) sur environ 2 000 extraits d'espagnol d'Espagne, sur un GPU AMD avec ROCm.
Ce que l'entraînement nous a appris :
- Moins de pas, c'était mieux. La perte de validation a atteint son minimum au pas 600 (0,4951) puis est remontée, jusqu'à 0,5095 au pas 1500. Au pas 1500, le modèle avait vu les données environ 47 fois et commençait à sauter ou inventer des mots : l'ASR n'a trouvé des phrases complètes que dans 3 extraits de test sur 6. Le pas 600 les a toutes réussies, comme le modèle de base.
- Nous publions les poids EMA du pas 600. L'EMA est une moyenne mobile des poids pendant l'entraînement. Elle modifie moins le modèle que les poids bruts, et c'est ce que nous voulions : garder tout ce que le modèle de base fait bien et corriger l'accent.
- Un ASR ne suffit pas pour juger l'accent. Qwen3-ASR écrit "caza" et "casa" de la même façon : il dit s'il manque des mots, pas comment ils sonnent. Nous avons vérifié chaque extrait avec l'ASR pour les mots manquants, et à l'oreille pour l'accent.
Écoutez
Tous les extraits utilisent la même voix (alba), sans retouche, générés sur CPU. Chaque extrait a passé une vérification ASR des mots manquants.
Espagnol : modèle de base contre notre fine-tune
"¿Sabías que el tren de las siete y cuarto sale hoy con veinte minutos de retraso?"
- Modèle de base spanish_24l
- Notre fine-tune
"La panadería de la esquina abre a las ocho y hace el mejor pan de centeno del barrio."
- Modèle de base spanish_24l
- Notre fine-tune
Anglais
- "Did you know the seven fifteen train is running twenty minutes late today?"
- "This voice runs on a regular CPU, with no graphics card at all, faster than real time."
Français
- "Tu savais que le train de sept heures et quart a vingt minutes de retard aujourd'hui ?"
- "La boulangerie du coin ouvre à huit heures et fait le meilleur pain de seigle du quartier."
Allemand
- "Wusstest du, dass der Zug um Viertel nach sieben heute zwanzig Minuten Verspätung hat?"
- "Die Bäckerei an der Ecke öffnet um acht und backt das beste Roggenbrot im Viertel."
L'anglais, le français et l'allemand utilisent les modèles à 6 couches de Kyutai. L'espagnol utilise notre fine-tune. Avec ces quatre-là, nous couvrons ce dont nous avons besoin : l'anglais et l'espagnol pour nos vidéos, le français et l'allemand pour les autres langues de ce site.
Un conseil tiré de l'essai en français : le modèle lit parfois mal les heures. "Sept heures et quart" est sorti faux dans deux essais sur trois, et l'ASR l'a repéré. Si une phrase compte, vérifiez-la et générez-la à nouveau.
Quelle vitesse sur CPU
Mesuré sur notre machine de développement, une VM partagée sur un Ryzen 7 5700X (8 cœurs), avec 3 instances du serveur de 2 threads chacune et six phrases du quotidien par modèle :
| Modèle | Audio | Temps de génération | Vitesse |
|---|---|---|---|
| Anglais (6 couches) | 18,4 s | 5,9 s | 3,1x le temps réel |
Espagnol spanish_24l, base (24 couches) | 22,9 s | 19,5 s | 1,2x le temps réel |
| Espagnol, notre fine-tune (24 couches) | 22,5 s | 21,5 s | 1,05x le temps réel |
Le fine-tune coûte autant que le modèle de base à 24 couches : même architecture, poids différents. Les modèles à 24 couches sont environ trois fois plus lents que ceux à 6, donc sur CPU ils conviennent aux narrations, pas aux longs livres audio. Chaque instance du modèle à 24 couches occupe environ 2,1 GB de RAM.
L'utiliser
Installez Pocket TTS et pointez-le vers notre configuration sur Hugging Face :
pip install pocket-tts
pocket-tts generate \
--config hf://inferencekey/pocket-tts-spanish-24l-castilian/config.yaml \
--text "¿Sabías que el tren de las siete y cuarto sale hoy con veinte minutos de retraso?" \
--output-path tren.wav
Sans --voice, il utilise alba. Pour le garder en mémoire et l'appeler en HTTP :
pocket-tts serve --config hf://inferencekey/pocket-tts-spanish-24l-castilian/config.yaml
Deux choses qui ont amélioré nos narrations en espagnol :
- Envoyez des phrases entières, ou de courts paragraphes entiers. Chaque morceau envoyé se termine avec sa propre intonation de fin : couper un paragraphe en nombreux petits morceaux le rend haché.
- Écrivez les nombres en toutes lettres. "Siete y cuarto" est toujours bien lu ; "7:15" pas toujours.
La fiche du modèle sur Hugging Face contient l'exemple en Python et d'autres extraits (base contre fine-tune).