Skip to content

Синтез речи ​

Текст на узбекском превращается в аудиофайл: отправили текст, получили запись. Синтез сейчас в бета-версии и открыт всем аккаунтам.

Скоро

  • Потоковая модель. Аудио приходит по частям, не дожидаясь всего текста: для голосовых агентов и живых звонков.
  • Много новых живых голосов.

Голоса ​

voiceГолос
zeboZebo, женский голос (по умолчанию)
dostonDoston, мужской голос

GET /v1/tts/voices отдаёт этот список с полем available: голос доступен, когда его сейчас обслуживает хотя бы один сервер.

Роль и стиль ​

Оба голоса говорят в одной из ролей и в одном из её стилей. По умолчанию роль operator, стиль neutral.

roleСтили (style)
operator — оператор колл-центраneutral, warm, cheerful, calm, empathetic
assistant — голосовой ассистентneutral, warm, cheerful, calm, empathetic

Роли и стили каждого голоса приходят в GET /v1/tts/voices в поле roles: первый стиль роли — её стиль по умолчанию. Цена от стиля не зависит.

POST /v1/tts: озвучить текст ​

Тот же токен проекта, что и для распознавания. Тело запроса JSON:

ПолеЧто это
textТекст, до 4000 знаков. Латиница или кириллица; цифры, даты, телефоны и адреса сайтов читаются словами
voicezebo или doston, по умолчанию zebo
roleoperator (по умолчанию) или assistant
styleСтиль роли: neutral (по умолчанию), warm, cheerful, calm, empathetic
formatmp3, wav (по умолчанию) или ogg (Opus)
sample_rateЧастота файла, 8000–48000 Гц; по умолчанию собственная частота голоса, 22050 Гц
dialectРазговорное произношение, как в живой речи Ташкента: «hozir» звучит как «hozi», «bo‘lib» как «bo‘p». Включено, если не false; для официального текста и новостей выключите
hesitationstrue — паузы и звуки вроде «Aa…» и «Eee…» там, где их делает живой человек: звонок звучит менее искусственно. Выключено, если не true. «Разговорная речь» в кабинете включает это вместе с dialect
no_waittrue — ответить сразу номером задачи, а не ждать аудио

[pause] в тексте даёт короткую паузу, [laugh] — смех. Других тегов и разметки нет. Произношение dialect оставляет узбекские слова: русских заимствований вроде «dostavka» или «skidka» оно не подставляет.

bash
curl -X POST https://console.gapi.uz/v1/tts \
  -H "Authorization: Bearer $GAPI_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"text": "Assalomu alaykum! Buyurtmangiz ertaga soat 10 da yetkaziladi.", "voice": "zebo", "format": "mp3"}' \
  -o salom.mp3

Ответ 200 — сам аудиофайл (audio/mpeg, audio/wav или audio/ogg) с заголовками X-Job-Id, X-Voice, X-Audio-Seconds и X-Cost-G. С заголовком Accept: application/json ответ — JSON: id, voice, role, style, said (текст так, как его прочитал голос), format, sample_rate, audio_seconds и audio_b64 (файл в base64).

Запрос ждёт аудио до двух минут. Если текст не успел озвучиться, ответ 202 с id и result_url: заберите файл по нему.

GET /v1/tts/{id}: результат ​

Аудио готовой задачи, в том же виде, что и ответ POST /v1/tts; пока задача в работе — JSON с state (queued, running). Аудио хранится 24 часа, потом ответ 410 result_expired.

GET /v1/tts: последние запросы ​

Запросы проекта, новые первыми: ?limit= до 100 (по умолчанию 20) и ?offset=. У каждого id, state, voice, role, style, format, chars, cost_g, audio_seconds, created_at, finished_at, text, said, expires_at, result_url. text — присланный текст, он остаётся в истории; said (текст так, как его прочитал голос) виден, пока хранится аудио.

Цена ​

3,2 g за 1000 знаков присланного текста, пробелы считаются. Цена известна до синтеза: она приходит в X-Cost-G (и в cost_g при no_wait), резервируется при запросе и списывается, когда аудио готово. Неудачный запрос ничего не стоит.

Ошибки ​

КодЧто значит
403 tts_not_availableСинтез ещё не открыт этому аккаунту
400 tts_text_empty, 400 tts_text_too_longПустой текст или длиннее 4000 знаков
400 tts_voice_unknownТакого голоса нет; в подсказке список
400 tts_role_unknown, 400 tts_style_unknownТакой роли или стиля у голоса нет; в подсказке список
400 tts_format_unsupported, 400 tts_sample_rate_unsupportedНеподдерживаемый формат или частота
503 tts_voice_unavailable, 503 no_runner_for_ttsГолос или все серверы синтеза сейчас перезапускаются; повторите через пару минут
429 insufficient_balanceНа балансе меньше, чем стоит текст