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 pip et 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 serve garde 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?"

"La panadería de la esquina abre a las ocho y hace el mejor pan de centeno del barrio."

Anglais

Français

Allemand

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èleAudioTemps de générationVitesse
Anglais (6 couches)18,4 s5,9 s3,1x le temps réel
Espagnol spanish_24l, base (24 couches)22,9 s19,5 s1,2x le temps réel
Espagnol, notre fine-tune (24 couches)22,5 s21,5 s1,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).