РУКОВОДСТВО

Озвучка текста в C# и .NET офлайн

Классический способ заговорить из C# — System.Speech: пара строк, голоса Windows, без интернета. Он всё ещё работает, но только в Windows, голоса звучат устаревше и различаются от машины к машине. Облачные сервисы звучат лучше, но отправляют каждый текст наружу и берут деньги за символы.

Это руководство показывает третий путь: бесплатный движок SuperClonica как локальный HTTP-сервер, который вызывает любое .NET-приложение в Windows, Linux или macOS, с естественными голосами и WAV-файлами, которые остаются у вас.

Три способа говорить из .NET

Для быстрого прототипа в Windows хватит System.Speech; для голоса продукта, который везде звучит одинаково, нужен движок.

  • System.Speech: встроен в Windows, офлайн, роботизированные голоса, только Windows.
  • Облачные API речи: естественные голоса, но аккаунт, ключ, оплата за символы и ваш текст на чужих серверах.
  • SuperClonica: локальный сервер с естественными голосами, голосами персонажей и своими голосами, офлайн, в любой ОС, где работает Docker.
  • Он говорит на 31 языке; китайский пока не поддерживается.

Послушайте голоса бесплатно онлайн

Прежде чем писать код, откройте страницу любого голоса, впишите фразу от 30 до 100 символов, выберите язык и нажмите «Озвучить». Через несколько секунд вы услышите голос, который может быть у вашего приложения, без регистрации.

Запуск сервера речи

Видеокарта NVIDIA ускоряет работу с образом cuda, но не обязательна.

  • Запустите сервер на любом процессоре: docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu.
  • Первый запуск скачивает модель Supertonic 3, около 385 МБ, в том; GET /health покажет, когда сервер готов.
  • POST /synthesize принимает JSON с полями text, voice, lang, seed и normalize и отвечает 16-битным моно-WAV.
  • voice — стандартное имя от M1 до M5 и от F1 до F5 или JSON-содержимое файла голоса.

Вызов из C#

С System.Net.Http, System.Text и System.Text.Json.Nodes запрос в .NET 6 и новее занимает несколько строк: using var http = new HttpClient(); var voice = JsonNode.Parse(File.ReadAllText("voice.json")); var body = new JsonObject { ["text"] = "Привет из C#!", ["voice"] = voice, ["lang"] = "ru", ["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()); Для стандартного голоса задайте ["voice"] = "F1" вместо загрузки файла. Тот же текст, голос и seed всегда дают тот же звук, поэтому кешируйте файлы для повторяющихся фраз и проигрывайте их аудиобиблиотекой, которую уже использует ваше приложение.

Привычки для продакшена

Держите один HttpClient на всё время работы приложения. Не открывайте порт 8000 в интернет как есть: задайте SUPERCLONICA_API_KEY и передавайте его как Bearer-токен или держите сервер в частной сети. Если запросов много одновременно, запустите больше копий модели через SUPERCLONICA_LANES и замерьте на своём железе: в наших тестах короткая фраза занимала 0,12 с на RTX 5070 Ti и 0,43 с на четырёх потоках процессора.