Zalijepite stream, a ne stranicu. Stvarni zvuk stanice nalazi se na adresi koja završava na .mp3, .aac ili .m3u8, a kada ga transkripcija uživo jednom preuzme, niko ne mora slušati.
Redakcija koja prati tri radio stanice, dva televizijska streama i nekoliko YouTube prijenosa uživo prije svega ima problem s kadrovima, a tek onda problem s transkripcijom. Neko mora slušati i neko mora pritisnuti snimanje. Transkripcija uživo sa streamom kao izvorom preuzima oba posla: unesete adresu streama, server ga otvara, dekodira i transkribuje dok se emituje, pa niko ne mora biti za stolom kada konferencija za novinare počne ranije. Teški dio, kako se ispostavlja, jeste pronaći tu adresu.
Transkripcija uživo može uzeti zvuk iz streama koji server sam povlači: internet radio stanice, HLS plejlistu (.m3u8), DASH manifest (.mpd) ili YouTube prijenos uživo. U kontrolnoj ploči ovo je nova transkripcija uživo na Transcriptions → New → Live čiji je izvor stream, a ne mikrofon. Adresa se postavlja kada se transkripcija kreira i nikada se ne mijenja, pa se monitor postavi jednom i pokrene kada stanica vrijedi snimanja.
Adresa mora biti sam stream, a ne web stranica koja ga pušta. Stranica stanice je HTML; zvuk koji reproducira obično dolazi s nekog drugog mjesta, najčešće s Icecast ili Shoutcast servera, a player na stranici tu adresu pronalazi JavaScriptom nakon učitavanja. Na sajtu potražite link „Listen“, „Direct stream“ ili „Other players“: on završava na .mp3, .aac, .m3u, .m3u8 ili .pls. Datoteka .pls ili .m3u također nije zvuk. Riječ je o kratkoj tekstualnoj datoteci od nekoliko redova, a svaki red daje adresu jednog streama. Ona postoji da bi desktop playeri mogli dobiti jedan jedini link, a VocalStack transkribuje stream koji navodi. Ako umjesto toga zalijepite stranicu, VocalStack je zatraži, vidi HTML u odgovoru i to vam kaže. Svaka stanica svoj stream krije na drugi način; većina ga skriva iza dugmeta označenog sa „Listen“, a to je jedina stvar na stranici koju ne vrijedi kliknuti.
Dvije vrste linkova se odbijaju odmah. Linkovi na stranice koje reproduciraju medije, kao što su Spotify, SoundCloud ili Twitch, odbijaju se prije nego što se išta poveže. Streamovi zaštićeni od kopiranja također nisu podržani: plejlista ili manifest koji traži DRM licencu ne uspijeva uz poruku koja to kaže. Neki streamovi odbijaju zahtjeve izvan zemlje stanice, tako da adresa koja radi u kancelariji možda neće raditi s servera u inostranstvu. Ako stream radi u pregledniku, a ne u VocalStacku, stanica odbija druge playere; zatražite od nje adresu koju smiju koristiti druge aplikacije. Većina nudi MP3, AAC ili HLS stream. Kada imate ispravnu adresu, sljedeće pitanje je hoće li se ikada završiti.
Stream uživo nikada ne završava, pa nije datoteka. Razlika je posebno važna za YouTube. YouTube prijenos uživo koji je u etru pripada transkripciji uživo, a kontrolna ploča ga prati dok se emituje. YouTube prijenos uživo koji je zakazan, ali nije počeo, prikazuje se kao Not live yet i može se snimiti kada krene. Gotov video je nešto drugo: ima dužinu, pa se transkribuje kao datoteka. Zalijepite link u Transcriptions → New.
Sama plejlista govori šta je, a tako svaki player razlikuje jedno od drugog. Završena HLS plejlista nosi oznaku #EXT-X-ENDLIST ili #EXT-X-PLAYLIST-TYPE:VOD; živa nema nijednu i stalno raste, pa je player ponovo preuzima svakih nekoliko sekundi zbog novih segmenata. DASH manifest ima type="dynamic" dok je prijenos u etru, a type="static" kada je snimak. MP3 ili AAC stream s Icecast servera nema dužinu uopće; jednostavno se nikada ne zaustavlja.
Iz koda, GET /v1/transcriptions/probe?url= ovo razjasni prije nego se bilo šta sačuva. Odgovor kind je live za YouTube prijenos uživo koji je u etru ili zakazan, za HTTP stream bez kraja, za HLS plejlistu bez kraja i za dinamički DASH manifest. Vrijednost je file za sve što ima kraj, a unknown kada provjera nije mogla zaključiti. Kada link nije otvoren kao medij, ok je false, a problem je rečenica koju možete prikazati. Provjera ništa ne čuva i ograničena je na 60 poziva u minuti.
Transkripcija datoteka ide mnogo puta brže od reprodukcije, pa sat snimljenog programa ne traje sat. Stream uživo se transkribuje u realnom vremenu, ali „realno vrijeme“ već kasni za emitovanjem, pa vrijedi znati za koliko. Icecast stream dopire do playera nekoliko sekundi nakon mikrofona. HLS i DASH su segmentirani, a player neće početi dok ne drži dva ili tri segmenta od oko šest sekundi, pa je HLS stream obično 10 do 30 sekundi iza emitovanja prije nego transkripcija doda svoje kašnjenje. Red koji se čini da kasni obično kasni zbog stanice, a ne zbog transkripcije. Jedan stream pravi jedan snimak; redakcija pokreće nekoliko njih, a svi završe na istom mjestu.
Svaka transkripcija uživo završava u biblioteci Transcriptions uz sve datoteke. Svaki snimak se čuva uz svoj transkript, a kada su riječi konačne, za njega se pišu naslov i sažetak na svakom jeziku. Jezik govora se detektuje automatski, a govornici mogu promijeniti jezik u bilo kojem trenutku. Ako znate jezik, njegovo navođenje poboljšava kvalitetu transkripcije.
Biblioteka se pretražuje preko jezika: pretražite sve transkripte, na kojem god jeziku bili, i rezultate dobijete na svom jeziku. Novinar koji čita samo engleski može pretražiti jutarnju emisiju rumunske stanice za ime ministra i pročitati pogotke na engleskom, svaki uz transkripciju iz koje dolazi i vrijeme kada je izgovoreno. Ime ministra će na tri stanice biti napisano na tri različita načina; pretraga na engleskom štedi čitanje sve tri varijante.
Transkripcija se može prevesti na do 10 jezika istovremeno, tako da se isti snimak čita na svakom jeziku s kojim redakcija radi. Pogodak pretrage je koristan samo ako ga možete citirati.
Transkript nije zid teksta. API 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 snimak. Kontrolna ploča reproducira snimak uživo tačno onako kako je stigao, zajedno sa zvukom, pa se rečenica može čuti prije nego se citira.
Prije nego vjerujete transkriptu radijskog zvuka, iz bilo kojeg sistema, vrijedi znati dvije stvari. Prepoznavanje govora najviše griješi na vlastitim imenima, mjestima i brojevima, a upravo to novinar pretražuje. Ime koje prepoznavač nikada nije vidio pojavi se kao najbliža uobičajena riječ, pa pretraga ispravnog pravopisa to ne nađe. Zato tražite neku prepoznatljivu riječ izgovorenu u istom dahu, pa onda pročitajte okolinu pogotka. Osim toga, radio nije samo govor: muzičke podloge, džinglovi i reklamni blokovi proizvode linije koje izgledaju kao rečenice, a nisu. Provjerite zvuk prije citiranja.
Oznake govornika imaju tri postavke: isključeno, uključeno ili When Needed, koja pokazuje oznake kada se čuje drugi govornik. Govornika u snimku možete imenovati (PUT /v1/recordings/{id}/speakers/{idx}), a kada je glas govornika registrovan, budući snimci ga prepoznaju po imenu. Za stanicu čiji se voditelji vraćaju svako jutro oznake prestanu biti „Speaker 2“ nakon prve sedmice. Kada je citat provjeren, mora izaći iz zgrade.
Svaki format na kartici Export transkripcije ima svoj posao u redakciji. SRT ide video uredniku, pa isječak iz streama dobija titlove; prevedeni SRT ih nosi na drugom jeziku. Excel ide istraživaču, s jednim redom po rečenici i njenim vremenom, da se filtrira i anotira. PDF ide uredniku koji želi pročitati cijeli sat u vozu. JSON ide onome ko piše vlastite alate redakcije. Preko API-ja izvoz je GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, s lang= za prevedenu verziju. Download audio daje snimak kao MP3 za sam prilog.
Praćenje emisije radi izvještavanja je uobičajena novinarska praksa. Ponovno objavljivanje isječka je nešto drugo. Ono je uređeno pravilima poštenog korištenja tamo gdje ste, i uslovima same stanice, pa se uobičajena pravila redakcije o citiranju konkurencije odnose i na konkurentski zvuk. Sve gore navedeno radi se u nekoliko klikova na kontrolnoj ploči; za redakciju s dvadeset stanica bolje je to skriptirati.
Cijeli tok je u API-ju, uključen je u svaki paket i naplaćuje se po istoj stopi kao i na kontrolnoj ploči. Transkripcija uživo sa streamom kao izvorom kreira se neaktivna, pokreće je prvi snimak i kontrolira preko HTTP-a. Budući da server povlači zvuk, pokretanje snimanja ne vraća stream u koji biste slali; s vaše strane nema ničega što šalje 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"
Idempotency-Key znači da ponovljeni zahtjev za kreiranje vrati prvu transkripciju umjesto druge. TypeScript i Python SDK-ovi obavljaju iste pozive i preuzimaju se iz oblasti za programere; referenca API-ja sadrži sve rute i njihove okvire.
AI agent može raditi s bibliotekom bez ikakvog koda. MCP server na /v1/mcp daje agentu skup alata; među njima su četiri bitna. search_transcriptions pretražuje ono što je izgovoreno u svim transkripcijama računa, na bilo kojem jeziku, i vraća odgovarajuće linije, svaku uz transkripciju u kojoj se nalazi i vrijeme izgovaranja. get_summary vraća sažetak snimka. transcribe_url i wait_for_transcription transkribuju gotov video ili link snimka i čekaju rezultat. Pokretanje monitora streama uživo ostaje na kontrolnoj ploči ili u API-ju iznad. Postavka za Claude Code, Cursor ili bilo koji Streamable HTTP klijent nalazi se pod Developers → Connect an AI agent; članak o MCP-u prolazi kroz nju. Koliko skripta košta za pokretanje je posljednje pitanje.
Transkripcija uživo košta $0.60 po satu zvuka, naplaćuje se po sekundi ($0.01 po minuti), uz minimum od 5 minuta po transkripciji. Uživo košta više od datoteke jer se transkribuje dok se događa, koliko god traje. Datoteke koštaju $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, emitovanje i dijeljenje nikada ne povećavaju račun.
Stanica praćena osam sati dnevno, pet dana u sedmici, čini 40 sati uživo: $24 sedmično, bez obzira na to koliko jezika redakcija čita.
Ograničenja bitna za praćenje zavise od paketa. Navedena su redom: Pay as you go, Premium, Enterprise:
Novi račun dobija $5 kredita za registraciju bez kartice, što je dovoljno za više od osam sati praćenja uživo za isprobavanje. Cijeli pregled je na stranici s cijenama.