Zalijepite stream, a ne stranicu. Stvarni zvuk postaje nalazi se na adresi koja završava na .mp3, .aac ili .m3u8, a kad ga transkripcija uživo jednom dohvati, nitko više ne mora slušati.
Redakcija koja prati tri radijske postaje, dva televizijska streama i nekoliko YouTube prijenosa uživo prvo ima problem s kadrovima, a tek onda problem s transkripcijom. Netko mora slušati, a netko mora pritisnuti snimanje. Transkripcija uživo s streamom kao izvorom preuzima oba posla: zadate adresu streama, a poslužitelj ga otvara, dekodira i transkribira dok se emitira, pa nitko ne mora sjediti za stolom kad konferencija za novinare počne ranije. Teži dio, kako se ispostavlja, jest pronaći tu adresu.
Transkripcija uživo može uzeti zvuk iz streama koji poslužitelj sam povlači: internetske radijske postaje, HLS playliste (.m3u8), DASH manifeste (.mpd) ili YouTube prijenose uživo. U nadzornoj ploči to je nova transkripcija uživo na Transcriptions → New → Live, čiji je izvor stream, a ne mikrofon. Adresa se postavlja pri stvaranju transkripcije i nikad se ne mijenja, pa se nadzor postavi jednom i pokrene kad postaja vrijedi snimanja.
Adresa mora biti sam stream, a ne web stranica koja ga reproducira. Stranica postaje je HTML; zvuk koji se reproducira obično dolazi s nekog drugog mjesta, najčešće s Icecast ili Shoutcast poslužitelja, a player na stranici tu adresu pronalazi JavaScriptom nakon učitavanja. Na stranici potražite poveznicu „Listen”, „Direct stream” ili „Other players”: ona završava na .mp3, .aac, .m3u, .m3u8 ili .pls. Datoteka .pls ili .m3u također nije zvuk. To je kratka tekstualna datoteka od nekoliko redaka, a svaki redak daje adresu jednog streama; postoji zato da se desktop playeru može predati jedna poveznica, a VocalStack transkribira stream koji ona navodi. Ako zalijepite stranicu, VocalStack je zatraži, vidi da se vraća HTML i to vam kaže. Svaka postaja svoj stream skriva na malo drugačiji način; većina ga skriva iza gumba označenog „Listen”, a to je jedina stvar na stranici koju ne vrijedi kliknuti.
Dvije vrste poveznica odbijaju se odmah. Poveznice na stranice koje puštaju medije, poput Spotifyja, SoundClouda ili Twitcha, odbijaju se prije nego se išta spoji. Ni zaštićeni streamovi nisu podržani: playlista ili manifest koji traži DRM licencu ne uspijeva, uz poruku koja to kaže. Neki streamovi također odbijaju zahtjeve izvan zemlje postaje, pa adresa koja radi u uredu možda neće raditi s poslužitelja u inozemstvu. Ako stream radi u pregledniku, a u VocalStacku ne, postaja odbija druge playere; zatražite od nje adresu koju smiju koristiti druge aplikacije. Većina nudi MP3, AAC ili HLS stream. Kad imate pravu adresu, sljedeće pitanje je hoće li se ikad završiti.
Live stream nikad ne završava, pa nije datoteka. Razlika je posebno važna za YouTube. YouTube prijenos uživo koji je u eteru pripada transkripciji uživo, a nadzorna ploča ga prati dok se emitira. YouTube prijenos uživo koji je zakazan, ali još nije počeo, prikazuje se kao Not live yet i može se snimiti kad uđe u eter. Gotov video je nešto drugo: ima trajanje, pa se transkribira kao datoteka: zalijepite poveznicu u Transcriptions → New.
Sama playlista kaže o kojem je tipu riječ, i tako svaki player razlikuje jedno od drugog. Gotova HLS playlista sadrži oznaku #EXT-X-ENDLIST ili #EXT-X-PLAYLIST-TYPE:VOD; živa nema nijednu i stalno raste, pa je player ponovno dohvaća svakih nekoliko sekundi zbog novih segmenata. DASH manifest ima type="dynamic" dok se prijenos emitira, a type="static" kad je snimka. MP3 ili AAC stream s Icecast poslužitelja nema nikakvo trajanje; jednostavno nikad ne prestaje.
Iz koda, GET /v1/transcriptions/probe?url= to razrješava prije nego se išta pohrani. kind u odgovoru je live za YouTube prijenos uživo koji je u eteru ili zakazan, za HTTP stream bez kraja, za HLS playlistu bez kraja ili za dinamički DASH manifest. Vrijednost je file za sve što ima kraj, a unknown kad probe nije mogao utvrditi. Kad se veza nije otvorila kao medij, ok je false, a problem je rečenica koju možete prikazati. Probe ništa ne pohranjuje i ograničen je na 60 poziva u minuti.
Datoteke se transkribiraju mnogo puta brže nego što se zvuk pušta, pa gotov sat televizije ne traje sat. Stream uživo transkribira se u stvarnom vremenu, ali „stvarno vrijeme” već kasni za emisijom, i vrijedi znati koliko. Icecast stream do playera stigne nekoliko sekundi nakon mikrofona. HLS i DASH podijeljeni su u segmente, a player neće krenuti dok ne primi dva ili tri segmenta od otprilike šest sekundi, pa je HLS stream obično 10 do 30 sekundi iza emisije, prije nego što transkripcija doda vlastito kašnjenje. Redak koji se čini kasnim obično kasni zbog kašnjenja postaje, a ne zbog transkribera. Jedan stream čini jednu snimku; redakcija pokreće nekoliko njih, i svi završe na istom mjestu.
Svaka transkripcija uživo završi u knjižnici Transcriptions uz sve datoteke. Svaka snimka čuva se sa svojim transkriptom, a kad su riječi konačne, za nju se napišu naslov i sažetak na svim jezicima. Jezik govora detektira se automatski, a govornici mogu promijeniti jezik u bilo kojem trenutku. Gdje znate jezik, njegovo navođenje poboljšava kvalitetu transkripcije.
Knjižnica se može pretraživati među jezicima: pretražite svaki transkript, bez obzira na jezik, i dobijete rezultate na svom jeziku. Novinar koji čita samo engleski može pretražiti jutarnju emisiju rumunjske postaje za ime ministra i pročitati pogotke na engleskom, svaki s transkripcijom iz koje dolazi i vremenom kad je izrečen. Ime ministra bit će napisano na tri načina na tri postaje; pretraga na engleskom štedi čitanje sve tri varijante.
Transkripcija se može prevesti na do 10 jezika istovremeno, pa se ista snimka čita na svakom jeziku s kojim redakcija radi. Pogodak u pretrazi koristan je samo ako ga možete citirati.
Transkript nije zid teksta. API-jev GET /v1/recordings/{id}/transcript vraća sentences, segments s vremenskim oznakama riječi i speakers, pa se citat može smjestiti do sekunde u odnosu na snimku. Nadzorna ploča reproducira snimku uživo točno onako kako je stigla, sa zvukom, pa se rečenica može čuti prije citiranja.
Prije nego vjerujete bilo kojem transkriptu radijskog zvuka, iz bilo kojeg sustava, vrijedi znati dvije stvari. Prepoznavanje govora najviše griješi na vlastitim imenima, mjestima i brojkama, a upravo to novinar traži. Ime koje prepoznavatelj nikad nije vidio pretvori se u najbližu uobičajenu riječ, pa pretraga za ispravnim pravopisom to promaši. Umjesto toga pretražite neku karakterističnu riječ izrečenu u istom dahu, pa pročitajte okolinu pogotka. Osim toga, radio nije sav govor: glazbene podloge, džinglovi i reklamni blokovi proizvode retke koji izgledaju kao rečenice, a nisu. Provjerite zvuk prije citiranja.
Oznake govornika imaju tri postavke: isključeno, uključeno ili When Needed, koja prikazuje oznake kad se čuje drugi govornik. Govornika u snimci možete imenovati (PUT /v1/recordings/{id}/speakers/{idx}), a kad se glas govornika upiše, buduće snimke ga prepoznaju po imenu. Za postaju čiji se voditelji vraćaju svako jutro oznake prestaju biti „Speaker 2” nakon prvog tjedna. Kad je citat provjeren, on mora izaći iz redakcije.
Svaki format na kartici Export transkripcije ima svoju ulogu u redakciji. SRT ide video uredniku, pa isječak iz streama dolazi s titlovima; prevedeni SRT dolazi s titlovima na drugom jeziku. Excel ide istraživaču, jedan redak po rečenici s njezinim vremenom, za filtriranje i bilješke. PDF ide uredniku koji želi pročitati cijeli sat u vlaku. JSON ide onome tko piše vlastite alate redakcije. Kroz API izvoz je GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, s lang= za prevedenu verziju. Download audio daje snimku kao MP3 za sam paket.
Praćenje emisije radi izvještavanja uobičajena je novinarska praksa. Ponovno objavljivanje isječka druga je radnja. Njome upravljaju poštena upotreba (fair dealing ili fair use), ovisno o tome gdje se nalazite, i uvjeti same postaje, pa se pravila redakcije o citiranju konkurencije odnose i na zvuk konkurencije. Sve gore navedeno je nekoliko klikova u nadzornoj ploči; za redakciju s dvadeset postaja bolje je to automatizirati skriptom.
Cijeli put dostupan je u API-ju, uključen u svaki paket i naplaćen po istoj stopi kao u nadzornoj ploči. Transkripcija uživo s izvorom streama stvara se u mirovanju, pokreće je prva snimka i njome se upravlja preko HTTP-a. Budući da poslužitelj povlači zvuk, pokretanje snimke ne vraća stream u koji biste vi slali: s vaše strane ne šalje se nikakav zvuk.
API=$VOCALSTACK_API_ORIGIN # the origin shown in the API reference
AUTH="Authorization: Bearer $VOCALSTACK_API_KEY"
# A live transcription whose source the server pulls itself.
TX=$(jq -n '{name: "Morning show", source: {kind: "stream", url: "https://example.org/live.mp3"},
settings: {speakerLabels: "auto"}}' \
| curl -sSf "$API/v1/transcriptions/live" -H "$AUTH" -H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" -d @- | jq -r .id)
# Start recording: the server opens the stream now.
REC=$(curl -sSf -X POST "$API/v1/transcriptions/$TX/recordings" -H "$AUTH" \
-H "Content-Type: application/json" -d '{}' | jq -r .recording.id)
# Later: pause, then stop (a live recording must be paused before it is stopped).
curl -sSf -X POST "$API/v1/recordings/$REC/pause" -H "$AUTH"
curl -sSf -X POST "$API/v1/recordings/$REC/stop" -H "$AUTH" -H "Content-Type: application/json" -d '{}'
# Search everything that was said, in English.
curl -sSfG "$API/v1/search" -H "$AUTH" --data-urlencode "q=budget" --data-urlencode "lang=en"
Ključ Idempotency-Key znači da ponovljeni zahtjev za stvaranje vrati prvu transkripciju umjesto druge. TypeScript i Python SDK-ovi omotavaju iste pozive i preuzimaju se iz područja za programere; API referenca sadrži sve rute i njihove okvire.
AI agent može raditi s knjižnicom bez ikakvog koda. MCP poslužitelj na /v1/mcp daje agentu skup alata; od njih su četiri važna ovdje. search_transcriptions pretražuje što je izrečeno u svim transkripcijama računa, na bilo kojem jeziku, i vraća odgovarajuće retke, svaki s transkripcijom u kojoj se nalazi i vremenom kad je izrečen. get_summary vraća sažetak snimke. transcribe_url i wait_for_transcription transkribiraju gotov video ili poveznicu snimke i čekaju rezultat. Pokretanje nadzora streama ostaje u nadzornoj ploči ili u API-ju opisanom iznad. Postavljanje za Claude Code, Cursor ili bilo koji klijent Streamable HTTP nalazi se pod Developers → Connect an AI agent; članak o MCP-u prolazi kroz njega. Koliko košta pokretanje skripte posljednje je pitanje.
Transkripcija uživo stoji $0.60 po satu zvuka, naplaćuje se po sekundi ($0.01 po minuti), uz minimalno trajanje od 5 minuta po transkripciji. Uživo košta više od datoteke jer se transkribira dok se događa, koliko god traje. Datoteke stoje $0.20 po satu ($0.0033 po minuti; datoteka od 30 minuta košta $0.10). Cijene su iste u svakom paketu i preko API-ja, a prijevodi, sažeci, imenovanje govornika, emitiranje i dijeljenje nikad se ne dodaju na račun.
Postaja koja se prati osam sati dnevno, pet dana u tjednu, to je 40 sati uživo: $24 tjedno, na kojim god jezicima redakcija to čita.
Ograničenja važna za praćenje razlikuju se po paketu. Svako je navedeno redom: Pay as you go, Premium, Enterprise:
Novi račun počinje s kreditom za registraciju od $5 i bez kartice, što je dovoljno za više od osam sati praćenja uživo za isprobavanje. Cijela tablica nalazi se na stranici cijena.