РУКОВОДСТВО

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

В стандартной библиотеке Go нет синтеза речи, и обычные ответы — облачный SDK с оплатой за символы или обёртка над роботизированными голосами операционной системы. Для сервиса, бота или консольной утилиты у обоих есть минусы: текст уходит с машины или голос меняется от системы к системе.

Это руководство показывает, как вызывать бесплатный движок SuperClonica из Go через локальный HTTP-сервер: естественные голоса, WAV-файлы, которые остаются у вас, и обычный net/http на любой платформе.

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

Сервису, который часто говорит, дешевле и приватнее иметь собственный сервер речи.

  • Облачные 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-содержимое файла голоса.

Вызов из Go

С bytes, io, net/http и os из стандартной библиотеки запрос занимает несколько строк: voice, _ := os.ReadFile("voice.json"); body := append([]byte(`{"text": "Привет из Go!", "lang": "ru", "seed": 7, "voice": `), append(voice, '}')...); res, _ := http.Post("http://localhost:8000/synthesize", "application/json", bytes.NewReader(body)); defer res.Body.Close(); out, _ := os.Create("hello.wav"); defer out.Close(); io.Copy(out, res.Body) В настоящем коде обрабатывайте ошибки, а не отбрасывайте их. Для стандартного голоса отправьте "voice": "F1" вместо файла. Тот же текст, голос и seed всегда дают тот же звук, поэтому кешируйте файлы для повторяющихся фраз.

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

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