codai docs
Gateway

Operații media

Operațiile media din codai Studio — elimini fundalul, mărești rezoluția, repictezi zone, separi pistele, reduci zgomotul, faci mastering, transformi audio în MIDI și generezi muzică sau efecte sonore din asset-urile tale.

Operațiile media transformă un asset Studio în altele noi: decupezi un subiect, mărești o imagine, repictezi o zonă mascată, separi o melodie în piste, cureți o voce, faci masterul unui mix, transformi o melodie în MIDI sau generezi o melodie ori un efect sonor. Fiecare operație primește id-uri de asset-uri și parametri stricți, specifici operației, iar fiecare rezultat se salvează ca asset nou în biblioteca ta. Id-ul public al modelului este codai-studio-media.

MetodăCaleRezultat
GET/v1/studio/media-opsCatalogul operațiilor: motor, mod, intrări, available, un preț de listă (gratuit)
POST/v1/studio/media-ops/{op}/quotePrețul exact al unei cereri; nu se rezervă și nu se taxează nimic
POST/v1/studio/media-ops/{op}200 cu rezultatele (operații sincrone) sau 202 cu un job (operații asincrone)
GET/v1/studio/media-ops/jobs/{id}Un job asincron; unul terminat se finalizează când îl citești

{op} este id-ul operației cu puncte, de exemplu image.remove_background sau audio.separate_stems.

Operațiile

OperațieIntrăriRezultatModMotor
image.remove_background1 imagineDecupaj PNG / WebP cu transparențăsyncBiRefNet
image.upscale1 imagineImaginea ×2 sau ×4 (cel mult 64 MP)syncReal-ESRGAN x4plus
image.inpaintimagine + mască PNGImaginea cu zona albă a măștii repictată după promptsyncGemini image edit
image.eraseimagine + mască PNGImaginea fără obiectul mascatsyncGemini image edit
image.outpaint1 imagineScena extinsă la un nou aspect_ratiosyncGemini image edit
audio.separate_stems1 audio4 piste (voce, tobe, bas, restul) sau 2 (voce, acompaniament)asyncDemucs (htdemucs)
audio.denoise1 audioAcelași audio fără zgomotul de fondasyncDeepFilterNet 3
audio.to_midi1 audioUn fișier MIDI standard (kind: "midi")asyncBasic Pitch
audio.master1 audioUn master cu loudness normalizat (WAV sau MP3)asyncffmpeg loudnorm, 2 treceri + limitator
audio.analyze1 audioDoar JSON: BPM, tonalitate, loudness, vârfsynclibrosa + pyloudnorm
music.generate_ace0–1 audioO melodie dintr-un prompt de stil și versuri opționaleasyncACE-Step 1.5
music.repaint1 audioMelodia cu o secțiune înlocuităasyncACE-Step 1.5
music.extend1 audioMelodia continuată cu extend_secondsasyncACE-Step 1.5
music.cover1 audioPropria melodie într-un alt stilasyncACE-Step 1.5
sfx.generateniciunaUn efect sonor dintr-un promptasyncACE-Step 1.5

Operațiile pe imagini acceptă asset-uri image, upload și frame (PNG, JPEG sau WebP); cele audio acceptă asset-uri music, speech, sfx și upload. La image.inpaint și image.erase al doilea asset este o mască PNG alb-negru a primului: albul se editează, negrul rămâne neschimbat. Masca ajunge la model ca imagine de referință, așa că editarea o urmează îndeaproape, dar nu la pixel (intrarea din catalog are o note care spune asta).

Parametri

Parametrii se validează strict pentru fiecare operație — o cheie necunoscută dă 400.

OperațieParametri (impliciți)
image.remove_backgroundformat: png | webp (png)
image.upscalescale: 2 | 4 (4)
image.inpaintprompt (obligatoriu), model, image_size: 1K | 2K | 4K
image.eraseprompt (indiciu opțional), model, image_size
image.outpaintaspect_ratio (obligatoriu: 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, 9:21), prompt, model, image_size
audio.separate_stemsstems: 2 | 4 (4)
audio.denoisestrength: 0–1 (1)
audio.to_midionset_threshold: 0.05–0.95 (0.5), min_note_ms: 10–1000 (58)
audio.mastertarget_lufs: -14 | -16 | -23 (-14), true_peak_db: −3…−0.1 (-1), format: wav | mp3 (wav)
audio.analyzeniciunul
music.generate_aceprompt (obligatoriu, ≤ 1000 caractere), lyrics (≤ 4000), duration_seconds: 10–240 (60), bpm: 40–220, key, language (en, ro, es, fr, de, it, pt, ja, ko, zh), seed
music.repaintprompt, lyrics, start_seconds, end_seconds (după început, în interiorul melodiei), seed
music.extendprompt, lyrics, extend_seconds: 5–120, seed
music.coverprompt, lyrics, strength: 0–1 (0.8), seed
sfx.generateprompt (obligatoriu), duration_seconds: 1–30 (5), seed

Rularea unei operații

curl https://ai.codai.ro/v1/studio/media-ops/image.remove_background \
  -H "Authorization: Bearer $CODAI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: cutout-42" \
  -d '{ "asset_ids": ["3f2b8c1e-0000-4000-8000-000000000001"], "params": { "format": "png" } }'

O operație sincronă răspunde 200:

{
  "object": "media_op.result",
  "op": "image.remove_background",
  "status": "ready",
  "outputs": [{ "asset_id": "…", "kind": "image", "mime_type": "image/png", "url": "https://…" }],
  "analysis": null,
  "cost_micro_usd": 2640
}

audio.analyze nu salvează nimic și întoarce analysis: { duration_seconds, bpm, key, key_confidence, integrated_lufs, sample_peak_dbfs }.

Joburi asincrone

Separarea pistelor, reducerea zgomotului, MIDI, masteringul și toate operațiile de muzică sau efecte sonore rulează ca joburi. Rularea răspunde 202 cu { "object": "media_op.job", "id", "status": "pending", … }. Interoghează GET /v1/studio/media-ops/jobs/{id} până când status devine ready (cu outputs, câte un asset pe pistă la separare) sau failed (cu error: timeout, input_refused, dispatch_failed, store_failed sau un mesaj al motorului). Un job care nu a produs rezultat în 20 de minute eșuează cu timeout. Citirea unui job terminat îi salvează rezultatele și îl taxează o singură dată; procesul de fundal face același lucru dacă nu întreabă nimeni. Rulează cel mult 3 joburi asincrone simultan pe cont — al patrulea primește 429 cu Retry-After.

Prețuri

Fiecare operație are o cotație — plafonul de preț — care se rezervă din portofel înainte de orice rulare; dacă portofelul nu o acoperă, răspunsul este 402 insufficient_funds și nu pornește nimic. După operație se taxează o singură dată costul măsurat, iar restul rezervării se eliberează; o operație eșuată eliberează toată rezervarea.

  • Operațiile GPU / CPU (toate în afară de editările de imagine Gemini) se taxează după timpul de instanță pe serviciul media codai Studio: 0,95 $ pe oră, cel puțin 5 secunde pe operație, estimat din lungimea intrării (de exemplu audio.separate_stems ≈ 15 s + 0,5 s pe secundă de intrare). Plătești secundele raportate de motor, niciodată mai mult decât cotația.
  • image.inpaint / erase / outpaint se taxează ca o editare de imagine cu model și image_size alese.

GET /v1/studio/media-ops listează o cotație de referință pentru fiecare operație (parametri impliciți, 60 s de audio sau o imagine de 1024×1024) ca quote_micro_usd, iar suma din portofel ca quote_micro_eur; POST …/{op}/quote stabilește prețul cererii tale reale, cu aceeași validare ca la rulare.

Erori

StareCând
400Corp sau parametri greșiți, număr sau tip greșit de asset-uri, o mască ce nu e PNG, o mărire peste 64 MP, end_seconds înainte de start_seconds
402 insufficient_fundsCotația nu încape în portofel
404Id de operație necunoscut sau un asset care nu există, nu e gata ori nu e al tău
429Trei joburi asincrone deja în lucru sau limita de cereri a cheii
502Motorul a eșuat
503 media_ops_unavailableBanda operației nu e configurată pe acest gateway (available: false în catalog); nu se rezervă și nu se taxează nimic
503 assets_unavailableStocarea asset-urilor nu e configurată

Marcaj AI și proveniență

Fiecare rezultat e marcat ca generat de AI înainte de salvare: C2PA / XMP pe imagini, etichete RIFF INFO sau ID3 pe audio, plus metadatele de obiect ai-generated. Fiecare rezultat păstrează și de unde provine — parent_asset_id (prima intrare), op și op_inputs (asset_ids + parametrii validați) — ca să poți urmări oricând o pistă, un master sau un decupaj până la sursă. Generează cover-uri doar din muzică pe care o deții sau pentru care ai drepturi.

SDK-uri

const job = await codai.mediaOps.run('audio.separate_stems', { assetIds: [songId], params: { stems: 4 } });
const done = await codai.mediaOps.wait(job.id); // sau mediaOps.runAndWait(...)
done = client.media_ops.run_and_wait("audio.master", [mix_id], {"target_lufs": -14})

TypeScript: mediaOps.list / quote / run / job / wait / runAndWait. Python: media_ops.list / quote / run / job / wait / run_and_wait. Melodiile și podcasturile construite din aceste rezultate se editează ca creații audio și se randează într-un mix masterizat cu creatives.renderAudio; versurile vin din scriitorul de versuri.

Pe această pagină