Синтез речи
POST /v1/audio/speech — текст в звук, как audio.speech SDK OpenAI. Тело ответа — байты
звука (audio/mpeg или audio/wav — формат запроса или родной формат модели), id задачи — в заголовке
X-Job-Id. Поля — схема SpeechRequest.
curl https://api.souz.ai/v1/audio/speech \
-H "Authorization: Bearer $SOUZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "qwen-audio-3.0-tts-plus", "input": "Добро пожаловать!", "voice": "longanlingxin"}' \
--output welcome.mp3speech = client.audio.speech.create(model="qwen-audio-3.0-tts-plus", input="Добро пожаловать!", voice="longanlingxin")
speech.write_to_file("welcome.mp3")Скорость и поток
speed (0,25–4) принимается и на результат не влияет: темп — как у модели. Его задают
словами в instructions, если модель их принимает. stream_format: "sse" — звук
событиями text/event-stream: speech.audio.delta с base64 звука, затем
speech.audio.done.
Объект задачи вместо байтов
С заголовком Accept: application/json ответ — объект задачи: звук — data[0]
(type: "audio"), в usage — characters, seconds и, у моделей с посимвольной оплатой,
billed_characters.
Голоса и пределы
Голоса, предел текста и формат звука — в карточке модели. Голос или формат, которых у
модели нет, — 400 capability_mismatch со списком допустимых; если карточка не предлагает
голос, поле voice не присылайте. У моделей с посекундной ценой оплачивается длительность
готового звука: ставка — pricing.amount_micro, предел — limits.max_output_seconds.
Манера речи и диалог
Если в карточке модели есть поле instructions, в нём словами задают, как говорить: тон,
темп и эмоцию («спокойно и тепло», «быстро, с азартом»). Если есть dialogue —
вместо input присылают реплики по порядку, у каждой свой голос:
curl https://api.souz.ai/v1/audio/speech \
-H "Authorization: Bearer $SOUZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "gemini-3.1-flash-tts-preview",
"instructions": "Спокойный вечерний разговор, говорят негромко.",
"dialogue": [{"voice": "Kore", "text": "Ты готов?"},
{"voice": "Charon", "text": "Почти. Дай мне минуту."}]}' \
--output dialogue.wavinput и dialogue вместе — 400 invalid_request (mutually_exclusive). Число разных
голосов, реплик и общий предел текста реплик — в карточке модели; поле, которого у модели
нет, — 400 capability_mismatch. Эти поля умеют не все каналы модели: запрос с ними идёт
только по тем, что умеют; какие это каналы — превью с speech_instructions и
speech_dialogue. Указания не тарифицируются: оплачивается озвученный текст.