Озвучка и расшифровка речи
Обновлено:
Два эндпоинта в формате OpenAI Audio API: POST /v1/audio/speech превращает текст в речь, POST /v1/audio/transcriptions — речь в текст. Ключ sk-heli-… и рублёвый кошелёк те же, что для чата. Официальные SDK OpenAI работают, если указать base URL https://getheli.ru/v1.
Коротко
Озвучить текст или расшифровать запись через API из России можно в Heli: эндпоинты /v1/audio/speech и /v1/audio/transcriptions в формате OpenAI, оплата в рублях с того же баланса, что и чат. Озвучка списывается по символам текста, секундам готового аудио или токенам, расшифровка — по длительности записи или токенам, в зависимости от модели. Файл для расшифровки — до 25 МБ.
Какие модели есть
Все модели озвучки и расшифровки — в каталоге (фильтр «Аудио») и в разделе «Модели» кабинета. Через API их отдаёт GET /v1/models: у озвучки kind: "speech", у расшифровки kind: "transcription".
Озвучка: Gemini 3.8 Flash TTS, Speech 2.8 HD, Qwen-Audio-3.0-TTS Flash, Voxtral TTS 3.
Расшифровка: Whisper Large V3 Turbo, GPT-4o Transcribe, GPT-4o Mini Transcribe, Gemini 3.5 Transcribe, Voxtral Small Transcribe 3.
curl https://getheli.ru/v1/models \
-H "Authorization: Bearer sk-heli-…"
# в ответе у каждой модели kind и цена в рублях:
# { "id": "elevenlabs/eleven-v3", "kind": "speech",
# "pricing": { "currency": "RUB", "per_1k_chars": 12.6, ... } }Цена в рублях — в pricing. Единица зависит от модели: per_1k_chars — за 1 тыс. символов текста, per_minute — за минуту аудио (у расшифровки входного, у озвучки готового), input_per_1m и output_per_1m — за 1 млн токенов.
Озвучка: POST /v1/audio/speech
Ответ — сам аудиофайл, не JSON. Content-Type: audio/mpeg для mp3, audio/pcm для pcm.
| Параметр | Что делает |
|---|---|
model | Слаг модели с kind = speech из GET /v1/models или каталога. Обязательный. |
input | Текст для озвучки. У некоторых моделей — список реплик для нескольких голосов. |
voice | Голос. Набор голосов свой у каждой модели (см. ниже). |
response_format | mp3 или pcm. По умолчанию pcm: 24 кГц, 16 бит, моно, без заголовка. |
instructions | Как читать: тон, темп, эмоция. Поддерживают Gemini TTS, Fish Audio и часть других. |
speed | Скорость, 1.0 по умолчанию. Модели без управления скоростью вернут 400. |
curl https://getheli.ru/v1/audio/speech \
-H "Authorization: Bearer sk-heli-…" \
-H "Content-Type: application/json" \
-d '{
"model": "google/gemini-3.8-flash-tts",
"input": "Здравствуйте! Ваш заказ передан в доставку.",
"voice": "Kore",
"instructions": "спокойно и дружелюбно",
"response_format": "pcm"
}' \
--output speech.pcmfrom openai import OpenAI
client = OpenAI(base_url="https://getheli.ru/v1", api_key="sk-heli-…")
with client.audio.speech.with_streaming_response.create(
model="microsoft/mai-voice-2.1",
voice="en-US-Harper:MAI-Voice-2.1",
input="Welcome to the event!",
response_format="mp3",
) as response:
response.stream_to_file("speech.mp3")Голоса. У Gemini TTS — имена вроде Kore и Puck. У MAI-Voice — полный id голоса с суффиксом модели, например en-US-Harper:MAI-Voice-2.1; язык речи задаёт локаль голоса. Gemini TTS и HeyGen Voice отдают только pcm, MiniMax — только mp3: другой формат вернёт 400.
Старые id tts-1 и tts-1-hd принимаются и уходят в модель озвучки по умолчанию. Голоса OpenAI вроде alloy у неё не работают, поэтому лучше сразу указать модель и её голос.
Длинный текст разбивайте на абзацы и склеивайте аудио: так быстрее первый звук и меньше риск таймаута.
Расшифровка: POST /v1/audio/transcriptions
Принимает multipart/form-data, как у OpenAI. Файл — до 25 МБ: это примерно 26 минут mp3 128 кбит/с или больше двух часов голосовых в opus. Несжатый wav заполняет лимит быстрее, около 13 минут.
| Параметр | Что делает |
|---|---|
file | Аудиофайл: mp3, wav, m4a, ogg, webm, flac, aac. До 25 МБ. |
model | Слаг модели с kind = transcription. Обязательный. |
language | Код языка ISO-639-1, например ru. Без него язык определяется сам. |
response_format | json (по умолчанию) или verbose_json с сегментами и длительностью. |
timestamp_granularities[] | segment и/или word — метки времени в verbose_json. |
temperature | От 0 до 1. |
curl https://getheli.ru/v1/audio/transcriptions \
-H "Authorization: Bearer sk-heli-…" \
-F model="openai/whisper-large-v3-turbo" \
-F file="@meeting.mp3" \
-F language="ru"from openai import OpenAI
client = OpenAI(base_url="https://getheli.ru/v1", api_key="sk-heli-…")
with open("meeting.mp3", "rb") as audio:
result = client.audio.transcriptions.create(
model="openai/whisper-large-v3-turbo",
file=audio,
language="ru",
)
print(result.text)Можно прислать и JSON с аудио в base64 в поле input_audio:
curl https://getheli.ru/v1/audio/transcriptions \
-H "Authorization: Bearer sk-heli-…" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/whisper-large-v3-turbo",
"input_audio": { "data": "<base64 без префикса data:>", "format": "mp3" },
"response_format": "verbose_json",
"timestamp_granularities": ["segment"]
}'Ответ:
{
"text": "Коллеги, начинаем планёрку.",
"usage": { "seconds": 9.2, "input_tokens": 83, "output_tokens": 30, "total_tokens": 113 }
}Форматы text, srt и vtt не поддерживаются: возьмите verbose_json и соберите субтитры из segments. Записи длиннее нескольких минут надёжнее резать на части. Алиас whisper-1 ведёт на openai/whisper-1.
Цены и списание
Списываем фактическую стоимость запроса в рублях по тарифу из каталога: озвучку — по символам текста, секундам готового аудио или токенам (в зависимости от модели), расшифровку — по длительности записи или токенам. Перед запросом на балансе резервируется небольшая сумма, после ответа резерв заменяется точным списанием. Если запрос не удался, деньги не списываются. Каждый запрос виден в кабинете в разделе «Расходы».
При нулевом балансе API вернёт 402. Пополнить баланс.
Ошибки
| Код | Что значит |
|---|---|
| 400 | Неверный голос, формат или параметр, который модель не поддерживает. Текст ошибки подскажет, что поправить. |
| 402 | На балансе не хватает денег. Пополните кошелёк в кабинете. |
| 404 | Модели нет в каталоге Heli. Возьмите слаг из GET /v1/models. |
| 413 | Файл больше 25 МБ. Сожмите его в mp3 или opus или разрежьте на части. |
| 429 | Слишком много запросов. Повторите через несколько секунд. |
| 502 / 503 | Временный сбой модели. Повторите запрос, деньги за него не списываются. |
Ошибки приходят в формате OpenAI: { "error": { "message", "type", "code" } }. Общие коды — в справочнике API.