Синтез речи

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.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
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.wav

input и dialogue вместе — 400 invalid_request (mutually_exclusive). Число разных голосов, реплик и общий предел текста реплик — в карточке модели; поле, которого у модели нет, — 400 capability_mismatch. Эти поля умеют не все каналы модели: запрос с ними идёт только по тем, что умеют; какие это каналы — превью с speech_instructions и speech_dialogue. Указания не тарифицируются: оплачивается озвученный текст.