Ръководство за API
Трите услуги на сайта – транскрипция с разпознаване на говорещите, дублаж на видео и озвучаване на текст – са достъпни и от вашите програми. Заявка с линк към записа или с текст, отговор с резултата. Един профил, един баланс на кредитите.
Съдържание
- Как да започнете
- Цена и ограничения
- Адрес и удостоверяване
- Профил
- — GET /v1/account
- Транскрипция
- — POST /v1/transcriptions
- — GET /v1/transcriptions/{id}
- Дублаж на видео
- — POST /v1/dubbings
- — GET /v1/dubbings/{id}
- Озвучаване на текст
- — POST /v1/speech
- — GET /v1/speech/{id}
- Грешки
- Примери
- Помощ
Как да започнете
- Регистрирайте се или влезте в сайта slusham.bg и потвърдете имейл адреса си.
- Купете кредити (API използва същите кредити като сайта).
- В потребителското меню отворете раздел „API“ и създайте ключ. Ключът се показва само веднъж – копирайте го веднага.
Цена и ограничения
- Транскрипция – 1 кредит за всяка започната минута от записа. Дублаж – 10 кредита за започната минута. Озвучаване на текст – 2 кредита за всеки започнати 1000 знака. През API няма безплатни минути или знаци.
- Балансът се проверява при създаване на задачата, кредитите се приспадат едва когато задачата е готова. Неуспешните задачи не струват нищо.
- Един запис – до 3 часа; размерът на файла не е ограничен (и видео от няколко GB). Файлът трябва да е достъпен на публичен https:// адрес.
- За файлове до 200 MB продължителността и цената се определят веднага; за по-големи – по време на обработката, затова в отговора
estimatedCreditsеnull. - Всеки резултат през API се появява и в списъка с вашите проекти в сайта.
Адрес и удостоверяване
Основен адрес: https://slusham.bg/api/v1. Към всяка заявка добавете заглавка X-API-Key: ak_… (или Authorization: Bearer ak_…).
Профил
GET /v1/account
Връща баланса на вашите кредити.
{ "credits": 120, "creditsPerMinute": 1 }
Транскрипция
POST /v1/transcriptions
Създава задача за транскрипция. Записът се изтегля от посочения адрес, измерва се продължителността, проверява се балансът. Записът се транскрибира на езика на този сайт.
{
"audioUrl": "https://example.com/recordings/call.mp3",
"fileName": "call.mp3",
"webhookUrl": "https://example.com/hooks/transcripts"
}
| Поле | Задължително | Описание |
|---|---|---|
audioUrl | да | Публичен https:// адрес на аудио или видео файл. |
fileName | не | Име в списъка с проекти. По подразбиране – последната част на адреса. |
webhookUrl | не | Публичен https:// адрес, на който се изпраща резултатът, когато задачата приключи (същият JSON като GET). Един опит, 10 s изчакване. |
Отговор 202 Accepted:
{
"id": "k3FgT9bQ2w",
"status": "queued",
"languageCode": "bg-BG",
"fileName": "call.mp3",
"durationSeconds": 1532,
"estimatedCredits": 26,
"pollUrl": "/v1/transcriptions/k3FgT9bQ2w"
}
GET /v1/transcriptions/{id}
Състояние или, когато е готово, цялата транскрипция. Състояния: queued, processing, completed, failed.
Докато се обработва:
{ "id": "k3FgT9bQ2w", "status": "processing", "progress": 40, "languageCode": "bg-BG", "fileName": "call.mp3", "durationSeconds": 1532 }
Когато е готово (?format=json, по подразбиране):
{
"id": "k3FgT9bQ2w",
"status": "completed",
"creditsCharged": 26,
"speakers": ["SPEAKER_00", "SPEAKER_01"],
"segments": [
{ "speaker": "SPEAKER_00", "start": 0.0, "end": 4.2, "text": "…" },
{ "speaker": "SPEAKER_01", "start": 4.2, "end": 7.9, "text": "…" }
],
"text": "…"
}
start и end са секунди. ?format=txt връща обикновен текст ([MM:SS] SPEAKER_00: текст), ?format=srt – субтитри във формат SubRip.
Дублаж на видео
POST /v1/dubbings
Създава задача за дублаж: записът се транскрибира, превежда и озвучава на избрания език, музиката и ефектите се запазват. Линкът към записа и правилата за размер са същите като при транскрипцията.
{
"audioUrl": "https://example.com/recordings/talk.mp4",
"targetLanguage": "en",
"sourceLanguage": "auto",
"keepBackground": true,
"originalVoices": false,
"fileName": "talk.mp4",
"webhookUrl": "https://example.com/hooks/dubbing"
}
| Поле | Задължително | Описание |
|---|---|---|
audioUrl | да | Публичен https:// адрес на аудио или видео файл. |
targetLanguage | да | Език на дублажа (двубуквен код): lt, lv, pl, et, sr, hu, sk, bg, en, de, fr, es, it, pt, nl, sv, da, nb, fi, cs, ro, uk, ru, tr. |
sourceLanguage | не | Език на оригинала (двубуквен код) или auto (по подразбиране). |
keepBackground | не | Запазване на музиката и фона (по подразбиране true); false – само глас. |
originalVoices | не | Дублираните гласове наподобяват говорещите в оригинала (по подразбиране false). |
fileName | не | Име в списъка с проекти. По подразбиране – последната част на адреса. |
webhookUrl | не | Публичен https:// адрес, на който се изпраща резултатът, когато задачата приключи (същият JSON като GET). Един опит, 10 s изчакване. |
Отговор 202 Accepted:
{ "id": "p8Dk2Qa1Lm", "kind": "dubbing", "status": "queued", "fileName": "talk.mp4", "durationSeconds": 184, "estimatedCredits": 40, "targetLanguage": "en", "sourceLanguage": "auto", "pollUrl": "/v1/dubbings/p8Dk2Qa1Lm" }
GET /v1/dubbings/{id}
Когато е готово, downloadUrl е дублираното видео (или аудио файл, ако е качено аудио); outputKind е video или audio.
{ "id": "p8Dk2Qa1Lm", "kind": "dubbing", "status": "completed", "targetLanguage": "en", "durationSeconds": 184, "creditsCharged": 40, "downloadUrl": "https://…/dubbed.mp4", "outputKind": "video", "segments": 42, "flaggedSegments": 0 }
Озвучаване на текст
POST /v1/speech
Озвучава текста с естествен глас и връща MP3. До 2 000 000 знака; дългите текстове се озвучават на части и се съединяват. Езикът на текста се разпознава автоматично.
{ "text": "…", "voice": "female", "fileName": "intro", "webhookUrl": "https://example.com/hooks/speech" }
| Поле | Задължително | Описание |
|---|---|---|
text | да | Текст за озвучаване (1–2 000 000 знака). |
voice | не | female (по подразбиране) или male. |
fileName | не | Име в списъка с проекти. По подразбиране – последната част на адреса. |
webhookUrl | не | Публичен https:// адрес, на който се изпраща резултатът, когато задачата приключи (същият JSON като GET). Един опит, 10 s изчакване. |
Отговор 202 Accepted:
{ "id": "s4Hn7Rt9Wq", "kind": "speech", "status": "queued", "characters": 1840, "voice": "female", "estimatedCredits": 4, "pollUrl": "/v1/speech/s4Hn7Rt9Wq" }
GET /v1/speech/{id}
Когато е готово, downloadUrl е MP3 файл; durationSeconds – продължителност на записа, characters – брой озвучени знаци.
{ "id": "s4Hn7Rt9Wq", "kind": "speech", "status": "completed", "characters": 1840, "durationSeconds": 131.4, "creditsCharged": 4, "downloadUrl": "https://…/full.mp3" }
Грешки
| Код | Значение |
|---|---|
missing_api_key | Липсва заглавка с ключ (401). |
invalid_api_key | Ключът не е намерен или е грешен (401). |
api_key_revoked | Ключът е изтрит (403). |
invalid_audio_url | Адресът не е https:// или е недостъпен (400). |
unsupported_media | Във файла не е открит звук (400). |
max_duration_exceeded | Записът е по-дълъг от 3 ч. (400). |
insufficient_credits | Недостатъчно кредити (402). В отговора: required, available, balance. |
not_found | Задачата не е намерена или принадлежи на друг профил (404). |
invalid_target_language | Липсващ или неподдържан език на дублажа (400). |
invalid_source_language | Грешен език на оригинала (400). |
invalid_text | Липсва текст или е по-дълъг от 2 000 000 знака (400). |
invalid_voice | Гласът трябва да е female или male (400). |
Примери
BASE=https://slusham.bg/api/v1
KEY=ak_...
curl -s $BASE/account -H "X-API-Key: $KEY"
curl -s -X POST $BASE/transcriptions -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{"audioUrl":"https://example.com/call.mp3"}'
curl -s $BASE/transcriptions/JOB_ID -H "X-API-Key: $KEY"
curl -s "$BASE/transcriptions/JOB_ID?format=srt" -H "X-API-Key: $KEY" -o call.srt
Проверявайте състоянието на всеки 10–30 s, докато status стане completed или failed.
import requests, time
BASE = "https://slusham.bg/api/v1"
H = {"X-API-Key": "ak_..."}
job = requests.post(f"{BASE}/transcriptions", headers=H,
json={"audioUrl": "https://example.com/call.mp3"}).json()
while True:
r = requests.get(f"{BASE}/transcriptions/{job['id']}", headers=H).json()
if r["status"] in ("completed", "failed"):
break
time.sleep(15)
print(r.get("text") or r.get("error"))
Помощ
Въпроси – pomosht@slusham.bg.