Ръководство за API

Трите услуги на сайта – транскрипция с разпознаване на говорещите, дублаж на видео и озвучаване на текст – са достъпни и от вашите програми. Заявка с линк към записа или с текст, отговор с резултата. Един профил, един баланс на кредитите.

Съдържание

Как да започнете

  1. Регистрирайте се или влезте в сайта slusham.bg и потвърдете имейл адреса си.
  2. Купете кредити (API използва същите кредити като сайта).
  3. В потребителското меню отворете раздел „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.