I-paste ang stream, hindi ang page. Ang totoong audio ng istasyon ay nasa address na nagtatapos sa .mp3, .aac o .m3u8, at kapag na-transcribe na ito ng isang live transcription, wala nang kailangang nakikinig.
Ang newsroom na nagmo-monitor ng tatlong radio station, dalawang television stream at ilang YouTube live ay may problema sa staffing bago pa man sa transcription. May kailangang makinig, at may kailangang pumindot ng record. Ang live transcription na may stream bilang source ang sumasalo sa dalawang trabahong ito: ibigay lang ang address ng stream at bubuksan ito ng server, ide-decode, at ita-transcribe habang nagbo-broadcast, kaya hindi kailangang nasa desk ang tao kapag maagang nagsimula ang press conference. Ang mahirap, lumalabas, ay ang paghanap ng address.
Maaaring kunin ng live transcription ang audio nito mula sa stream na mismong kinukuha ng server: isang internet radio station, HLS playlist (.m3u8), DASH manifest (.mpd), o YouTube live. Sa Dashboard, ito ay bagong live transcription sa Transcriptions → New → Live na ang source ay stream sa halip na microphone. Naitatakda ang address pagkagawa ng transcription at hindi na ito nagbabago, kaya isang beses lang i-set up ang monitor at simulan tuwing sulit i-record ang istasyon.
Dapat ang mismong stream ang address, hindi ang web page na nagpapatugtog nito. HTML ang page ng istasyon; ang audio na pinapatugtog nito ay galing sa ibang lugar, kadalasan sa Icecast o Shoutcast server, at hinahanap ng JavaScript ng page ang address na iyon pagkatapos mag-load. Hanapin sa site ang link na "Listen", "Direct stream" o "Other players": nagtatapos ito sa .mp3, .aac, .m3u, .m3u8 o .pls. Ang .pls o .m3u ay hindi rin audio. Maikling text file ito na may ilang linya, at bawat linya ay may address ng isang stream; ginawa ito para mabigyan ng isang link ang desktop player, at ang tino-transcribe ng VocalStack ay ang stream na itinuturo nito. Kapag ang page ang na-paste mo, ire-request ito ng VocalStack, makikitang HTML ang ibinabalik, at sasabihan ka tungkol dito. Iba-iba ang pagtatago ng bawat istasyon sa stream nito; karamihan ay nasa likod ng button na may markang "Listen", at iyon lang ang bagay sa page na hindi sulit pindutin.
Dalawang uri ng link ang tahasang tinatanggihan. Ang mga link sa page na nagpapatugtog ng media, gaya ng Spotify, SoundCloud o Twitch, ay hindi tinatanggap bago pa man kumonekta. Hindi rin sinusuportahan ang copy-protected na stream: ang playlist o manifest na nangangailangan ng DRM license ay magfa-fail na may mensaheng nagsasabi nito. May mga stream ding tumatanggi sa request mula sa labas ng bansa ng istasyon, kaya ang address na tumutugtog sa opisina ay maaaring hindi tumugtog mula sa server sa ibang bansa. Kapag tumutugtog ang stream sa browser pero hindi sa VocalStack, tinatanggihan ng istasyon ang ibang player; humingi sa istasyon ng address na pinapayagang gamitin ng ibang app. Karamihan ay nag-aalok ng MP3, AAC o HLS stream. Kapag nakuha mo na ang tamang address, ang kasunod na tanong ay kung natatapos pa ba ito.
Hindi natatapos ang live stream, kaya hindi ito file. Mahalaga ang pagkakaibang ito lalo na sa YouTube. Ang YouTube live na nasa ere ay dapat nasa live transcription, at sinusundan ito ng Dashboard habang nagbo-broadcast. Ang YouTube live na naka-schedule pero hindi pa nagsisimula ay makikitang Not live yet at maaaring i-record kapag nasa ere na. Iba ang tapos nang video: may haba ito, kaya ita-transcribe ito bilang file. I-paste lang ang link sa Transcriptions → New.
Ang playlist mismo ang nagsasabi kung alin ito, at doon nalalaman ng anumang player ang pagkakaiba. Ang tapos nang HLS playlist ay may tag na #EXT-X-ENDLIST o #EXT-X-PLAYLIST-TYPE:VOD; ang live ay wala sa dalawa at patuloy na lumalaki, kaya ni-re-fetch ito ng player bawat ilang segundo para sa mga bagong segment. Ang DASH manifest ay nagdedeklara ng type="dynamic" habang nasa ere ang broadcast at type="static" kapag recording na lang ito. Ang MP3 o AAC stream mula sa Icecast server ay walang haba; patuloy lang ito at hindi kailanman natatapos.
Mula sa code, inaayos ito ng GET /v1/transcriptions/probe?url= bago pa may maitabi. Ang kind sa response ay live para sa YouTube live na nasa ere o naka-schedule, para sa stream na walang katapusang HTTP, para sa HLS playlist na walang dulo, o para sa dynamic na DASH manifest. Ito ay file para sa anumang may katapusan, at unknown kapag hindi matukoy ng probe. Kapag hindi nagbukas bilang media ang link, false ang ok at ang problem ay pangungusap na maipapakita mo. Walang itinatabi ang probe at limitado ito sa 60 na tawag kada minuto.
Mas mabilis nang maraming beses kaysa sa pag-play ng audio ang pag-transcribe ng file, kaya ang isang oras na tapos nang telebisyon ay hindi aabutin ng isang oras. Ang live stream ay ita-transcribe sa real time, pero lagpas na sa likod ng broadcast ang "real time", at makabubuting malaman kung gaano kalaki ang agwat. Ang Icecast stream ay umaabot sa player ilang segundo pagkatapos ng microphone. Ang HLS at DASH ay segmented, at hindi magsisimula ang player hangga't wala itong hawak na dalawa o tatlong segment na mga anim na segundo ang bawat isa, kaya karaniwang 10 hanggang 30 segundo ang HLS stream sa likod ng broadcast bago pa idagdag ng transcription ang sarili nitong delay. Ang linyang tila huli dumating ay kadalasang delay ng istasyon, hindi ng transcriber. Isang stream ang gumagawa ng isang recording; ang desk ay nagpapatakbo ng ilan, at lahat ng ito ay napupunta sa iisang lugar.
Bawat live transcription ay napupunta sa Transcriptions library, kasama ng bawat file. Nakatago ang bawat recording kasama ng transcript nito, at kapag pinal na ang mga salita, nagsusulat ng title at buod para dito sa bawat wika. Awtomatikong natutukoy ang sinasalitang wika, at maaaring magpalit ng wika ang mga nagsasalita anumang oras. Kapag alam mo ang wika, mas gumaganda ang kalidad ng transcription kapag binanggit mo ito.
Maaaring hanapin ang library sa iba't ibang wika: hanapin ang lahat ng transcript, anuman ang wika, at makuha ang resulta sa sarili mong wika. Maaaring maghanap ang reporter na English lang ang nababasa sa morning show ng Romanian na istasyon para sa pangalan ng isang ministro, at mababasa niya ang mga tama sa English, bawat isa kasama ang transcription na pinanggalingan nito at ang oras na binanggit ito. Tatlong magkakaibang baybay ang pangalan ng ministro sa tatlong istasyon; kapag sa English mo ito hinanap, hindi mo na kailangang basahin ang tatlo.
Maaaring isalin ang isang transcription sa hanggang 10 wika nang sabay-sabay, kaya mababasa ang iisang recording sa lahat ng wikang gamit ng desk. Walang silbi ang tamang hit kung hindi mo ito maisisipi.
Hindi pader ng teksto ang transcript. Ang GET /v1/recordings/{id}/transcript ng API ay nagbabalik ng sentences, segments na may word timings, at speakers, kaya maitatakda ang sipi sa eksaktong segundo sa recording. Ipinapatugtog ng Dashboard ang live recording nang eksakto gaya ng pagdating nito, kasama ang audio nito, kaya maririnig muna ang pangungusap bago ito sipiin.
Bago ka magtiwala sa anumang transcript ng audio ng radyo, mula sa anumang sistema, may dalawang bagay na dapat malaman. Pinakamadalas mabigo ang speech recognition sa mga pangalan ng tao, lugar at numero, na eksaktong hinahanap ng reporter. Ang pangalang hindi pa nakikita ng recognizer ay lalabas bilang pinakamalapit na karaniwang salita, at hindi ito mahahanap ng paghahanap sa tamang baybay nito. Sa halip, hanapin ang isang natatanging salitang sinabi sa parehong hininga, at saka basahin ang paligid ng hit. Bukod dito, hindi puro salita ang radyo: may background music, jingle at advertising break na nagbubunga ng mga linyang mukhang pangungusap pero hindi naman. Tingnan ang audio bago sipiin.
May tatlong setting ang speaker labels: off, on, o When Needed, na nagpapakita ng label kapag may narinig nang pangalawang nagsasalita. Maaari mong pangalanan ang isang nagsasalita sa recording (PUT /v1/recordings/{id}/speakers/{idx}), at kapag na-enroll na ang boses ng isang nagsasalita, nakikilala na siya sa pangalan sa mga susunod na recording. Para sa istasyong may mga presenter na bumabalik araw-araw, hihinto na sa pagiging "Speaker 2" ang mga label pagkatapos ng unang linggo. Kapag nasuri na ang sipi, kailangan na itong ilabas.
Bawat format sa Export tab ng transcription ay may trabaho sa newsroom. Napupunta ang SRT sa video editor, kaya may subtitle ang clip mula sa stream; ang isinaling SRT ay may subtitle sa ibang wika. Napupunta ang Excel sa researcher, isang row bawat pangungusap na may oras nito, para ma-filter at ma-annotate. Napupunta ang PDF sa editor na gustong basahin ang buong oras sa tren. Napupunta ang JSON sa sinumang gumagawa ng sariling tools ng desk. Sa pamamagitan ng API, ang export ay GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, na may lang= para sa isinaling bersyon. Ibinibigay ng Download audio ang recording bilang MP3 para sa mismong package.
Normal na gawain sa newsroom ang pag-monitor ng broadcast para sa pag-uulat. Iba ang paglalathala muli ng clip nito. Pinamamahalaan ito ng fair dealing o fair use sa lugar mo, at ng sariling terms ng istasyon, kaya ang karaniwang patakaran ng desk sa pagsipi sa kakumpitensya ay sumasaklaw din sa audio ng kakumpitensya. Ang lahat ng nasa itaas ay ilang click lang sa Dashboard; para sa desk na may dalawampung istasyon, mas mainam itong i-script.
Nasa API ang buong daan, kasama sa bawat plan at sinisingil sa parehong rate ng Dashboard. Ang live transcription na may stream source ay nagagawang idle, sinisimulan ng unang recording nito, at kinokontrol sa pamamagitan ng HTTP. Dahil kinukuha ng server ang audio, walang stream na ibinabalik ang pagsisimula ng recording para ma-publish mo: walang anumang ipinapadala ang panig mo.
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"
Pinipigilan ng Idempotency-Key na ang na-retry na create ay magbalik ng pangalawang transcription; ang una ang ibabalik. Binabalot ng TypeScript at Python SDK ang parehong tawag at maaaring i-download mula sa Developers area; ang API reference ay may bawat route at frame nito.
Kaya ng AI agent na gamitin ang library nang walang anumang code. Ang MCP server sa /v1/mcp ay nagbibigay sa agent ng hanay ng tools; apat sa mga ito ang mahalaga rito. Hinahanap ng search_transcriptions ang sinabi sa lahat ng transcription ng account sa anumang wika at nagbabalik ng mga tugmang linya, bawat isa kasama ang transcription kung nasaan ito at ang oras na binanggit ito. Ibinabalik ng get_summary ang buod ng recording. Ang transcribe_url at wait_for_transcription ay nagta-transcribe ng tapos nang video o link ng recording at naghihintay ng resulta. Ang pagsisimula ng live stream monitor ay nananatili sa Dashboard o sa API sa itaas. Ang setup para sa Claude Code, Cursor o anumang Streamable HTTP client ay nasa ilalim ng Developers → Connect an AI agent; ipinaliliwanag ng artikulo tungkol sa MCP ang proseso. Ang huling tanong ay kung magkano ang gastos sa pagpapatakbo ng script.
Ang live transcription ay $0.60 kada oras ng audio, sinisingil bawat segundo ($0.01 bawat minuto), na may 5-minutong minimum bawat transcription. Mas mahal ang live kaysa file dahil ito ay tinatranscribe habang nangyayari, sa tagal ng pagtakbo nito. Ang file ay $0.20 bawat oras ($0.0033 bawat minuto; ang 30-minutong file ay nagkakahalaga ng $0.10). Pareho ang rate sa bawat plan at sa pamamagitan ng API, at ang mga pagsasalin, buod, pagkilala sa nagsasalita, broadcasting at sharing ay hindi nadadagdag sa bill.
Ang istasyong binabantayan nang walong oras kada araw, limang araw sa isang linggo, ay 40 live na oras: $24 sa isang linggo, anuman ang mga wikang binabasa ng desk.
Nag-iiba ayon sa plan ang mga limit na mahalaga sa pag-monitor. Nakalista ang bawat isa sa pagkakasunod na Pay as you go, Premium, Enterprise:
Ang bagong account ay may $5 signup credit at walang kailangang card, na higit pa sa walong oras ng live monitoring para subukan. Kumpleto ang talaan sa pricing page.