Озвучка текста в 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 с на четырёх потоках процессора.