API
Аудио
Аудиофайл на вход /chat/completions и голосовой ответ модели. Не путать с POST /audio/speech и /audio/transcriptions.
Аудио в чате идёт в POST https://api.aitunnel.ru/v1/chat/completions. Это не озвучка текста (/audio/speech) и не распознавание речи (/audio/transcriptions).
Аудио на вход
Модель с "audio" в modalities.input принимает запись в multi-part messages: элемент type: "input_audio". data — сырой base64, не публичный URL и не data-URI. Рядом укажите format. Текст лучше ставить первым.
Пример ниже — gemini-3.5-flash. Какие модели слышат аудио — группа chat публичного каталога:
curl https://api.aitunnel.ru/public/aitunnel/models/chatНа сайте: страница моделей. Фильтр по входной модальности «Аудио».
Только base64
Прямые URL для аудиоконтента не поддерживаются. Кодируйте файл в base64 на своей стороне.
# data — сырой base64, не data-URI
curl https://api.aitunnel.ru/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-aitunnel-xxx" \
-d '{
"model": "gemini-3.5-flash",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "Расшифруй эту запись."},
{
"type": "input_audio",
"input_audio": {
"data": "UklGRuQXDAB...",
"format": "wav"
}
}
]
}
]
}'Несколько записей — отдельные элементы массива content. Модель с аудио и во входе, и в выходе (например gpt-audio-mini) может слушать файл и ответить голосом в одном запросе: добавьте modalities и audio, как в разделе ниже.
Форматы входа
Чаще всего wav и mp3. Другие значения format зависят от модели и провайдера — если запрос отклонён, попробуйте wav.
Аудио на выход
Модель с "audio" в modalities.output может вернуть речь. Передайте modalities: ["text", "audio"] и объект audio с голосом и форматом. Пример — gpt-audio-mini.
curl https://api.aitunnel.ru/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-aitunnel-xxx" \
-d '{
"model": "gpt-audio-mini",
"messages": [
{"role": "user", "content": "Скажи короткое приветствие."}
],
"modalities": ["text", "audio"],
"audio": {
"voice": "alloy",
"format": "wav"
}
}'В нестриминговом ответе аудио лежит в choices[0].message.audio:
data— base64 всего файлаtranscript— расшифровка сказанного
content при голосовом ответе часто пустой — текст смотрите в transcript.
Параметры audio
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
voice | string | да | Голос модели. Набор зависит от модели |
format | string | да | Формат файла, например wav или mp3. Зависит от модели |
Не перечисляйте голоса из документации — берите допустимые значения у конкретной модели.
Стриминг
Можно включить stream: true: куски приходят в delta.audio. Склейте data и декодируйте base64. Подробнее про SSE — стриминг.
{
"choices": [
{
"delta": {
"audio": {
"data": "<base64-encoded audio chunk>",
"transcript": "Привет"
}
}
}
]
}import base64
from openai import OpenAI
client = OpenAI(
api_key="sk-aitunnel-xxx",
base_url="https://api.aitunnel.ru/v1/",
)
stream = client.chat.completions.create(
model="gpt-audio-mini",
messages=[{"role": "user", "content": "Скажи короткое приветствие."}],
modalities=["text", "audio"],
audio={"voice": "alloy", "format": "wav"},
stream=True,
)
audio_chunks = []
transcript_chunks = []
for chunk in stream:
if not chunk.choices:
continue
audio = getattr(chunk.choices[0].delta, "audio", None)
if not audio:
continue
if getattr(audio, "data", None):
audio_chunks.append(audio.data)
if getattr(audio, "transcript", None):
transcript_chunks.append(audio.transcript)
print("".join(transcript_chunks))
with open("output.wav", "wb") as f:
f.write(base64.b64decode("".join(audio_chunks)))Тарификация
У части чат-моделей в каталоге есть audio_input_cost и audio_output_cost — цена за 1 млн аудиотокенов в рублях. Итог запроса — usage.cost_rub, остаток — usage.balance.
Лучшие практики
- Качество записи важнее битрейта: тихая или сильно сжатая речь хуже распознаётся.
- WAV — если качество важнее размера, MP3 — если нужно уложиться в тело JSON.
- Язык лучше назвать в текстовом промпте («это русская речь», «переведи на английский»).
- Длинные файлы режьте на сегменты: base64 раздувает тело запроса.
- Нужна только расшифровка без ответа модели — распознавание речи. Нужен файл по тексту без диалога — озвучка.
Устранение неполадок
Модель не видит аудио?
- В каталоге у неё
modalities.inputдолжен содержать"audio". data— сырой base64, не URL и неdata:audio/…;base64,.
В ответе нет message.audio?
- Нужны
modalities: ["text", "audio"]и объектaudio. - У модели
"audio"должен быть вmodalities.output.
Голос или формат не приняты?
- Наборы разные у разных моделей. Пример в запросе —
alloy/wavдляgpt-audio-mini.
Модель не найдена?
- Имя без префикса провайдера (
gpt-audio-mini, неopenai/gpt-audio-mini). - Список:
GET https://api.aitunnel.ru/public/aitunnel/models/chat.
Смотрите также
- Озвучка текста —
POST /audio/speech - Распознавание речи —
POST /audio/transcriptions - Стриминг
- Список моделей
- Ошибки и отладка