Synthèse vocale en C# et .NET hors ligne
La façon classique de parler depuis C#, c’est System.Speech : quelques lignes, les voix de Windows, sans internet. Ça marche toujours, mais seulement sous Windows, les voix sonnent datées et changent d’une machine à l’autre. Les services cloud sonnent mieux, mais envoient chaque texte à l’extérieur et facturent au caractère.
Ce guide montre une troisième voie : le moteur gratuit SuperClonica comme serveur HTTP local que toute appli .NET peut appeler sous Windows, Linux ou macOS, avec des voix naturelles et des fichiers WAV que vous gardez.
Trois façons de parler depuis .NET
Pour un prototype rapide sous Windows, System.Speech suffit ; pour une voix de produit identique partout, prenez un moteur.
- System.Speech : intégré à Windows, hors ligne, voix robotiques, Windows uniquement.
- API vocales cloud : voix naturelles, mais compte, clé, facturation au caractère et votre texte sur leurs serveurs.
- SuperClonica : un serveur local avec des voix naturelles, de personnages et personnalisées, hors ligne, sur tout système qui fait tourner Docker.
- Il parle 31 langues ; le chinois n’est pas encore pris en charge.
Écouter les voix 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 le serveur vocal
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 JSON d’un fichier de voix.
L’appeler depuis C#
Avec System.Net.Http, System.Text et System.Text.Json.Nodes, une requête tient en quelques lignes en .NET 6 ou plus récent : using var http = new HttpClient(); var voice = JsonNode.Parse(File.ReadAllText("voice.json")); var body = new JsonObject { ["text"] = "Bonjour depuis C# !", ["voice"] = voice, ["lang"] = "fr", ["seed"] = 7 }; var res = await http.PostAsync("http://localhost:8000/synthesize", new StringContent(body.ToJsonString(), Encoding.UTF8, "application/json")); File.WriteAllBytes("hello.wav", await res.Content.ReadAsByteArrayAsync()); Pour une voix de base, mettez ["voice"] = "F1" au lieu de charger un fichier. Le même texte, la même voix et le même seed donnent toujours le même son : mettez en cache les fichiers des phrases qui reviennent et lisez-les avec la bibliothèque audio que votre appli utilise déjà.
Bonnes pratiques en production
Gardez un seul HttpClient pendant toute la vie de l’appli. N’exposez pas le port 8000 sur internet tel quel : définissez SUPERCLONICA_API_KEY et envoyez-la comme jeton Bearer, ou gardez le serveur 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.