# Генерация аудио

> Генерируйте аудио ответ с помощью AI-моделей через RouterAI API.

RouterAI поддерживает генерацию аудио через модели OpenAI с возможностями аудио выхода. Эти модели могут создавать **речевые ответы** из текстовых промптов в потоковом режиме.

## Доступные модели

Для генерации аудио доступны следующие модели OpenAI:

- `openai/gpt-audio` - GPT Audio
- `openai/gpt-audio-mini` - GPT Audio Mini (оптимизированная версия)
- `openai/gpt-4o-audio-preview` - GPT-4o Audio Preview

Все модели поддерживают генерацию речи с различными голосами и работают только в потоковом режиме.

## Доступные голоса

Модели генерации аудио поддерживают следующие голоса:

- `alloy` - Нейтральный голос
- `ash` - Выразительный голос
- `ballad` - Мелодичный голос
- `coral` - Теплый голос
- `echo` - Резонирующий голос
- `fable` - Повествовательный голос
- `onyx` - Глубокий голос
- `nova` - Энергичный голос
- `sage` - Мудрый голос
- `shimmer` - Яркий голос
- `verse` - Ритмичный голос

## Использование API

Для генерации аудио необходимо отправить запрос на эндпоинт [`/api/v1/chat/completions`](https://routerai.ru/docs/reference#tag/chat-completions) с обязательными параметрами:

- `stream: true` - генерация поддерживается только в потоковом режиме
- `modalities: ["text", "audio"]` - указание модальностей вывода
- `audio` - конфигурация аудио с голосом и форматом

### Базовая генерация аудио

```bash
# Базовый запрос на генерацию аудио
curl -X POST "https://routerai.ru/api/v1/chat/completions" \
  -H "Authorization: Bearer $ROUTERAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-audio-mini",
    "modalities": ["text", "audio"],
    "messages": [
      {"role": "user", "content": "Расскажи о зарождении вселенной"}
    ],
    "audio": {
      "voice": "alloy",
      "format": "pcm16"
    },
    "stream": true
  }'
```

### Параметры конфигурации аудио

#### Выбор голоса

Установите **voice** параметр для выбора голоса генерируемого аудио. Доступны 11 различных голосов с разными характеристиками.

```bash
# Генерация аудио с конкретным голосом
curl -X POST "https://routerai.ru/api/v1/chat/completions" \
  -H "Authorization: Bearer $ROUTERAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-audio-mini",
    "modalities": ["text", "audio"],
    "messages": [
      {"role": "user", "content": "Объясни квантовую физику простыми словами"}
    ],
    "audio": {
      "voice": "nova",
      "format": "pcm16"
    },
    "stream": true
  }'
```

#### Формат аудио

В настоящее время поддерживается формат `pcm16` (PCM 16-bit, mono, 24kHz).

## Формат ответа

При генерации аудио ответ приходит в виде потока Server-Sent Events (SSE). Каждое событие содержит chunk с аудио данными в формате base64:

```json
{
  "choices": [
    {
      "delta": {
        "audio": {
          "data": "base64_encoded_pcm_data..."
        }
      }
    }
  ]
}
```

### Обработка потокового ответа

Аудио данные приходят в виде base64-кодированных PCM16 chunks, которые необходимо:

1. Декодировать из base64
2. Накопить все chunks
3. Сохранить как PCM файл
4. При необходимости конвертировать в другой формат (например, MP3)

## Пример: Генерация и сохранение в MP3

Полный пример на Python для генерации аудио и сохранения в MP3 формат:

```python
import base64
import json
import subprocess
import requests

url = "https://routerai.ru/api/v1/chat/completions"
headers = {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
}

payload = {
    "model": "openai/gpt-audio-mini",
    "modalities": ["text", "audio"],
    "messages": [
        {
            "role": "system",
            "content": "Ты математик, говори на русском языке, пользователь будет задавать вопрос, а ты отвечай очень кратко, 1-2 слова и без лишних рассуждений."
        },
        {
            "role": "user",
            "content": "сколько будет один в квадрате?"
        }
    ],
    "audio": {
        "voice": "alloy",
        "format": "pcm16"
    },
    "stream": True
}

# Накопление PCM chunks
pcm_chunks = bytearray()

with requests.post(url, headers=headers, json=payload, stream=True) as r:
    r.raise_for_status()
    for raw_line in r.iter_lines(decode_unicode=True):
        if not raw_line:
            continue
        # SSE: каждая строка вида "data: {...}" или "data: [DONE]"
        if not raw_line.startswith("data: "):
            continue
        data = raw_line[6:]
        if data == "[DONE]":
            break

        try:
            chunk = json.loads(data)
        except json.JSONDecodeError:
            continue

        # Извлекаем audio.data из delta
        choices = chunk.get("choices", [])
        if not choices:
            continue
        delta = choices[0].get("delta", {})
        audio = delta.get("audio", {})
        audio_b64 = audio.get("data")
        if audio_b64:
            # Декодируем base64 в байты PCM16
            pcm_chunks += base64.b64decode(audio_b64)

# Сохраняем сырой PCM
pcm_path = "output.pcm"
with open(pcm_path, "wb") as f:
    f.write(pcm_chunks)

# Конвертация в MP3 через ffmpeg
# PCM16: 16-bit, mono, 24kHz
mp3_path = "output.mp3"
subprocess.run([
    "ffmpeg", "-y",
    "-f", "s16le",   # PCM16 little-endian
    "-ar", "24000",  # sample rate 24kHz
    "-ac", "1",      # mono
    "-i", pcm_path,
    "-codec:a", "libmp3lame",
    "-q:a", "4",
    mp3_path
], check=True)

print(f"Saved: {mp3_path}")
```

### Конвертация PCM в другие форматы

После получения PCM файла вы можете конвертировать его в различные форматы с помощью ffmpeg:

```bash
# Конвертация в MP3
ffmpeg -y -f s16le -ar 24000 -ac 1 -i output.pcm -codec:a libmp3lame -q:a 4 output.mp3

# Конвертация в WAV
ffmpeg -y -f s16le -ar 24000 -ac 1 -i output.pcm output.wav

# Конвертация в OGG
ffmpeg -y -f s16le -ar 24000 -ac 1 -i output.pcm -codec:a libvorbis output.ogg
```

## Важные требования

При работе с генерацией аудио необходимо соблюдать следующие требования:

1. **Потоковый режим обязателен**: Установите `"stream": true` в запросе
2. **Указание модальностей**: Обязательно укажите `"modalities": ["text", "audio"]`
3. **Конфигурация аудио**: Необходимо указать объект `audio` с параметрами `voice` и `format`
4. **Обработка потока**: Реализуйте корректную обработку SSE событий

## Лучшие практики

- **Выбор модели**: Используйте [`openai/gpt-audio-mini`](https://routerai.ru/models/openai/gpt-audio-mini) для быстрой генерации, [`openai/gpt-audio`](https://routerai.ru/models/openai/gpt-audio) для более качественного результата
- **Выбор голоса**: Тестируйте разные голоса для вашего use case - каждый голос имеет свои характеристики
- **Обработка ошибок**: Проверяйте статус ответа и корректность JSON в SSE событиях
- **Хранение**: Конвертируйте PCM в сжатые форматы (MP3, OGG) для экономии места
- **Системные промпты**: Используйте системные промпты для управления стилем и длиной ответа
- **Буферизация**: Накапливайте все chunks перед сохранением для получения полного аудио

## Устранение неполадок

**Нет аудио данных в ответе?**

- Убедитесь, что установлен `"stream": true`
- Проверьте наличие `"modalities": ["text", "audio"]` в запросе
- Убедитесь, что объект `audio` с параметрами `voice` и `format` указан корректно

**Ошибка при обработке потока?**

- Проверьте корректность парсинга SSE формата (строки начинаются с `"data: "`)
- Убедитесь, что обрабатываете событие `"data: [DONE]"` для завершения потока
- Проверьте корректность декодирования base64 данных

**Проблемы с воспроизведением аудио?**

- Убедитесь, что используете правильные параметры для PCM16: 16-bit, mono, 24kHz
- Проверьте, что все chunks были корректно декодированы и объединены
- Используйте ffmpeg для конвертации в стандартные форматы (MP3, WAV)

## Совместимость моделей

Генерация аудио доступна только для моделей OpenAI с поддержкой аудио выхода:

- [`openai/gpt-audio`](https://routerai.ru/models/openai/gpt-audio)
- [`openai/gpt-audio-mini`](https://routerai.ru/models/openai/gpt-audio-mini)
- [`openai/gpt-4o-audio-preview`](https://routerai.ru/models/openai/gpt-4o-audio-preview)

Для работы с аудио входными данными см. руководство [Аудио входные данные](/docs/guides/overview/multimodal/audio).
