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

ПолеТипОбязательныйОписание
voicestringдаГолос модели. Набор зависит от модели
formatstringдаФормат файла, например wav или mp3. Зависит от модели

Не перечисляйте голоса из документации — берите допустимые значения у конкретной модели.

Стриминг

Можно включить stream: true: куски приходят в delta.audio. Склейте data и декодируйте base64. Подробнее про SSE — стриминг.

JSON
{
  "choices": [
    {
      "delta": {
        "audio": {
          "data": "<base64-encoded audio chunk>",
          "transcript": "Привет"
        }
      }
    }
  ]
}
Python
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.

Смотрите также