Синтез речи
Текст на узбекском превращается в аудиофайл: отправили текст, получили запись. Синтез сейчас в бета-версии и открыт всем аккаунтам.
Скоро
- Потоковая модель. Аудио приходит по частям, не дожидаясь всего текста: для голосовых агентов и живых звонков.
- Много новых живых голосов.
Голоса
voice | Голос |
|---|---|
zebo | Zebo, женский голос (по умолчанию) |
doston | Doston, мужской голос |
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 знаков. Латиница или кириллица; цифры, даты, телефоны и адреса сайтов читаются словами |
voice | zebo или doston, по умолчанию zebo |
role | operator (по умолчанию) или assistant |
style | Стиль роли: neutral (по умолчанию), warm, cheerful, calm, empathetic |
format | mp3, wav (по умолчанию) или ogg (Opus) |
sample_rate | Частота файла, 8000–48000 Гц; по умолчанию собственная частота голоса, 22050 Гц |
dialect | Разговорное произношение, как в живой речи Ташкента: «hozir» звучит как «hozi», «bo‘lib» как «bo‘p». Включено, если не false; для официального текста и новостей выключите |
hesitations | true — паузы и звуки вроде «Aa…» и «Eee…» там, где их делает живой человек: звонок звучит менее искусственно. Выключено, если не true. «Разговорная речь» в кабинете включает это вместе с dialect |
no_wait | true — ответить сразу номером задачи, а не ждать аудио |
[pause] в тексте даёт короткую паузу, [laugh] — смех. Других тегов и разметки нет. Произношение dialect оставляет узбекские слова: русских заимствований вроде «dostavka» или «skidka» оно не подставляет.
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 | На балансе меньше, чем стоит текст |