Programeri

API za pretvaranje govora u tekst

Transkribirajte dovršene audiodatoteke kroz zadatke u redu za obradu, uz besplatne procjene, idempotentno slanje i praćenje potrošnje na oba API poslužitelja.

Na ovoj stranici
  1. Krajnje točke
  2. Priprema audiodatoteke
  3. Slanje zadatka transkripcije
  4. Ključ idempotentnosti
  5. Procjena bez stvaranja zadatka
  6. Dohvat transkripta
  7. Korištenje poslužitelja api.multitel.net

Ovaj API transkribira dovršene audiodatoteke kao zadatke u redu za obradu. Pošaljite datoteku, sačuvajte vraćeni ID zadatka i dohvaćajte zadatak dok obrada ne završi. Svaki zahtjev šaljite putem HTTPS-a s vjerodajnicama svojeg računa: vjerodajnicama za HTTP Basic kao u primjerima ili API tokenom, kako je opisano u odjeljku Autentifikacija. Vjerodajnice čuvajte na svojem poslužitelju.

Krajnje točke

Dva API poslužitelja, https://api.multi.tel i poslužitelj za kompatibilnost https://api.multitel.net, dijele iste zadatke, ključeve idempotentnosti, ograničenja i naplatu unutar računa. Razlikuju se po kodiranju prijenosa i omotnici odgovora, pa dosljedno koristite jedan poslužitelj s odgovarajućim parserom.

RadnjaMetoda i putanja
Informacije o usluziGET /v3/speech_to_text
Slanje zadatkaPOST /v3/speech_to_text
Procjena bez stvaranja zadatkaPOST /v3/speech_to_text/estimate
Dohvat zadatkaGET /v3/speech_to_text/JOB_ID
Podmirivanje zadatka koji čeka plaćanjePOST /v3/speech_to_text/JOB_ID/settle
PotrošnjaGET /v3/speech_to_text/usage

Na poslužitelju api.multi.tel svaka je putanja dostupna i s prefiksom /v1/speech-to-text umjesto /v3/speech_to_text, primjerice POST /v1/speech-to-text/estimate. Na poslužitelju api.multitel.net koristite putanje /v3/speech_to_text.

Odgovor s informacijama o usluzi navodi mode (batch), realtime (false), paidEnabled (prihvaćaju li se trenutačno nova slanja koja se naplaćuju), pricePerMinuteUsd (0.005), billingUnit (audio_second), maxAudioSeconds (7200) i maxUploadBytes (26214400), uz kratak opis u polju description. Dohvat je besplatan i radi dok su slanja koja se naplaćuju onemogućena; vraća 503 transcription_unavailable samo kada je usluga u cijelosti nedostupna.

Priprema audiodatoteke

Koristite dovršenu audiodatoteku veličine najviše 25 MiB (26,214,400 bajtova) i trajanja najviše 2 sata (7,200 sekundi). Pri slanju datoteka mora biti prepoznata kao MP3, WAV, Ogg, FLAC, MOV ili Matroska medijski zapis koji sadrži audiozapis, s trajanjem u metapodacima većim od nule i ne duljim od 7,200 sekundi. Prepoznata datoteka koja ne zadovolji ove provjere odbija se uz 422 unsupported_audio. Datoteka koja se ne može pročitati ni u jednom od tih formata trenutačno se umjesto toga može odbiti uz pogrešku poslužitelja (500); nemojte je ponovno slati bez izmjena. Sam nastavak naziva datoteke ne potvrđuje kompatibilnost.

Prolazak ovih provjera ne jamči da se zvuk može dekodirati. Zvuk se obrađuje kao jedan ili dva kanala. Datoteka s više od dva audiokanala, datoteka čiji je dekodirani zvuk dulji od 2 sata ili bilo koja druga datoteka čije dekodiranje ne uspije tijekom obrade završava kao zadatak sa statusom failed, obično s kodom decode_failed, i ne naplaćuje se. Prije slanja pretvorite višekanalni zvuk u mono ili stereo.

Neobavezna naznaka jezika jest dvoslovni ili troslovni kod malim slovima za jezik koji se govori, primjerice en. Ako ne želite navesti naznaku, izostavite polje; api.multi.tel odbija prazan niz znakova. Naznaka usmjerava obradu, ali se ne provjerava prema popisu podržanih jezika, pa koristite valjan kod za jezik koji se govori.

Slanje zadatka transkripcije

Pošaljite JSON sa zaglavljem Content-Type: application/json na POST https://api.multi.tel/v3/speech_to_text. Tijelo zahtjeva može imati najviše 35 MiB, što omogućuje prijenos datoteke najveće dopuštene veličine nakon kodiranja base64; veće tijelo odbija se uz 413.

PoljeZnačenje
audioBase64Obavezno. Cijela datoteka u standardnom kodiranju base64 (A–Z, a–z, 0–9, +, /) s dopunom = kada je potrebna. Nemojte dodavati prefiks data-URL, prijelome redaka ni razmake i nemojte koristiti abecedu sigurnu za URL. Vrijednost se mora dekodirati u podatke veličine od 1 bajta do 25 MiB te pri ponovnom kodiranju dati potpuno isti tekst.
languageNeobavezna naznaka jezika, kako je opisano iznad.

Svako drugo JSON svojstvo, uključujući idempotency_key, odbija se uz 400 invalid_transcription_request. Ključ pošaljite kao zaglavlje.

Ključ idempotentnosti

Za svako slanje potrebno je zaglavlje Idempotency-Key duljine od 1 do 190 znakova. Koristite ASCII slova, znamenke, -, _, . i :, bez početnih ili završnih razmaka: poslužitelj za kompatibilnost uklanja okolne bjeline i mjeri ključ u bajtovima, pa se ostali znakovi na svakom poslužitelju mogu brojiti drukčije. Ključ koji nedostaje ili ima 191 ili više znakova odbija se uz 400.

Ključevi su ograničeni na vaš račun i uslugu pretvaranja govora u tekst, na oba poslužitelja i za sve vjerodajnice vašeg računa. Ponovno slanje istog ključa s istom datotekom i jezikom vraća postojeći zadatak uz HTTP 200 i duplicate: true, neovisno o njegovu statusu i čak ako je obrada ažurirana nakon stvaranja zadatka, bez ponovne naplate. Ponovna upotreba ključa s drugom datotekom ili jezikom vraća 409 idempotency_conflict. Novi ključ stvara novi zadatak čak i za istu datoteku, uz zasebnu naplatu ako obrada uspješno završi.

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'

Novi zadatak vraća HTTP 202 s poljima prikazanima u nastavku, a ponovljeni zahtjev vraća HTTP 200 s cijelim objektom zadatka opisanim u odjeljku Dohvat transkripta. ID zadatka, koji je UUID, pročitajte iz polja data.id. Odgovor za novi zadatak izgleda ovako (identifikator i vrijednosti služe kao primjeri):

{
  "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"
  }
}

Dok je zadatak u redu za obradu ili se izvršava, durationSeconds, billedSeconds i costUsd su procjene iz metapodataka datoteke. Konačna naplata koristi dekodirano trajanje.

Slanje može vratiti i 402 insufficient_balance kada unaprijed plaćeno stanje ne može pokriti zadatak zajedno s vašim ostalim nedovršenim zadacima, 429 transcription_queue_full kada vaš račun ili usluga ima previše nedovršenih zadataka, 429 audio_validation_busy kada su kapaciteti za provjeru datoteka popunjeni te 503 paid_transcription_not_enabled dok je transkripcija koja se naplaćuje onemogućena. Za odgovore 429 i 503 pokušajte ponovno kasnije s istim ključem.

Procjena bez stvaranja zadatka

Pošaljite isto JSON tijelo na POST https://api.multi.tel/v3/speech_to_text/estimate. Ključ idempotentnosti nije potreban. Procjena provjerava i mjeri datoteku, ali je ne transkribira, ne stvara zadatak, ne rezervira sredstva, ne provjerava vaše stanje i ne tereti vaš račun. Naznaka language prihvaća se, ali ne utječe na procjenu.

Uspješna procjena vraća HTTP 200 s poljima estimate: true, charged: false, mode, realtime, durationSeconds, billedSeconds, pricePerMinuteUsd i costUsd unutar objekta data. Koristi trajanje iz metapodataka datoteke, dok se dovršeni zadatak naplaćuje prema dekodiranom trajanju, koje se može razlikovati. Procjene primjenjuju iste provjere datoteke kao i slanja zadataka. Dostupne su samo dok je transkripcija koja se naplaćuje omogućena (u suprotnom 503 paid_transcription_not_enabled). Mogu vratiti 429 audio_validation_busy kada su kapaciteti za provjeru datoteka popunjeni; pokušajte ponovno nakon kratkog čekanja.

Dohvat transkripta

Periodično dohvaćajte GET /v3/speech_to_text/JOB_ID kako je opisano u vodiču kroz tijek rada sa zadacima. Objekt zadatka sadrži ova polja:

PoljeZnačenje
idUUID zadatka.
statusqueued, running, completed, failed ili awaiting_payment.
progressPostotak od 0 do 99 tijekom izvršavanja, kada je dostupan; 100 kada je zadatak dovršen; inače null.
durationSeconds, billedSecondsTrajanje zvuka i naplaćene cijele sekunde. To su procjene iz metapodataka dok je zadatak u redu za obradu ili se izvršava, a koriste dekodirano trajanje kada je dovršen ili čeka plaćanje.
costUsd, costIsEstimateTrošak u američkim dolarima kao decimalni niz znakova s devet decimalnih mjesta. costIsEstimate je true dok je zadatak u redu za obradu ili se izvršava. Neuspješan zadatak ne naplaćuje se, iako njegovo polje costUsd i dalje prikazuje procjenu.
pricePerMinuteUsd0.005 za API zadatke i 0.000 za besplatne zadatke snimki s Hosted PBX-a.
failureCodeZa neuspješan zadatak: decode_failed (zvuk se nije mogao dekodirati, primjerice zato što ima više od dva kanala ili je nakon dekodiranja dulji od 2 sata), inference_timeout (obrada je trajala predugo), service_error ili worker_lease_lost (obrada je prekinuta). Definirani su i kodovi unsupported_audio i quality_check_failed. Zadatak koji čeka plaćanje prikazuje insufficient_balance, što može ostati i nakon podmirivanja zadatka.
source, modelVersion, createdAtsource je api za slanja putem API-ja ili hpbx za zadatak snimke s Hosted PBX-a vašeg računa. modelVersion neproziran je niz znakova koji označava verziju obrade. createdAt jest vrijeme slanja.
duplicatetrue u odgovorima koji vraćaju postojeći zadatak.
resultPrisutno je samo kada status ima vrijednost completed.
Polje rezultataZnačenje
textCijeli transkript: tekstovi svih segmenata spojeni prijelomima redaka, redoslijedom segmenata.
segmentsNiz segmenata poredanih prema vremenu početka. Svaki segment obuhvaća dio zvuka dug do približno 29 sekundi. Njegova polja start i end (sekunde od početka zvuka) označavaju taj dio, a ne pojedine riječi ili rečenice, a uzastopni dijelovi mogu se preklapati do 1 sekunde. Svaki segment ima i text i language (kod jezika, koji može biti prazan) te channel za dvokanalne rezultate.
channelCount1 ili 2. Prisutno je u trenutačnim rezultatima; stariji ga rezultati mogu izostaviti.
audioDurationMsDekodirano trajanje u milisekundama. Za naplatu se zaokružuje naviše na cijele sekunde.
qualityFlagsPrazno ili review_recommended zajedno s repetition_detected (izraz se neobično često ponavlja unutar jednog dijela), no_speech (govor nije transkribiran) ili oboje.
pipelineVersionMože se pojaviti. Neproziran identifikator obrade.

Transkripti i njihove vremenske oznake, oznake jezika i oznake kanala izrađuju se automatski i njihova točnost nije zajamčena. Svaku oznaku kvalitete smatrajte razlogom za provjeru rezultata te usporedite važna imena, brojeve i obveze s izvornim zvukom. Duge tišine i vrlo tihi dijelovi preskaču se i ne proizvode segmente. Rezultati ne identificiraju pojedine govornike. Kada rezultat navodi channelCount s vrijednošću 2, svaki segment ima channel s vrijednošću A (prvi, odnosno lijevi kanal) ili B (drugi, odnosno desni kanal). To razdvaja govornike samo kada je svaki snimljen na zasebnom kanalu. Dvokanalni zvuk naplaćuje se jednom prema proteklom trajanju, a ne po kanalu. Mono rezultati nemaju oznake kanala.

Korištenje poslužitelja api.multitel.net

Krajnja točka za kompatibilnost POST https://api.multitel.net/v3/speech_to_text prihvaća multipart/form-data s dijelom datoteke nazvanim audio i neobaveznim poljem language, umjesto JSON polja audioBase64. Prazna vrijednost polja language smatra se izostankom naznake. Pošaljite isto zaglavlje Idempotency-Key. Ako zaglavlje nedostaje, ovaj poslužitelj prihvaća i polje obrasca idempotency_key. Polja s nazivima source, free, billing_source, realtime ili stream odbijaju se uz 400 unsupported_transcription_option; ostala polja obrasca zanemaruju se. Ovaj poslužitelj vraća i sljedeće pogreške:

  • 400 idempotency_key_required ako ključ nedostaje ili je predugačak.
  • 400 audio_upload_required ako prijenos nedostaje ili nije primljen u cijelosti.
  • 400 invalid_language za nevaljan jezik.
  • 413 invalid_audio_size za praznu ili preveliku datoteku.
  • 400 invalid_job za neispravno oblikovan ID zadatka.

Odgovori usluge pretvaranja govora u tekst s ovog poslužitelja koriste omotnicu {"status":{"code":HTTP_STATUS},"response":{...}}. Imajte na umu da je status objekt, a ne niz znakova. U slučaju uspjeha, response sadrži isti objekt kao data na primarnom poslužitelju, pa je ID zadatka response.id. U slučaju pogreške, response.code sadrži kod pogreške; poruka i ID zahtjeva nisu uključeni. Neuspjelu autentifikaciju (401) vraća opća provjera prijave na poslužitelju i tijelo odgovora može biti drukčije, pa provjerite HTTP status prije parsiranja. Nemojte zamjenjivati kodiranje prijenosa ili parser odgovora između poslužitelja.

Za procjenu na ovom poslužitelju pošaljite ista multipart polja metodom POST na /v3/speech_to_text/estimate. Ključ idempotentnosti nije potreban, a procjena je unutar objekta 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'