Synthèse vocale en JavaScript et Node.js
JavaScript intègre la synthèse vocale : la Web Speech API du navigateur. Elle est gratuite et sans configuration, mais les voix dépendent du système du visiteur, et on ne peut pas enregistrer le résultat dans un fichier. Quand il vous faut la même voix naturelle partout, des voix de personnages ou des fichiers audio, il vous faut un moteur vocal.
Ce guide compare honnêtement les deux voies et montre comment appeler le moteur gratuit SuperClonica depuis Node.js et depuis une appli web, via un serveur HTTP local.
Deux façons de parler depuis JavaScript
Pour un simple bouton de lecture à voix haute, la Web Speech API suffit ; pour la voix d’un produit, prenez un moteur.
- Web Speech API : une ligne dans le navigateur, speechSynthesis.speak(new SpeechSynthesisUtterance("Hello!")), avec les voix du système ou du navigateur.
- Ses voix varient entre Windows, macOS, Android et les navigateurs, certaines sont des services en ligne, et l’audio ne peut pas être enregistré dans un fichier.
- SuperClonica : un serveur local avec la même voix naturelle sur tous les appareils, des voix de personnages et personnalisées, et des fichiers WAV à stocker et mettre en cache.
- Il parle 31 langues ; le chinois n’est pas encore pris en charge.
Écouter les voix du moteur gratuitement
Avant d’écrire du code, ouvrez la page de n’importe quelle voix, saisissez une phrase de 30 à 100 caractères, choisissez la langue et cliquez sur le bouton de synthèse. En quelques secondes, vous entendez la voix que pourrait avoir votre appli, sans compte.
Lancer un serveur vocal local
Une carte graphique NVIDIA accélère le tout avec l’image cuda, mais elle n’est pas obligatoire.
- Lancez le serveur sur n’importe quel processeur : docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu.
- Le premier démarrage télécharge le modèle Supertonic 3, environ 385 Mo, dans le volume ; GET /health indique quand il est prêt.
- POST /synthesize reçoit du JSON avec text, voice, lang, seed et normalize, et répond par un WAV mono 16 bits.
- voice est un nom de base de M1 à M5 et de F1 à F5, ou le contenu déjà analysé d’un fichier de voix.
L’appeler depuis Node.js et le navigateur
Dans Node.js 18 ou plus récent, fetch est intégré, donc avec fs importé une requête tient en quelques lignes : const voice = JSON.parse(fs.readFileSync("voice.json", "utf8")); const res = await fetch("http://localhost:8000/synthesize", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text: "Bonjour depuis Node !", voice, lang: "fr", seed: 7 }) }); fs.writeFileSync("hello.wav", Buffer.from(await res.arrayBuffer())); Dans une appli web, gardez le serveur vocal privé et appelez-le depuis votre propre backend ; la page reçoit l’audio sous forme de blob et le lit avec new Audio(URL.createObjectURL(blob)).play(). Le même texte, la même voix et le même seed donnent toujours le même fichier : mettez en cache l’audio des phrases qui reviennent.
Bonnes pratiques en production
N’exposez pas le port 8000 sur internet tel quel : définissez SUPERCLONICA_API_KEY et envoyez-la comme jeton Bearer, placez le serveur derrière un proxy inverse en HTTPS ou gardez-le sur un réseau privé. Si beaucoup de requêtes arrivent en même temps, lancez plus de copies du modèle avec SUPERCLONICA_LANES, et mesurez sur votre matériel : dans nos tests, une phrase courte a pris 0,12 s sur une RTX 5070 Ti et 0,43 s sur quatre threads de processeur.