Text to Speech
LIVEOpenAI-compatible TTS endpoint. 12 multilingual AI-голосов (узбекский, русский, английский) через Gemini native audio. Возвращает WAV (24 kHz mono) или сырой PCM.
POST
https://zowy.ai/api/v1/audio/speech
Beta — биллинг
Endpoint доступен держателям API-ключа с активным Voice AI или AI Chat пакетом. Per-character списание не введено на этой итерации. При high volume use — пожалуйста, напишите на info@zowy.ai.
Параметры запроса (JSON body)
| Поле | Тип | Описание |
|---|---|---|
| model | string | Required. Только "tts-1" на текущий момент |
| voice | string | Required. display_name из /api/v1/voices (например "Laylo", "Sulafat", "Aoede") |
| input | string | Required. Текст для синтеза. UTF-8, max 4096 символов |
| instructions | string | Optional. Естественный язык-стиль/тон-инструкция для голоса (Gemini-style prompt prefix). Max 500 символов. Примеры: "Скажи весело", "Read in a calm, slow tone", "Объяви драматично". Игнорируется некоторыми голосами. |
| response_format | string | "wav" (default) или "pcm" (raw PCM 16-bit signed LE, 24 kHz mono) |
Минимальный пример — все языки
curl -X POST "https://zowy.ai/api/v1/audio/speech" \
-H "Authorization: Bearer $ZOWY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "tts-1",
"voice": "Laylo",
"input": "Salom! Bu Zowy AI dan ovozli xabar.",
"instructions": "Скажи тепло и дружелюбно",
"response_format": "wav"
}' \
--output greeting.wavfrom openai import OpenAI
client = OpenAI(
api_key="zowy_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
base_url="https://zowy.ai/api/v1",
)
response = client.audio.speech.create(
model="tts-1",
voice="Laylo",
input="Salom! Bu Zowy AI dan ovozli xabar.",
extra_body={"instructions": "Скажи тепло и дружелюбно"}, # Optional Gemini-style tone prompt
)
response.stream_to_file("greeting.wav")import httpx
with httpx.stream(
"POST",
"https://zowy.ai/api/v1/audio/speech",
headers={"Authorization": "Bearer $ZOWY_API_KEY"},
json={
"model": "tts-1",
"voice": "Laylo",
"input": "Salom! Bu Zowy AI dan ovozli xabar.",
"response_format": "wav",
},
timeout=60,
) as r:
r.raise_for_status()
with open("greeting.wav", "wb") as f:
for chunk in r.iter_bytes():
f.write(chunk)import OpenAI from "openai";
import fs from "fs";
const client = new OpenAI({
apiKey: process.env.ZOWY_API_KEY,
baseURL: "https://zowy.ai/api/v1",
});
const response = await client.audio.speech.create({
model: "tts-1",
voice: "Laylo",
input: "Salom! Bu Zowy AI dan ovozli xabar.",
});
const buffer = Buffer.from(await response.arrayBuffer());
fs.writeFileSync("greeting.wav", buffer);Аудио форматы
| response_format | Content-Type | Параметры |
|---|---|---|
| wav | audio/wav | PCM 16-bit signed LE, 24 kHz mono, с WAV-заголовком |
| pcm | audio/pcm | Сырые PCM-сэмплы 16-bit signed LE, 24 kHz mono. Без заголовка |
Голоса
Полный актуальный список — GET /api/v1/voices. Default: Laylo. Все голоса multilingual.
На 2026-04-29 в проде: Laylo, Sulafat, Aoede и ещё 9 голосов (всего 12). Имена case-sensitive.
Ошибки
| HTTP | Когда |
|---|---|
| 400 | Невалидный JSON, пустой input, >4096 символов, неизвестный voice, неподдерживаемый model или response_format |
| 401 | Нет/невалидный API-ключ |
| 402 | Нет активного Voice AI или AI Chat пакета |
| 403 | Ключ не имеет scope voice_ai |
| 422 | Gemini вернул пустой ответ (safety filter / нет candidates / пустой content). Попробуйте упростить input или сменить голос. |
| 429 | Превышен rate limit (60/мин default) |
| 502 | Upstream TTS-движок (Gemini) недоступен / network error |
Migration с OpenAI TTS
Drop-in для OpenAI Python / JS SDK — поменяйте только base_url и имя голоса (наши имена другие — см. /docs/voices):
client = OpenAI(
api_key="zowy_...", # вместо sk-...
base_url="https://zowy.ai/api/v1", # <- добавить
)
response = client.audio.speech.create(
model="tts-1",
voice="Laylo", # вместо "alloy"/"echo"/etc
input="Salom dunyo!",
)