Налепите стрим, а не страницу. Стварни звук станице налази се на адреси која се завршава на .mp3, .aac или .m3u8, и када транскрипција уживо једном добије ту адресу, нико не мора да слуша.
Редакција која прати три радио-станице, два телевизијска стрима и понеки YouTube пренос уживо пре свега има проблем с кадром, а тек онда с транскрипцијом. Неко мора да слуша, а неко мора да притисне снимање. Транскрипција уживо са стримом као извором преузима оба посла: дате јој адресу стрима, сервер га отвара, декодира и транскрибује док се емитује, па нико не мора да седи за столом кад конференција за медије почне раније. Тежак део, испоставља се, јесте налажење те адресе.
Транскрипција уживо може да узме звук из стрима који сервер сам преузима: интернет-радија, HLS плејлисте (.m3u8), DASH манифеста (.mpd) или YouTube преноса уживо. У контролној табли то је нова транскрипција уживо на Transcriptions → New → Live чији је извор стрим, а не микрофон. Адреса се поставља при креирању транскрипције и никад се не мења, па се надзор подеси једном и покрене кад станица вреди снимања.
Адреса мора бити сам стрим, а не веб-страница која га пушта. Страница станице је HTML; звук који она пушта долази с другог места, обично са Icecast или Shoutcast сервера, а плејер на страници тај адресу налази помоћу JavaScript-а након учитавања. На сајту потражите везу „Listen”, „Direct stream” или „Other players”: она се завршава на .mp3, .aac, .m3u, .m3u8 или .pls. Ни .pls ни .m3u нису звук. То је кратка текстуална датотека од неколико редова, а сваки даје адресу једног стрима; постоји да би плејери за рачунар могли да добију једну везу, а VocalStack транскрибује стрим који она наводи. Ако налепите страницу, VocalStack је захтева, види HTML као одговор и каже вам то. Свака станица крије свој стрим на другачији начин; већина га сакрива иза дугмета означеног са „Listen”, а то је једина ствар на страници коју не вреди кликнути.
Две врсте веза одбијају се одмах. Везе ка страницама које пуштају медије, као што су Spotify, SoundCloud или Twitch, одбијају се пре него што се икако повеже. Ни стримови заштићени од копирања нису подржани: плејлиста или манифест који захтева DRM лиценцу не успева уз поруку која то каже. Неки стримови такође одбијају захтеве изван земље станице, па адреса која ради у канцеларији можда неће радити са сервера у иностранству. Ако стрим ради у прегледачу, а не у VocalStack-у, станица одбија остале плејере; замолите станицу за адресу коју смеју да користе друге апликације. Већина нуди MP3, AAC или HLS стрим. Кад имате праву адресу, следеће питање је да ли се икада завршава.
Стрим уживо се никад не завршава, па није датотека. Разлика је посебно важна за YouTube. YouTube пренос уживо који је у етру припада транскрипцији уживо, а контролна табла га прати док се емитује. YouTube пренос уживо који је заказан, а још није почео, приказује се као Not live yet и може се снимати кад уђе у етар. Завршен видео је нешто друго: има дужину, па се транскрибује као датотека: налепите везу у Transcriptions → New.
Сама плејлиста каже која је, и тако сваки плејер разликује једну од друге. Завршена HLS плејлиста садржи ознаку #EXT-X-ENDLIST или #EXT-X-PLAYLIST-TYPE:VOD; жива нема ниједну и расте, па је плејер освежава сваких неколико секунди ради нових сегмената. DASH манифест декларише type="dynamic" док је пренос у етру, а type="static" кад је већ снимак. MP3 или AAC стрим из Icecast сервера уопште нема трајање; једноставно никад не престаје.
Из кода, GET /v1/transcriptions/probe?url= то утврди пре него што било шта буде сачувано. Поље kind у одговору је live за YouTube пренос уживо који је у етру или заказан, за бесконачан HTTP стрим, за HLS плејлисту без краја или за динамички DASH манифест. Вредност је file за све што има крај, а unknown кад проба није могла да утврди. Кад веза није отворена као медиј, ok је false, а problem је реченица коју можете приказати. Проба ништа не чува и ограничена је на 60 позива у минуту.
Датотеке се транскрибују много пута брже од времена које траје звук, па завршен сат телевизије не траје сат. Стрим уживо транскрибује се у реалном времену, али и „реално време” касни за емисијом, а вреди знати колико. Icecast стрим стиже до плејера неколико секунди после микрофона. HLS и DASH су сегментирани, а плејер неће почети док не добије два или три сегмента од отприлике шест секунди сваки, па HLS стрим обично касни 10 до 30 секунди за емисијом, пре него што транскрипција дода своје кашњење. Линија која делује као да касни обично касни због станице, а не због транскриптора. Један стрим прави један снимак; редакција води неколико њих, и сви завршавају на истом месту.
Свака транскрипција уживо завршава у библиотеци транскрипција, поред свих датотека. Сваки снимак се чува уз свој транскрипт, а када су речи коначне, за њега се пишу наслов и резиме, на сваком језику. Језик говора се открива аутоматски, а говорници могу да пређу на други језик у било ком тренутку. Кад знате језик, његово навођење побољшава квалитет транскрипције.
Библиотека се претражује преко језика: претражите сваки транскрипт, на ма ком језику је, и резултате добијате на вашем. Репортер који чита само енглески може да претражи јутарњу емисију румунске станице за именом министра и да прочита резултате на енглеском, сваки уз транскрипцију из које потиче и време кад је изречено. Име министра биће написано на три начина на три станице; претрага на енглеском штеди читање сва три.
Транскрипт се може превести на до 10 језика истовремено, па исти снимак може да се чита на сваком језику на којем редакција ради. Резултат претраге користан је тек ако се може навести.
Транскрипт није зид текста. API-јев GET /v1/recordings/{id}/transcript враћа sentences, segments са временима речи и speakers, па се навод може поставити до секунде у односу на снимак. Контролна табла пушта снимак уживо тачно онако како је стигао, са звуком, па се реченица може чути пре него што се наведе.
Пре него што верујете било ком транскрипту радијског звука, из било ког система, вреде две ствари. Препознавање говора најчешће греши на именима, местима и бројевима, а управо то репортер претражује. Име које препознавач никад није видео претвара се у најближу обичну реч, па претрага правилно написаног облика то пропушта. Зато тражите неку препознатљиву реч изречену у истом даху, па прочитајте околни текст. Радио није само говор: музичке подлоге, џинглови и рекламни блокови производе редове који личе на реченице, а нису. Проверите звук пре него што наведете.
Ознаке говорника имају три подешавања: off, on или When Needed, које приказује ознаке кад се чује други говорник. Говорника можете именовати у снимку (PUT /v1/recordings/{id}/speakers/{idx}), а кад је глас говорника упамћен, будући снимци га препознају по имену. За станицу чији се водитељи враћају сваког јутра ознаке престају да буду „Speaker 2” већ после прве недеље. Када је навод проверен, он мора да изађе из редакције.
Сваки формат на картици Export транскрипције има свој посао у редакцији. SRT иде видео-уреднику, па исечак из стрима добија титлове; преведени SRT носи титлове на другом језику. Excel иде истраживачу, по један ред за реченицу с временом, да се филтрира и анотира. PDF иде уреднику који жели да прочита цео сат у возу. JSON иде ономе ко пише интерне алатке редакције. Преко API-ја извоз је GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, са lang= за превод. Download audio даје снимак као MP3 за сам пакет.
Надгледање емисије ради извештавања уобичајена је новинарска пракса. Објављивање исечка из ње је нешто друго. Ту важе правила о поштеној употреби тамо где живите и услови саме станице, па се уобичајена правила редакције о цитирању конкуренције примењују и на аудио конкуренције. Све горе наведено је неколико кликова у контролној табли; за редакцију са двадесет станица боље је то аутоматизовати.
Цео пут је у API-ју, укључен у сваки пакет и наплаћује се по истој цени као у контролној табли. Транскрипција уживо са стримом као извором креира се неактивна, покреће је први снимак и управља се преко HTTP-а. Пошто сервер сам преузима звук, покретање снимка не враћа стрим у који бисте ви слали; са ваше стране ништа не шаље звук.
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 чини да поновљено креирање врати прву транскрипцију, а не другу. TypeScript и Python SDK-ови обухватају исте позиве и преузимају се из Developers области; API референца садржи сваку руту и њене оквире.
AI агент може да ради с библиотеком без икаквог кода. MCP сервер на /v1/mcp даје агенту скуп алата; међу њима су четири важна овде. search_transcriptions претражује шта је изречено у свим транскрипцијама налога, на било ком језику, и враћа одговарајуће редове, сваки са транскрипцијом у којој се налази и временом кад је изречен. get_summary враћа резиме снимка. transcribe_url и wait_for_transcription транскрибују завршени видео или везу снимка и чекају резултат. Покретање надзора стрима уживо остаје у контролној табли или у API-ју изнад. Подешавање за Claude Code, Cursor или било који Streamable HTTP клијент налази се у Developers → Connect an AI agent; чланак о MCP-у води кроз то. Колико кошта покретање скрипта, то је последње питање.
Транскрипција уживо кошта $0.60 по сату аудија, наплаћује се по секунди ($0.01 у минути), са минималних 5 минута по транскрипцији. Уживо кошта више од датотеке јер се транскрибује док се дешава, онолико дуго колико траје. Датотеке коштају $0.20 по сату ($0.0033 у минути; датотека од 30 минута кошта $0.10). Цене су исте у сваком пакету и преко API-ја, а преводи, резимеи, именовање говорника, емитовање и дељење никад не повећавају рачун.
Станица праћена осам сати дневно, пет дана у недељи, има 40 сати уживо: $24 недељно, на којим год језицима редакција то чита.
Ограничења која су важна за надзор разликују се по пакету. Свако је наведено редом: Pay as you go, Premium, Enterprise:
Нови налог почиње са кредитом за регистрацију од $5 и без картице, што је више од осам сати надзора уживо за пробу. Цела табела је на страници с ценама.