РУКОВОДСТВО

Синтез речи на C++: естественные голоса для игр и приложений

В C++ нет стандартной библиотеки синтеза речи. Обычно выбирают системный API, который на Windows, macOS и Linux разный, старый формантный синтезатор вроде eSpeak NG, который звучит роботом, или нейросетевой движок, вызываемый из C++. Последний даёт естественные голоса, одинаковые на всех платформах.

SuperClonica даёт естественные голоса на 31 языке — попробовать можно бесплатно онлайн, — бесплатный движок с командной строкой и HTTP-сервером в Docker и больше 170 голосов каталога. В этом руководстве — два способа использовать его из C++: заранее озвученные реплики и локальный сервер во время работы.

Варианты синтеза речи в C++

Большинство игр используют готовые файлы для постоянных диалогов, а сервер — только для текста, который пишут игроки.

  • Системные API: SAPI в Windows, AVSpeechSynthesizer в системах Apple, Speech Dispatcher в Linux — три разных пути в коде.
  • eSpeak NG: маленький и встраиваемый, но явно роботизированный.
  • Заранее озвученные файлы: реплики игры или приложения озвучены один раз и поставляются как WAV или OGG.
  • Локальный HTTP-сервер: программа отправляет текст и получает WAV.

Выберите голос бесплатно онлайн

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

Озвучьте реплики заранее

Одинаковые текст, голос и seed всегда дают один и тот же файл, так что озвученные реплики можно хранить в системе контроля версий и пересобирать по необходимости.

  • Установите движок: python -m pip install superclonica-cpu.
  • Из скрипта сборки или утилиты вызовите командную строку: std::system("superclonica --text \"Welcome, traveler.\" --voice M2 --lang en --output welcome.wav");
  • Формат определяется именем файла: WAV, MP3, OGG или FLAC.
  • Загружайте файлы той аудиобиблиотекой, что уже используете: SDL_mixer, SFML, raylib или miniaudio.

Сервер речи во время работы

Для текста, который появляется только во время работы, один раз запустите сервер: docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu. Затем отправьте JSON через libcurl и запишите ответ в файл (подключите curl/curl.h и слинкуйте с libcurl): std::string body = R"({"text": "Welcome, traveler.", "voice": "M2", "lang": "en"})"; CURL* c = curl_easy_init(); curl_slist* h = curl_slist_append(nullptr, "Content-Type: application/json"); curl_easy_setopt(c, CURLOPT_URL, "http://localhost:8000/synthesize"); curl_easy_setopt(c, CURLOPT_HTTPHEADER, h); curl_easy_setopt(c, CURLOPT_POSTFIELDS, body.c_str()); FILE* f = std::fopen("welcome.wav", "wb"); curl_easy_setopt(c, CURLOPT_WRITEDATA, f); curl_easy_perform(c); std::fclose(f); curl_slist_free_all(h); curl_easy_cleanup(c); Ответ — 16-битный моно WAV; заголовки X-Sample-Rate и X-Duration-Seconds описывают его. Задайте SUPERCLONICA_API_KEY и держите сервер в закрытой сети, если он не на машине самого игрока.

Голоса для релиза

Для игры или приложения, которые вы выпускаете, используйте десять стандартных голосов, от M1 до M5 и от F1 до F5, бесплатных по лицензии OpenRAIL-M, или свой голос, обученный в студии SuperClonica по записи актёра, который на это согласился. Движок и Docker-образ — под Apache 2.0. Фанатские голоса персонажей из каталога — для фанатских проектов, а не для коммерческих релизов.