РУКОВОДСТВО

Озвучка текста в Java офлайн

В стандартную библиотеку Java синтез речи так и не попал, поэтому проекты берут старые движки вроде FreeTTS или MaryTTS, которые звучат роботизированно рядом с нейросетевыми голосами, или облачный SDK, который берёт деньги за символы и видит каждый текст.

Это руководство показывает современную альтернативу: бесплатный движок SuperClonica как локальный HTTP-сервер, который вызывается встроенным HttpClient из Java 11 и новее. Вы получаете естественные голоса, WAV-файлы, которые остаются у вас, и никакой оплаты за запрос — на любой платформе.

Способы говорить из Java

Движок не работает внутри JVM: ваш код на Java обращается к нему по HTTP, как к любому другому сервису.

  • FreeTTS и MaryTTS: чистая Java и офлайн, но звучат роботизированно по сравнению с нейросетевыми голосами.
  • Облачные SDK: естественные голоса, но аккаунт, ключ, оплата за символы и ваш текст на чужих серверах.
  • SuperClonica: локальный HTTP-сервер с естественными голосами, голосами персонажей и своими, офлайн, везде, где работает 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-содержимое файла голоса.

Вызов из Java

С java.net.http, java.net.URI и java.nio.file запрос в Java 11 и новее занимает несколько строк: var voice = Files.readString(Path.of("voice.json")); var json = "{\"text\": \"Привет из Java!\", \"lang\": \"ru\", \"seed\": 7, \"voice\": " + voice + "}"; var request = HttpRequest.newBuilder(URI.create("http://localhost:8000/synthesize")).header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(json)).build(); HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofFile(Path.of("hello.wav"))); Ответ записывается прямо в WAV-файл. Для стандартного голоса отправьте "voice": "F1" вместо содержимого файла. Тот же текст, голос и seed всегда дают тот же звук, поэтому кешируйте файлы для повторяющихся фраз; в больших проектах запрос удобнее собирать JSON-библиотекой вроде Jackson.

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

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