Le plugin Flutter flutter_tts ne supporte pas Linux. BeatBitch contourne en
sélectionnant au runtime l'un de deux backends :
- piper — TTS neuronal léger, voix très naturelle.
Activé automatiquement si
piperest dans lePATHet qu'au moins un fichier de voix.onnxest posé dans un dossier conventionnel. - spd-say — CLI de
speech-dispatcher. Fallback toujours dispo (speech-dispatcherest listé comme dépendance Linux du paquet), mais par défaut il sort de l'espeak-ngtrès robotique.
L'app détecte le backend disponible au lancement et l'affiche dans Profil → VOIX comme « piper (neuronal) » ou « spd-say (système) ».
sudo apt install pipx
pipx install piper-tts
pipx ensurepath # ajoute ~/.local/bin au PATH si pas déjàVérifier :
which piper
piper --helpAlternative : binaire pré-compilé sur la page Releases de rhasspy/piper — extrait dans
~/.local/bin/ou/usr/local/bin/.
Les modèles sont hébergés sur HuggingFace : https://huggingface.co/rhasspy/piper-voices
Conventions piper : <lang>_<COUNTRY>-<name>-<quality>.onnx + sidecar
.onnx.json (config du modèle, sample rate…). Les deux fichiers vont
toujours ensemble.
mkdir -p ~/.local/share/piper-voices
cd ~/.local/share/piper-voices
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/siwis/medium/fr_FR-siwis-medium.onnx
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/siwis/medium/fr_FR-siwis-medium.onnx.jsonAutres voix FR : fr_FR-upmc-medium, fr_FR-tom-medium, fr_FR-mls-medium.
cd ~/.local/share/piper-voices
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/amy/medium/en_US-amy-medium.onnx
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/amy/medium/en_US-amy-medium.onnx.jsonAutres : en_US-ryan-medium, en_GB-jenny_dioco-medium.
cd ~/.local/share/piper-voices
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/de/de_DE/thorsten/medium/de_DE-thorsten-medium.onnx
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/de/de_DE/thorsten/medium/de_DE-thorsten-medium.onnx.jsonAutre : de_DE-eva_k-x_low (femme, petit modèle).
La détection se fait au lancement. Après installation des voix, ferme et relance BeatBitch. Profil → VOIX doit afficher « piper (neuronal) ».
L'app scanne les dossiers suivants, par ordre de priorité (le 1er match par langue gagne) :
$XDG_DATA_HOME/piper-voices~/.local/share/piper-voices/usr/local/share/piper-voices/usr/share/piper-voices
Le code langue est extrait du préfixe du nom de fichier avant le 1er _
ou - : fr_FR-siwis-medium.onnx → langue fr. Un seul .onnx par
langue est retenu — pour changer de voix, remplace le fichier (ou bouge
les autres dans un sous-dossier).
- Vérifier
which piper→ doit retourner un chemin existant. Si vide,pipx ensurepathpuis nouvelle session shell. - Vérifier qu'au moins un
.onnxest dans~/.local/share/piper-voices/(et que son.onnx.jsonest à côté). - Le nom de fichier doit commencer par un code langue connu (
fr,en,de…) — pas de fichier renommé sans préfixe langue. - Relancer l'app (la détection est faite une seule fois au démarrage).
Piper produit du PCM brut envoyé à aplay (ALSA). Tester le pipeline
en standalone (utiliser un texte neutre, pas du contenu de l'app) :
echo "test un deux trois" | \
piper --model ~/.local/share/piper-voices/fr_FR-siwis-medium.onnx --output_raw | \
aplay -r 22050 -f S16_LE -t raw -c 1Si aplay est absent : sudo apt install alsa-utils.
Si le système est full-PipeWire/PulseAudio sans backend ALSA, installer
le shim : sudo apt install pipewire-alsa (ou pulseaudio-utils selon
la stack).
- 1ʳᵉ inférence : ~1-3 s (chargement du modèle ONNX). Les suivantes sont ~100-300 ms.
- Si le modèle ne charge jamais : vérifier l'intégrité du
.onnx(sha256sumvs page HuggingFace) — un téléchargement tronqué donne un fichier corrompu.
Avec piper, ces sliders sont ignorés : la cadence et la hauteur sont
des propriétés du modèle. Pour changer le rendu, télécharger une autre
voix (qualités low / medium / high ont des timbres différents, et
chaque voix a sa propre cadence intrinsèque).
Avec spd-say (fallback), les sliders sont mappés sur -r / -p
(échelle -100..100) et fonctionnent.
- Pas de sélection de voix dans l'UI : une seule voix par langue, posée dans le dossier conventionnel. Pour proposer plusieurs voix alternatives dans l'écran Profil, il faudrait un sélecteur — pas livré en V1.
- Pas de variation par coach : les 6 coachs de carrière partagent
la même voix piper. Sur Android, chaque coach a son preset
tts.voice- rate + pitch ; sur Linux, c'est ignoré (cf.
applyCoachVoicePreset). La distinction reste portée par le texte de chaque coach.
- rate + pitch ; sur Linux, c'est ignoré (cf.
- Latence d'init : ~1-3 s à la 1ʳᵉ phrase d'une session (chargement du modèle ONNX). Acceptable, la session démarre par un countdown.