Prilepite tok, ne stran. Pravi zvok postaje je na naslovu, ki se konča z .mp3, .aac ali .m3u8, in ko ga prepis v živo enkrat ima, ni treba, da bi ga kdo poslušal.
Uredništvo, ki spremlja tri radijske postaje, dva televizijska pretoka in peščico neposrednih prenosov na YouTubu, najprej nima težave s prepisovanjem, ampak s kadri. Nekdo mora poslušati, nekdo mora pritisniti snemanje. Prepis v živo s pretokom kot virom prevzame obe nalogi: dasta mu naslov toka, strežnik ga odpre, dekodira in prepisuje sproti, ko se predvaja, tako da nihče ne sedi za mizo, ko se tiskovna konferenca začne prej. Težko je, kot se izkaže, najti sam naslov.
Prepis v živo lahko vzame zvok iz toka, ki ga strežnik sam pridobi: internetne radijske postaje, seznam predvajanja HLS (.m3u8), manifest DASH (.mpd) ali neposredni prenos na YouTubu. Na nadzorni plošči je to nov prepis v živo na Transcriptions → New → Live, katerega vir je tok, ne mikrofon. Naslov se nastavi ob ustvarjanju prepisa in se nikoli ne spremeni, zato se nadzor nastavi enkrat in zažene, kadarkoli je postaja vredna snemanja.
Naslov mora biti sam tok, ne spletna stran, ki ga predvaja. Stran postaje je HTML; zvok, ki ga stran predvaja, prihaja od drugod, običajno s strežnika Icecast ali Shoutcast, stran pa ta naslov poišče z JavaScriptom, potem ko se naloži. Na spletišču poiščite povezavo »Poslušaj«, »Neposredni tok« ali »Drugi predvajalniki«: konča se z .mp3, .aac, .m3u, .m3u8 ali .pls. Datoteka .pls ali .m3u tudi ni zvok. Je kratka besedilna datoteka z nekaj vrsticami, vsaka vsebuje naslov toka; obstaja zato, da se namiznim predvajalnikom poda ena sama povezava, VocalStack pa prepiše tok, ki ga navaja. Če prilepite stran, VocalStack zahteva njen naslov, vidi, da se vrača HTML, in vam to pove. Vsaka postaja skriva svoj tok nekoliko drugače; večina ga skriva za gumbom z oznako »Poslušaj«, to pa je edina stvar na strani, na katero ni vredno klikniti.
Dve vrsti povezav sta zavrnjeni takoj. Povezave do strani, ki predvajajo medije, kot so Spotify, SoundCloud ali Twitch, so zavrnjene, preden se sploh kaj poveže. Tokovi, zaščiteni pred kopiranjem, prav tako niso podprti: seznam predvajanja ali manifest, ki potrebuje licenco DRM, ne uspe, s sporočilom, ki to pove. Nekateri tokovi tudi zavrnejo zahteve od zunaj države postaje, zato naslov, ki na pisarniškem računalniku deluje, morda ne bo deloval na strežniku v tujini. Če tok deluje v brskalniku, v VocalStacku pa ne, postaja zavrača druge predvajalnike; prosite jo za naslov, ki ga smejo uporabljati druge aplikacije. Večina ponuja tok MP3, AAC ali HLS. Ko imate pravi naslov, je naslednje vprašanje, ali se sploh kdaj konča.
Tok v živo se nikoli ne konča, zato ni datoteka. Razlika je pomembna zlasti pri YouTubu. Neposredni prenos na YouTubu, ki je na zraku, sodi v prepis v živo, nadzorna plošča pa ga spremlja, dokler je na zraku. Neposredni prenos, ki je napovedan, a se še ni začel, je prikazan kot Not live yet in ga je mogoče posneti, ko je na zraku. Končan videoposnetek je nekaj drugega: ima dolžino, zato se prepiše kot datoteka – prilepite povezavo na Transcriptions → New.
Predvajalni seznam sam pove, kateri je, in tako vsak predvajalnik loči enega od drugega. Končan seznam HLS vsebuje oznako #EXT-X-ENDLIST ali #EXT-X-PLAYLIST-TYPE:VOD; živ nima nobene od njiju in se stalno veča, zato ga predvajalnik znova prenese vsakih nekaj sekund zaradi novih odsekov. Manifest DASH ima type="dynamic", medtem ko je oddaja na zraku, in type="static", ko je posnetek. Tok MP3 ali AAC s strežnika Icecast sploh nima dolžine; preprosto se nikoli ne neha.
Iz kode to razreši GET /v1/transcriptions/probe?url=, preden se kaj shrani. Odgovor kind je live za neposredni prenos na YouTubu, ki je na zraku ali napovedan, za neskončen HTTP tok, za seznam predvajanja HLS brez konca ali za dinamični manifest DASH. Je file za vse, kar ima konec, in unknown, kadar sonda ni mogla ugotoviti. Če povezava ni odprla medija, je ok enak false, problem pa je stavek, ki ga lahko pokažete. Sonda ničesar ne shrani in je omejena na 60 klicev na minuto.
Datoteke se prepisujejo mnogokrat hitreje, kot se predvajajo, zato končana ura televizije ne vzame ure. Tok v živo se prepisuje v realnem času, a »realni čas« že zaostaja za oddajo, in vredno je vedeti, za koliko. Tok Icecast doseže predvajalnik nekaj sekund po mikrofonu. HLS in DASH sta razdeljena na odseke, predvajalnik pa se ne zažene, dokler nima dveh ali treh odsekov po približno šest sekund, zato je tok HLS običajno 10 do 30 sekund za oddajo, preden prepis doda še svoj zamik. Vrstica, ki se pojavi pozno, je ponavadi zamik postaje, ne prepisovalnika. En tok ustvari en posnetek; uredništvo jih zažene več, in vsi končajo na istem mestu.
Vsak prepis v živo se pojavi v knjižnici Transcriptions poleg vsake datoteke. Vsak posnetek se hrani skupaj s svojim prepisom, in ko so besede dokončne, se zanj napišeta naslov in povzetek, v vseh jezikih. Jezik govora se zazna samodejno, govorci pa lahko kadarkoli preklopijo jezik. Kjer veste, kateri jezik je, ga navedba izboljša kakovost prepisa.
Knjižnica je iskalna prek jezikov: iščite po vseh prepisih, ne glede na jezik, in rezultate dobite v svojem. Novinar, ki bere samo angleško, lahko poišče ime ministra v jutranji oddaji romunske postaje in zadetke prebere v angleščini, vsakega s prepisom, iz katerega izvira, in s časom, ko je bilo izrečeno. Ime ministra bo na treh postajah zapisano na tri načine; iskanje po njem v angleščini prihrani branje vseh treh.
Prepis je mogoče prevesti v do 10 jezikov hkrati, da se isti posnetek bere v vseh jezikih, s katerimi uredništvo dela. Zadetek iskanja je koristen samo, če ga lahko citirate.
Prepis ni zid besedila. API GET /v1/recordings/{id}/transcript vrne sentences, segments z časi besed in speakers, tako da se citat lahko umesti na sekundo natančno glede na posnetek. Nadzorna plošča predvaja živi posnetek točno tako, kot je prispel, z zvokom, zato lahko stavek slišite, preden ga citirate.
Preden zaupate kakršnemu koli prepisu radijskega zvoka, iz katerega koli sistema, je vredno vedeti dve stvari. Razpoznavanje govora se najbolj spotakne ob lastnih imenih, krajih in številkah, prav to pa novinar išče. Ime, ki ga razpoznavalnik še ni videl, pride ven kot najbližja običajna beseda, iskanje po pravilnem zapisu pa ga zgreši. Namesto tega iščite po razločni besedi, izrečeni v istem sapi, nato preberite okoli zadetka. Tudi radio ni samo govor: glasbene podlage, džinglji in oglasni bloki dajejo vrstice, ki so videti kot stavki, pa niso. Preverite zvok, preden citirate.
Oznake govorcev imajo tri nastavitve: izklopljeno, vklopljeno ali When Needed, ki prikaže oznake, ko je slišan drugi govorec. Govorca lahko poimenujete v posnetku (PUT /v1/recordings/{id}/speakers/{idx}), in ko je glas govorca vpisan, prihodnji posnetki prepoznajo to osebo po imenu. Pri postaji, katere voditelji se vračajo vsako jutro, oznake po prvem tednu nehajo biti »Speaker 2«. Ko je citat preverjen, mora zapustiti stavbo.
Vsak format na zavihku Export prepisa ima v uredništvu svoje delo. SRT gre k video montažerju, da posnetek iz toka nosi podnapise; preveden SRT jih nosi v drugem jeziku. Excel gre raziskovalcu, z eno vrstico na stavek in s časom, da se lahko filtrira in opomba. PDF gre urezniku, ki želi prebrati celo uro v vlaku. JSON gre tistemu, ki piše orodja uredništva. Prek API-ja je izvoz GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, z lang= za prevedeno različico. Download audio da posnetek kot MP3 za sam paket.
Spremljanje oddaje zaradi poročanja je običajna praksa v novinarstvu. Ponovno objavljanje posnetka je drugo dejanje. Ureja ga poštena uporaba ali poštena raba tam, kjer ste, ter pogoji same postaje, zato pravila uredništva o citiranju konkurence veljajo tudi za konkurenčni zvok. Vse zgoraj navedeno je nekaj klikov na nadzorni plošči; za uredništvo z dvajsetimi postajami je bolje, da se to skriptira.
Celotna pot je v API-ju, vključena v vsak paket in obračunana po isti ceni kot na nadzorni plošči. Prepis v živo s pretokom kot virom se ustvari neaktiven, zažene ga prvi posnetek, upravlja pa se prek HTTP. Ker strežnik sam prenaša zvok, zagon posnetka ne vrne toka, na katerega bi objavili: na vaši strani ni ničesar, kar bi pošiljalo zvok.
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 poskrbi, da ponovljeno ustvarjanje vrne prvi prepis namesto drugega. SDK-ja za TypeScript in Python ovijata iste klice in ju prenesete iz območja za razvijalce; referenca API-ja vsebuje vsako pot in njene okvirje.
Agent AI lahko dela s knjižnico brez kakršne koli kode. Strežnik MCP na /v1/mcp agentu da nabor orodij; med njimi so štiri, ki tukaj štejejo. search_transcriptions išče, kar je bilo rečeno, po vseh prepisih v katerem koli jeziku, in vrne ustrezne vrstice, vsako s prepisom, v katerem je, in s časom, ko je bila izrečena. get_summary vrne povzetek posnetka. transcribe_url in wait_for_transcription prepišeta končan video ali povezavo posnetka in počakata na rezultat. Zagon nadzora tokov v živo ostane pri nadzorni plošči ali zgoraj navedenem API-ju. Nastavitev za Claude Code, Cursor ali katerega koli odjemalca Streamable HTTP je pod Developers → Connect an AI agent; članek o MCP to korak za korakom razloži. Koliko stane zagon skripta, je zadnje vprašanje.
Prepis v živo stane $0.60 na uro zvoka, obračunano na sekundo ($0.01 na minuto), z najmanj 5 minutami na prepis. Prepis v živo je dražji od datoteke, ker se prepisuje sproti, dokler traja. Datoteke stanejo $0.20 na uro ($0.0033 na minuto; 30-minutna datoteka stane $0.10). Cene so v vseh paketih in prek API-ja enake, prevodi, povzetki, poimenovanje govorcev, oddajanje in deljenje pa nikoli ne dodajo k računu.
Postaja, spremljana osem ur na dan, pet dni na teden, je 40 ur v živo: $24 na teden, ne glede na to, v koliko jezikih jo uredništvo bere.
Omejitve, pomembne za spremljanje, se razlikujejo po paketu. Vsaka je navedena v vrstnem redu Pay as you go, Premium, Enterprise:
Nov račun se začne z $5 dobroimetjem ob registraciji in brez kartice, kar je več kot osem ur spremljanja v živo za preizkus. Celotna tabela je na strani s cenikom.