Plak die stroom, nie die bladsy nie. ’n Stasie se werklike klank woon op ’n adres wat eindig op .mp3, .aac of .m3u8, en sodra ’n regstreekse transkripsie dit het, hoef niemand te luister nie.
’n Nuusredaksie wat drie radiostasies, twee televisiestrome en ’n handjie YouTube-regstreekse uitsendings monitor, het eers ’n personeelprobleem voordat dit ’n transkripsieprobleem het. Iemand moet luister, en iemand moet op opneem druk. ’n Regstreekse transkripsie met ’n stroom as bron neem albei take oor: gee dit die adres van die stroom, en die bediener maak dit oop, dekodeer dit en transkribeer dit soos dit uitsaai, sodat niemand by ’n lessenaar hoef te wees wanneer ’n persgesprek vroeg begin nie. Die moeilike deel, blyk dit, is om die adres te vind.
’n Regstreekse transkripsie kan sy klank uit ’n stroom neem wat die bediener self trek: ’n internetradiostasie, ’n HLS-speellys (.m3u8), ’n DASH-manifes (.mpd), of ’n YouTube-regstreeks. In die dashboard is dit ’n nuwe regstreekse transkripsie by Transcriptions → New → Live waarvan die bron ’n stroom is in plaas van die mikrofoon. Die adres word gestel wanneer die transkripsie geskep word en verander nooit nie, so ’n monitor word een keer opgestel en begin wanneer die stasie die moeite werd is om op te neem.
Die adres moet die stroom self wees, nie die webblad wat dit speel nie. ’n Stasie se bladsy is HTML; die klank wat dit speel, kom van elders, gewoonlik ’n Icecast- of Shoutcast-bediener, en die bladsy se speler vind daardie adres met JavaScript nadat dit gelaai het. Soek op die webwerf na ’n skakel wat "Listen", "Direct stream" of "Other players" sê: dit eindig op .mp3, .aac, .m3u, .m3u8 of .pls. ’n .pls of .m3u is ook nie klank nie. Dit is ’n kort teksleêr van ’n paar reëls, elk met die adres van ’n stroom; dit bestaan sodat rekenaarspelers met ’n enkele skakel gevoer kan word, en VocalStack transkribeer die stroom wat dit noem. As jy eerder die bladsy plak, versoek VocalStack dit, sien HTML terugkom en sê dit vir jou. Elke stasie verberg sy stroom ’n bietjie anders; die meeste verberg dit agter ’n knoppie met die etiket "Listen", en dis die enigste ding op die bladsy wat nie die moeite werd is om te klik nie.
Twee soorte skakels word sonder meer geweier. Skakels na bladsye wat media speel, soos Spotify, SoundCloud of Twitch, word afgeweer voordat enigiets koppel. Stroom met kopieëbeskerming word ook nie ondersteun nie: ’n speellys of manifes wat ’n DRM-lisensie benodig, misluk met ’n boodskap wat dit sê. Sommige strome weier ook versoeke van buite die stasie se land af, so ’n adres wat op die kantoor speel, speel dalk nie van ’n bediener in die buiteland af nie. As ’n stroom in ’n blaaier speel maar nie in VocalStack nie, weier die stasie ander spelers; vra die stasie vir ’n adres wat ander programme mag gebruik. Die meeste bied ’n MP3-, AAC- of HLS-stroom aan. Wanneer jy die regte adres het, is die volgende vraag of dit ooit eindig.
’n Regstreekse stroom eindig nooit nie, so dit is nie ’n lêer nie. Die onderskeid maak veral saak vir YouTube. ’n YouTube-regstreeks wat aan die lug is, hoort in ’n regstreekse transkripsie, en die dashboard volg dit soos dit uitsaai. ’n YouTube-regstreeks wat geskeduleer is maar nog nie begin het nie, word gewys as Not live yet en kan opgeneem word sodra dit aan die lug is. ’n Klaar video is ’n ander ding: dit het ’n lengte, so dit word as ’n lêer getranskribeer: plak die skakel in Transcriptions → New.
Die speellys self sê watter een dit is, en dis hoe enige speler die verskil uitmaak. ’n Klaar HLS-speellys bevat ’n #EXT-X-ENDLIST-etiket of #EXT-X-PLAYLIST-TYPE:VOD; ’n lewendige een het nie een van die twee nie en groei aanhoudend, so die speler laai dit elke paar sekondes weer af vir nuwe segmente. ’n DASH-manifes verklaar type="dynamic" terwyl die uitsending aan die lug is, en type="static" sodra dit ’n opname is. ’n MP3- of AAC-stroom van ’n Icecast-bediener het glad geen lengte nie; dit eindig net nooit.
Vanaf kode bepaal GET /v1/transcriptions/probe?url= dit voordat iets gestoor word. Die antwoord se kind is live vir ’n YouTube-regstreeks wat aan die lug of geskeduleer is, ’n oneindige HTTP-stroom, ’n HLS-speellys sonder ’n einde, of ’n dinamiese DASH-manifes. Dit is file vir alles met ’n einde, en unknown wanneer die probe nie kon sê nie. Wanneer die skakel nie as media oopgemaak het nie, is ok false en problem ’n sin wat jy kan wys. Die probe hou niks by nie en is beperk tot 60 oproepe per minuut.
Lêer-transkripsies loop baie keer vinniger as wat die klank speel, so ’n afgehandelde uur televisie neem nie ’n uur nie. ’n Regstreekse stroom word in werklike tyd getranskribeer, maar "werklike tyd" loop al agter die uitsending aan, en dit is die moeite werd om te weet hoeveel. ’n Icecast-stroom bereik ’n speler ’n paar sekondes na die mikrofoon. HLS en DASH is in segmente verdeel, en ’n speler begin nie voordat dit twee of drie segmente van ongeveer ses sekondes elk het nie; ’n HLS-stroom is dus tipies 10 tot 30 sekondes agter die uitsending voordat transkripsie sy eie vertraging byvoeg. ’n Reël wat laat lyk, is gewoonlik die stasie se vertraging, nie die transkribeerder s’n nie. ’n Stroom maak een opname; ’n redaksie loop verskeie, en hulle eindig almal op dieselfde plek.
Elke regstreekse transkripsie beland in die Transcriptions-biblioteek langs elke lêer. Elke opname word saam met sy transkripsie gehou, en sodra die woorde finaal is, word ’n titel en opsomming daarvoor geskryf, in elke taal. Die gesproke taal word outomaties opgespoor, en sprekers mag enige tyd van taal verander. Waar jy die taal ken, verbeter dit die akkuraatheid as jy dit noem.
Die biblioteek is oor tale soekbaar: deursoek elke transkripsie, in watter taal ook al, en kry die resultate in jou eie taal. ’n Verslaggewer wat net Engels lees, kan die Roemeense stasie se môrgeprogram deursoek vir ’n minister se naam en die treffers in Engels lees, elk met die transkripsie waaruit dit kom en die tyd waarop dit gesê is. Die minister se naam sal op drie stasies op drie maniere gespel word; om dit in Engels te soek, bespaar die lees van al drie.
’n Transkripsie kan in tot 10 tale tegelyk vertaal word, sodat dieselfde opname in elke taal lees wat die redaksie werk. ’n Soektreffer is net nuttig as jy dit kan aanhaal.
’n Transkripsie is nie ’n muur van teks nie. Die API se GET /v1/recordings/{id}/transcript gee sentences, segments met woordtydsberekening, en speakers terug, sodat ’n aanhaling tot die sekonde by die opname geplaas kan word. Die dashboard speel ’n regstreekse opname presies af soos dit aangekom het, met sy klank, sodat ’n sin gehoor kan word voordat dit aangehaal word.
Voordat jy enige transkripsie van radioklank vertrou, van enige stelsel af, is twee dinge die moeite werd om te weet. Spraakherkenning struikel die meeste oor eiename, plekke en syfers, presies wat ’n verslaggewer soek. ’n Naam wat die herkenner nog nooit gesien het nie, kom uit as die naaste algemene woord, en ’n soektog na die korrekte spelling mis dit. Soek eerder na ’n kenmerkende woord wat in dieselfde asem gesê is, en lees dan rondom die treffer. En radio is nie alles spraak nie: musiekagtergronde, jingles en advertensieblokke lewer reëls op wat soos sinne lyk maar nie is nie. Kontroleer die klank voordat jy aanhaal.
Sprekeretikette het drie instellings: af, aan, of When Needed, wat etikette wys sodra ’n tweede spreker gehoor word. Jy kan ’n spreker in ’n opname noem (PUT /v1/recordings/{id}/speakers/{idx}), en sodra ’n spreker se stem ingeskryf is, herken toekomstige opnames hulle by naam. Vir ’n stasie waarvan die aanbieders elke môre terugkeer, hou die etikette op om "Spreker 2" te wees ná die eerste week. Sodra die aanhaling nagegaan is, moet dit die gebou verlaat.
Elke formaat op ’n transkripsie se Export-oortjie het ’n taak in ’n nuusredaksie. SRT gaan na die video-redigeerder, sodat ’n snit uit die stroom ondertitels dra; ’n vertaalde SRT dra hulle in ’n ander taal. Excel gaan na die navorser, een ry per sin met sy tyd, om gefiltreer en geannoteer te word. PDF gaan na die redakteur wat die hele uur op pad werk toe wil lees. JSON gaan na wie ook al die redaksie se eie gereedskap skryf. Deur die API is die uitvoer GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, met lang= vir ’n vertaalde weergawe. Download audio gee die opname as ’n MP3 vir die pakket self.
Monitering van ’n uitsending vir verslaggewing is gewone nuusredaksie-praktyk. ’n Klip daarvan weer te publiseer is ’n ander handeling. Dit word beheer deur billike gebruik waar jy is, en deur die stasie se eie voorwaardes, dus geld die redaksie se gewone reëls oor die aanhaal van ’n mededinger ook vir die mededinger se klank. Alles hierbo is ’n paar kliks in die dashboard; vir ’n redaksie met twintig stasies is dit beter om dit te skrip.
Die hele pad is in die API, ingesluit in elke plan en teen dieselfde tarief as die dashboard gehef. ’n Regstreekse transkripsie met ’n stroombron word leeg geskep, word deur sy eerste opname aangeskakel, en oor HTTP beheer. Omdat die bediener die klank trek, lewer die begin van ’n opname geen stroom vir jou om te publiseer nie: daar is niks aan jou kant wat klank stuur nie.
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"
Die Idempotency-Key maak dat ’n herhaalde skepping die eerste transkripsie teruggee in plaas van ’n tweede een. Die TypeScript- en Python-SDK’s omhul dieselfde oproepe en word afgelaai vanaf die Developers-gebied; die API-verwysing het elke roete en sy rame.
’n KI-agent kan die biblioteek werk sonder enige kode. Die MCP-bediener by /v1/mcp gee die agent ’n stel gereedskap; daarvan is vier hier belangrik. search_transcriptions soek wat gesê is oor die rekening se transkripsies in enige taal en gee die passende reëls terug, elk met die transkripsie waarin dit is en die tyd waarop dit gesê is. get_summary gee ’n opname se opsomming terug. transcribe_url en wait_for_transcription transkribeer ’n klaar video of ’n opname se skakel en wag vir die resultaat. Om ’n regstreekse stroommonitor te begin, bly by die dashboard of die API hierbo. Die opstelling vir Claude Code, Cursor of enige Streamable HTTP-kliënt is onder Developers → Connect an AI agent; die MCP-artikel loop dit deur. Wat die skrip om te laat loop kos, is die laaste vraag.
Regstreekse transkripsie kos $0.60 per uur klank, gefaktureer per sekonde ($0.01 per minuut), met ’n minimum van 5 minute per transkripsie. Regstreeks kos meer as ’n lêer omdat dit getranskribeer word soos dit gebeur, solank as wat dit loop. Lêers kos $0.20 per uur ($0.0033 per minuut; ’n lêer van 30 minute kos $0.10). Die tariewe is dieselfde in elke plan en deur die API, en vertalings, opsommings, sprekernaming, uitsending en deling verhoog nooit die rekening nie.
’n Stasie wat agt uur per dag, vyf dae per week gemonitor word, is 40 regstreekse uur: $24 per week, ongeag in watter tale die redaksie dit lees.
Die limiete wat vir monitering saak maak, wissel volgens plan. Elk word in die volgorde Pay as you go, Premium, Enterprise gelys:
’n Nuwe rekening begin met ’n $5 aanmeldkrediet en geen kaart nie, wat meer as agt uur regstreekse monitering is om dit mee te probeer. Die volledige tabel is op die prysbladsy.