Kūrėjams

Kalbos transkribavimo API

Transkribuokite užbaigtus garso failus naudodami į eilę įtrauktas užduotis, nemokamus įverčius, idempotentišką pateikimą ir naudojimo stebėjimą abiejuose API serveriuose.

Šiame puslapyje
  1. Galiniai taškai
  2. Paruoškite garso failą
  3. Pateikite transkripcijos užduotį
  4. Idempotentiškumo raktas
  5. Gaukite įvertį nesukurdami užduoties
  6. Transkripcijos gavimas
  7. api.multitel.net naudojimas

Ši API transkribuoja užbaigtus garso failus kaip į eilę įtrauktas užduotis. Pateikite failą, išsaugokite grąžintą užduoties ID ir užklauskite užduoties, kol apdorojimas bus baigtas. Visas užklausas siųskite per HTTPS su savo paskyros prisijungimo duomenimis: pavyzdžiuose parodytais HTTP Basic duomenimis arba API prieigos raktu, kaip aprašyta skyriuje Autentifikavimas. Prisijungimo duomenis laikykite savo serveryje.

Galiniai taškai

Du API serveriai, https://api.multi.tel ir suderinamumo serveris https://api.multitel.net, naudoja tas pačias paskyrai priskirtas užduotis, idempotentiškumo raktus, apribojimus ir atsiskaitymą. Įkėlimo kodavimas ir atsakymo apvalkalas skiriasi, todėl nuosekliai naudokite vieną serverį su jam tinkamu analizatoriumi.

OperacijaMetodas ir kelias
Paslaugos informacijaGET /v3/speech_to_text
Pateikti užduotįPOST /v3/speech_to_text
Gauti įvertį nesukuriant užduotiesPOST /v3/speech_to_text/estimate
Gauti užduotįGET /v3/speech_to_text/JOB_ID
Apmokėti mokėjimo laukiančią užduotįPOST /v3/speech_to_text/JOB_ID/settle
NaudojimasGET /v3/speech_to_text/usage

Serveryje api.multi.tel visi keliai taip pat pasiekiami su prefiksu /v1/speech-to-text vietoj /v3/speech_to_text, pavyzdžiui, POST /v1/speech-to-text/estimate. Serveryje api.multitel.net naudokite /v3/speech_to_text kelius.

Paslaugos informacijos atsakyme pateikiami mode (batch), realtime (false), paidEnabled (ar šiuo metu priimamos naujos mokamos užduotys), pricePerMinuteUsd (0.005), billingUnit (audio_second), maxAudioSeconds (7200) ir maxUploadBytes (26214400) kartu su trumpu aprašymu lauke description. Šią informaciją gauti nemokama; tai veikia ir tada, kai mokamų užduočių pateikimas išjungtas. Atsakymas 503 transcription_unavailable grąžinamas tik tada, kai visa paslauga nepasiekiama.

Paruoškite garso failą

Naudokite užbaigtą garso failą, ne didesnį nei 25 MiB (26,214,400 baitų) ir ne ilgesnį nei 2 valandos (7,200 sekundžių). Pateikiant failas turi būti atpažįstamas kaip MP3, WAV, Ogg, FLAC, MOV arba Matroska medija su garso srautu, o metaduomenyse nurodyta trukmė turi būti didesnė už nulį ir ne ilgesnė nei 7,200 sekundžių. Atpažintas failas, neatitinkantis šių patikrų, atmetamas su 422 unsupported_audio. Failas, kurio nepavyksta perskaityti nė vienu iš šių formatų, šiuo metu gali būti atmestas su serverio klaida (500); tokio failo nepateikite pakartotinai jo nepakeitę. Vien failo plėtinys suderinamumo nepatvirtina.

Šių patikrų sėkmė negarantuoja, kad garsą pavyks dekoduoti. Garsas apdorojamas kaip vienas arba du kanalai. Failo, turinčio daugiau nei du garso kanalus, failo, kurio dekoduotas garsas ilgesnis nei 2 valandos, arba bet kurio kito failo, kurio dekoduoti apdorojant nepavyksta, užduotis baigiama būsena failed, paprastai su kodu decode_failed, ir mokestis netaikomas. Prieš pateikdami daugiakanalį garsą konvertuokite į monofoninį arba stereofoninį.

Neprivaloma kalbos užuomina yra mažosiomis raidėmis užrašytas dviejų arba trijų raidžių šnekamosios kalbos kodas, pavyzdžiui, en. Jei užuominos neteikiate, praleiskite lauką; api.multi.tel atmeta tuščią eilutę. Užuomina padeda apdoroti, bet netikrinama pagal palaikomų kalbų sąrašą, todėl naudokite galiojantį įraše vartojamos kalbos kodą.

Pateikite transkripcijos užduotį

Siųskite JSON su antrašte Content-Type: application/json adresu POST https://api.multi.tel/v3/speech_to_text. Užklausos turinys gali būti iki 35 MiB, kad jame tilptų didžiausio leidžiamo dydžio failas po base64 kodavimo; didesnis turinys atmetamas su 413.

LaukasReikšmė
audioBase64Privaloma. Visas failas standartiniu base64 formatu (A–Z, a–z, 0–9, +, /) su = užpildymu, kai jo reikia. Nepridėkite data-URL prefikso, eilučių lūžių ar tarpų ir nenaudokite URL saugaus simbolių rinkinio. Reikšmė turi būti dekoduojama į failą nuo 1 baito iki 25 MiB ir pakartotinai užkoduojama į lygiai tą patį tekstą.
languageNeprivaloma kalbos užuomina, kaip aprašyta pirmiau.

Bet kuri kita JSON savybė, įskaitant idempotency_key, atmetama su 400 invalid_transcription_request. Raktą siųskite antraštėje.

Idempotentiškumo raktas

Kiekvienam pateikimui būtina Idempotency-Key antraštė, turinti nuo 1 iki 190 simbolių. Naudokite ASCII raides, skaitmenis, -, _, . ir : be tarpų pradžioje ar pabaigoje: suderinamumo serveris pašalina aplinkinius tarpo simbolius ir matuoja raktą baitais, todėl kiti simboliai abiejuose serveriuose gali būti skaičiuojami skirtingai. Trūkstamas arba 191 ar daugiau simbolių turintis raktas atmetamas su 400.

Raktai priskiriami jūsų paskyrai ir kalbos transkribavimui abiejuose serveriuose bei naudojant visus jūsų paskyros prisijungimo duomenis. Pakartotinai siunčiant tą patį raktą su tuo pačiu failu ir kalba grąžinama esama užduotis su HTTP 200 ir duplicate: true, nepriklausomai nuo jos būsenos ir net jei apdorojimas buvo atnaujintas po užduoties sukūrimo, be pakartotinio mokesčio. Naudojant tą patį raktą su kitu failu arba kalba grąžinama 409 idempotency_conflict. Naujas raktas sukuria naują užduotį net identiškam failui; jei apdorojimas baigiamas sėkmingai, taikomas atskiras mokestis.

API_USER="your-api-username"
API_PASSWORD="your-api-password"

node -e 'process.stdout.write(JSON.stringify({audioBase64:require("node:fs").readFileSync("completed-call.mp3").toString("base64"),language:"en"}))' > completed-call.json

curl --fail-with-body --silent --show-error --user "$API_USER:$API_PASSWORD" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: speech-call-001" \
  --data-binary @completed-call.json \
  -o speech-job.json \
  https://api.multi.tel/v3/speech_to_text

node -p 'JSON.parse(require("node:fs").readFileSync("speech-job.json","utf8")).data.id'

Nauja užduotis grąžina HTTP 202 su toliau parodytais laukais, o pakartotinis pateikimas grąžina HTTP 200 su visu užduoties objektu, aprašytu skyriuje Transkripcijos gavimas. Užduoties ID, UUID, skaitykite iš data.id. Naujos užduoties atsakymas atrodo taip (identifikatorius ir reikšmės yra pavyzdžiai):

{
  "status": "success",
  "data": {
    "id": "3f6c1b2e-8a4d-4e7f-9c21-5b0d7e4a9f13",
    "status": "queued",
    "mode": "batch",
    "realtime": false,
    "source": "api",
    "durationSeconds": 90.5,
    "billedSeconds": 91,
    "costUsd": "0.007583334",
    "pricePerMinuteUsd": "0.005"
  }
}

Kol užduotis yra eilėje arba vykdoma, durationSeconds, billedSeconds ir costUsd yra įverčiai iš failo metaduomenų. Galutinis mokestis apskaičiuojamas pagal dekoduotą trukmę.

Pateikimas taip pat gali grąžinti 402 insufficient_balance, kai išankstinio mokėjimo likučio nepakanka šiai užduočiai kartu su kitomis nebaigtomis jūsų užduotimis, 429 transcription_queue_full, kai jūsų paskyroje arba paslaugoje yra per daug nebaigtų užduočių, 429 audio_validation_busy, kai failų tikrinimo pajėgumai išnaudoti, ir 503 paid_transcription_not_enabled, kai mokama transkripcija išjungta. Gavę 429 ar 503 atsakymą, vėliau bandykite dar kartą su tuo pačiu raktu.

Gaukite įvertį nesukurdami užduoties

Siųskite tą patį JSON turinį adresu POST https://api.multi.tel/v3/speech_to_text/estimate. Idempotentiškumo raktas nereikalingas. Įvertis patikrina ir išmatuoja failą, bet jo netranskribuoja, nesukuria užduoties, nerezervuoja lėšų, netikrina likučio ir neapmokestina paskyros. language užuomina priimama, bet įverčiui įtakos neturi.

Sėkmingas įvertis grąžina HTTP 200 su laukais estimate: true, charged: false, mode, realtime, durationSeconds, billedSeconds, pricePerMinuteUsd ir costUsd objekte data. Naudojama failo metaduomenyse nurodyta trukmė, o už baigtą užduotį mokestis skaičiuojamas pagal dekoduotą trukmę, kuri gali skirtis. Įverčiams taikomos tos pačios failo patikros kaip ir pateikiamoms užduotims. Jie pasiekiami tik kai mokama transkripcija įjungta (kitu atveju 503 paid_transcription_not_enabled). Jie gali grąžinti 429 audio_validation_busy, kai failų tikrinimo pajėgumai išnaudoti; trumpai palaukę bandykite dar kartą.

Transkripcijos gavimas

Periodiškai užklauskite GET /v3/speech_to_text/JOB_ID, kaip aprašyta užduočių eigos vadove. Užduoties objektas turi šiuos laukus:

LaukasReikšmė
idUžduoties UUID.
statusqueued, running, completed, failed arba awaiting_payment.
progressProcentas nuo 0 iki 99 vykdant, kai pasiekiamas; 100 užbaigus; kitu atveju null.
durationSeconds, billedSecondsGarso trukmė ir apmokestinamos sveikos sekundės. Kol užduotis yra eilėje arba vykdoma, tai metaduomenų įverčiai; kai ji baigta arba laukia mokėjimo, naudojama dekoduota trukmė.
costUsd, costIsEstimateKaina JAV doleriais kaip dešimtainė eilutė su devyniais skaitmenimis po kablelio. costIsEstimate yra true, kol užduotis yra eilėje arba vykdoma. Nepavykusi užduotis neapmokestinama, nors jos costUsd vis dar rodo įvertį.
pricePerMinuteUsd0.005 API užduotims ir 0.000 nemokamoms Hosted PBX įrašų užduotims.
failureCodeNepavykusiai užduočiai: decode_failed (garso nepavyko dekoduoti, pavyzdžiui, nes jis turi daugiau nei du kanalus arba dekoduotas yra ilgesnis nei 2 valandos), inference_timeout (apdorojimas truko per ilgai), service_error arba worker_lease_lost (apdorojimas nutrauktas). Taip pat apibrėžti kodai unsupported_audio ir quality_check_failed. Mokėjimo laukianti užduotis rodo insufficient_balance, kuris gali likti ir apmokėjus užduotį.
source, modelVersion, createdAtsource yra api API pateikimams arba hpbx jūsų paskyros Hosted PBX įrašo užduočiai. modelVersion yra neinterpretuojama apdorojimo versijos eilutė. createdAt yra pateikimo laikas.
duplicatetrue atsakymuose, kurie grąžina esamą užduotį.
resultPateikiamas tik kai status yra completed.
Rezultato laukasReikšmė
textVisa transkripcija: visų segmentų tekstai sujungti eilučių lūžiais segmentų tvarka.
segmentsSegmentų masyvas, surikiuotas pagal pradžios laiką. Kiekvienas segmentas apima iki maždaug 29 sekundžių garso atkarpą. Jo start ir end (sekundėmis nuo garso pradžios) žymi tą atkarpą, o ne atskirus žodžius ar sakinius; gretimos atkarpos gali persidengti iki 1 sekundės. Kiekvienas segmentas taip pat turi text ir language (kalbos kodą, kuris gali būti tuščias), taip pat channel dviejų kanalų rezultatams.
channelCount1 arba 2. Pateikiamas dabartiniuose rezultatuose; senesniuose gali jo nebūti.
audioDurationMsDekoduota trukmė milisekundėmis. Atsiskaitymui ji apvalinama aukštyn iki sveikų sekundžių.
qualityFlagsTuščias arba review_recommended kartu su repetition_detected (frazė neįprastai dažnai kartojasi vienoje atkarpoje), no_speech (kalba nebuvo transkribuota), arba abu.
pipelineVersionGali būti pateiktas. Neinterpretuojamas apdorojimo identifikatorius.

Transkripcijos, jų laiko žymos, kalbos ir kanalų žymos sukuriamos automatiškai, todėl tikslumas negarantuojamas. Bet kurį kokybės požymį laikykite priežastimi peržiūrėti rezultatą, o svarbius vardus, skaičius ir įsipareigojimus palyginkite su originaliu garsu. Ilgi tylos ir labai tylūs tarpai praleidžiami ir nesukuria segmentų. Rezultatai neidentifikuoja atskirų kalbėtojų. Kai rezultato channelCount yra 2, kiekvienas segmentas turi channel reikšmę A (pirmasis, arba kairysis, kanalas) arba B (antrasis, arba dešinysis, kanalas). Tai atskiria kalbėtojus tik tada, kai kiekvienas buvo įrašytas atskirame kanale. Už dviejų kanalų garsą mokestis taikomas vieną kartą pagal praėjusią trukmę, o ne už kiekvieną kanalą. Monofoninių rezultatų kanalai nežymimi.

api.multitel.net naudojimas

Suderinamumo galinis taškas POST https://api.multitel.net/v3/speech_to_text priima multipart/form-data su audio failo dalimi ir neprivalomu language lauku vietoj JSON audioBase64. Tuščia language reikšmė laikoma užuominos nebuvimu. Siųskite tą pačią Idempotency-Key antraštę. Jei jos nėra, šis serveris taip pat priima idempotency_key formos lauką. Laukai, pavadinti source, free, billing_source, realtime arba stream, atmetami su 400 unsupported_transcription_option; kiti formos laukai ignoruojami. Šis serveris taip pat grąžina šias klaidas:

  • 400 idempotency_key_required, kai rakto nėra arba jis per ilgas.
  • 400 audio_upload_required, kai įkeliamo failo nėra arba jis gautas ne visas.
  • 400 invalid_language, kai kalba negaliojanti.
  • 413 invalid_audio_size, kai failas tuščias arba per didelis.
  • 400 invalid_job, kai užduoties ID formatas netaisyklingas.

Šio serverio kalbos transkribavimo paslaugos atsakymai naudoja apvalkalą {"status":{"code":HTTP_STATUS},"response":{...}}. Atminkite, kad status yra objektas, o ne eilutė. Sėkmės atveju response turi tą patį objektą kaip data pagrindiniame serveryje, todėl užduoties ID yra response.id. Klaidos atveju response.code turi klaidos kodą; pranešimas ir užklausos ID nepateikiami. Autentifikavimo klaidas (401) grąžina bendroji serverio prisijungimo patikra; jų turinys gali skirtis, todėl prieš analizuodami patikrinkite HTTP būseną. Nekeiskite įkėlimo kodavimo ar atsakymų analizatoriaus tarp serverių.

Norėdami gauti įvertį šiame serveryje, siųskite tuos pačius multipart laukus POST užklausa adresu /v3/speech_to_text/estimate. Idempotentiškumo raktas nereikalingas; įvertis pateikiamas objekte response.

API_USER="your-api-username"
API_PASSWORD="your-api-password"

curl --fail-with-body --silent --show-error --user "$API_USER:$API_PASSWORD" \
  -H "Idempotency-Key: speech-call-001" \
  -F "audio=@completed-call.mp3" -F "language=en" \
  -o speech-job.json \
  https://api.multitel.net/v3/speech_to_text

node -p 'JSON.parse(require("node:fs").readFileSync("speech-job.json","utf8")).response.id'