Az oldal címe helyett a streamet illeszd be. Egy adó valódi hangja .mp3, .aac vagy .m3u8 végű címen él, és amint az élő átírás megkapta, senkinek sem kell hallgatnia rá.
Egy hírszerkesztőség, amely három rádióadót, két televíziós streamet és néhány YouTube-élőadást figyel, előbb személyzeti problémával szembesül, mint átírási problémával. Valakinek figyelnie kell, és valakinek el kell indítania a felvételt. Ezt a két feladatot egyszerre veszi át az élő átírás, amelynek forrása egy stream: megadod a stream címét, a szerver megnyitja, dekódolja és menet közben átírja az adást, így senkinek sem kell az asztalánál ülnie, amikor a sajtótájékoztató korábban kezdődik. A nehéz rész, mint kiderül, maga a cím megtalálása.
Az élő átírás olyan streamből is veheti a hangot, amelyet a szerver maga húz le: internetes rádióadóból, HLS-lejátszási listából (.m3u8), DASH-manifestből (.mpd) vagy YouTube-élőből. A Dashboardban ez egy új élő átírás a Transcriptions → New → Live útvonalon, amelynek forrása a mikrofon helyett egy stream. A címet a létrehozáskor kell megadni, és később nem változik, így a figyelőt egyszer kell beállítani, és bármikor elindítani, amikor az adás felvételre érdemes.
A címnek magának a streamnek kell lennie, nem a lejátszót tartalmazó weboldalnak. Egy adó oldala HTML; a lejátszott hang máshonnan jön, általában egy Icecast- vagy Shoutcast-szerverről, és az oldal lejátszója az oldal betöltése után JavaScripttel találja meg ezt a címet. Keress az oldalon „Listen”, „Direct stream” vagy „Other players” hivatkozást: ennek a végződése .mp3, .aac, .m3u, .m3u8 vagy .pls. A .pls vagy .m3u sem hang, hanem néhány sornyi rövid szövegfájl, amelyben egy-egy stream címe áll; azért létezik, hogy az asztali lejátszók egyetlen linket kapjanak, a VocalStack pedig azt a streamet írja át, amelyet megnevez. Ha inkább az oldalt illeszted be, a VocalStack lekéri, HTML-t lát vissza, és ezt meg is mondja. Minden adó máshogy rejti el a streamet; a legtöbb egy „Listen” feliratú gomb mögé teszi, és ez az egyetlen dolog az oldalon, amire nem érdemes rákattintani.
Két linkfajtát azonnal visszautasít a rendszer. A lejátszásra szolgáló oldalakra mutató linkeket, például a Spotify, a SoundCloud vagy a Twitch linkjeit, még a kapcsolódás előtt elutasítja. A másolásvédett streamek sem támogatottak: a DRM-licencet igénylő lejátszási lista vagy manifest hibaüzenettel bukik meg, amely ezt ki is mondja. Egyes streamek az adó országán kívülről érkező kéréseket is elutasítanak, így az a cím, amely az irodában szól, egy külföldi szerverről lehet, hogy nem szól. Ha a stream böngészőben szól, a VocalStackben viszont nem, akkor az adó más lejátszóktól zárja el a hozzáférést; kérj tőlük olyan címet, amelyet más alkalmazások használhatnak. A legtöbb adó kínál MP3-, AAC- vagy HLS-streamet. Ha megvan a megfelelő cím, a következő kérdés az, hogy véget ér-e valaha.
Az élő stream sosem ér véget, ezért nem fájl. A különbség különösen a YouTube-nál számít. Az adásban lévő YouTube-élő élő átírásba való, a Dashboard pedig követi az adást, ahogy zajlik. Az ütemezett, de még el nem indult YouTube-élő Not live yet állapotot kap, és amint adásban lesz, felvehető. A befejezett videónak viszont van hossza, ezért fájlként kell átírni: illeszd be a linket a Transcriptions → New oldalon.
Maga a lejátszási lista megmondja, melyik a helyzet, és így tesz különbséget bármelyik lejátszó is. A befejezett HLS-lejátszási lista #EXT-X-ENDLIST címkét vagy #EXT-X-PLAYLIST-TYPE:VOD címkét hordoz; az élő lista egyiket sem, és folyamatosan nő, ezért a lejátszó néhány másodpercenként újra letölti, hogy új szegmenseket találjon. A DASH-manifest type="dynamic" jelzést visel, amíg az adás tart, és type="static"-ot, amint felvétellé válik. Az Icecast-szerverről érkező MP3- vagy AAC-stream nem hordoz hosszt; egyszerűen sosem áll le.
A kódból a GET /v1/transcriptions/probe?url= végpont dönt el mindent, mielőtt bármi tárolásra kerülne. A válasz kind mezője live, ha YouTube-élőről van szó, amely adásban van vagy be van ütemezve, ha végtelen HTTP-stream, ha a HLS-lejátszási lista nem ér véget, vagy ha dinamikus DASH-manifest. file az, aminek van vége, és unknown, ha a vizsgálat nem tudta eldönteni. Ha a link nem médiaként nyílt meg, az ok értéke false, a problem pedig egy mondat, amelyet megmutathatsz. A probe semmit nem tárol, és percenként 60 hívásra korlátozott.
A fájlos átírások sokkal gyorsabban futnak, mint ahogy a hang lejátszódik, így egy befejezett óra televízió nem tart egy óráig. Az élő streamet valós időben írjuk át, de a „valós idő” már lemarad az adásról, és érdemes tudni, mennyivel. Egy Icecast-stream néhány másodperccel a mikrofon után ér el a lejátszóhoz. A HLS és a DASH szegmensekre bontott, a lejátszó pedig addig nem indul, amíg két-három, egyenként mintegy hat másodperces szegmenst nem tart a kezében, ezért a HLS-stream jellemzően 10–30 másodperccel marad le az adás mögött, mielőtt az átírás még hozzáadná a saját késleltetését. Egy késve érkező sor általában az adó késleltetése, nem az átíróé. Egy stream egy felvételt készít; egy szerkesztőség több streamet is futtathat, és ezek mind ugyanabba a helyre kerülnek.
Minden élő átírás a Transcriptions könyvtárba kerül, a fájlok mellé. Minden felvétel a hozzá tartozó átirattal együtt tárolódik, és amint a szavak véglegesek, a rendszer minden nyelven címet és összefoglalót ír hozzá. A beszélt nyelvet automatikusan felismerjük, és a beszélők bármikor nyelvet válthatnak. Ha tudod a nyelvet, annak megnevezése javítja az átírás minőségét.
A könyvtár nyelvek között is kereshető: bármelyik átiratban kereshetsz, bármilyen nyelven van is, és az eredményeket a saját nyelvedben kapod. Egy csak angolul olvasó riporter a román adó reggeli műsorában kereshet egy miniszter nevére, és az találatokat angolul olvashatja, mindegyiket azzal az átirattal és azzal az idővel együtt, amikor elhangzott. A miniszter neve három adónál három különböző helyesírással szerepel majd; ha angolul keresel rá, nem kell mind a hármat elolvasni.
Egy átírás egyszerre akár 10 nyelvre is lefordítható, így ugyanaz a felvétel minden olyan nyelven olvasható, amelyen a szerkesztőség dolgozik. Egy keresési találat csak akkor hasznos, ha idézhető.
Az átirat nem szövegfal. Az API GET /v1/recordings/{id}/transcript végpontja sentences, szavankénti időzítésű segments és speakers mezőket ad vissza, így egy idézet a felvételen belül a másodpercre pontosan elhelyezhető. A Dashboard az élő felvételt pontosan úgy játssza vissza, ahogy érkezett, a hanggal együtt, így a mondat meghallgatható, mielőtt idéznéd.
Mielőtt bármilyen rendszer rádióhangból készült átiratának bízol, két dolgot érdemes tudni. A beszédfelismerés leginkább a tulajdonneveken, helyneveken és számokon botlik meg, pont azokon, amiket a riporter keres. Egy olyan nevet, amelyet a felismerő még sosem hallott, a legközelebbi köznapi szóval ír át, és a helyes írásmódra keresve nem találod meg. Ilyenkor keress egy jellegzetes szót, amely ugyanabban a mondatban hangzott el, és olvasd el a találat környékét. Emellett a rádió nem csak beszéd: zenei aláfestések, dzsinglek és reklámblokkok olyan sorokat hoznak létre, amelyek mondatnak látszanak, de nem azok. Ellenőrizd a hangot, mielőtt idézed.
A beszélőcímkéknek három beállításuk van: ki, be vagy When Needed, amely akkor mutat címkéket, amikor már egy második beszélő is megszólal. A felvételen egy beszélőt elnevezhetsz (PUT /v1/recordings/{id}/speakers/{idx}), és ha egy beszélő hangját már regisztráltad, a későbbi felvételek név szerint ismerik fel. Egy olyan adónál, ahol a műsorvezetők minden reggel visszatérnek, a címkék az első hét után már nem „Speaker 2” lesznek. Az ellenőrzött idézetnek pedig el kell jutnia az épületből.
Az átirat Export fülén minden formátumnak van feladata a szerkesztőségben. Az SRT a videószerkesztőhöz kerül, így a streamből készült klip feliratot kap; a lefordított SRT más nyelvű feliratot. Az Excel a kutatónak megy, soronként egy mondattal és az idejével, hogy szűrhető és jegyzetelhető legyen. A PDF a szerkesztőnek készül, aki a vonaton akarja elolvasni az egész órát. A JSON azoknak, akik a szerkesztőség saját eszközeit írják. Az API-n keresztül az export a GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf végponton érhető el, a lang= paraméterrel a lefordított változathoz. A Download audio a felvételt MP3-ként adja, magához a csomaghoz.
Egy adás figyelése riportokhoz a szerkesztőségi gyakorlat része. Egy klip újraközlése viszont más. Ezt a helyi méltányos felhasználási szabályok (fair dealing vagy fair use) szabályozzák, illetve az adó saját feltételei; ezért a szerkesztőség szokásos szabályai a versenytárs idézésére a versenytárs hangjára is vonatkoznak. A fentiek a Dashboardban néhány kattintással elvégezhetők; húsz adó esetén viszont érdemesebb szkriptben megoldani.
Az egész út az API-ban van, minden csomagban benne van, és ugyanazon az áron számlázzuk, mint a Dashboardban. Egy stream forrású élő átírás álló állapotban jön létre, az első felvétel indítja el, és HTTP-n keresztül vezérelhető. Mivel a szerver húzza le a hangot, a felvétel indítása nem ad vissza olyan streamet, amelybe neked kellene publikálnod: a te oldaladon semmi sem küld hangot.
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"
Az Idempotency-Key azt jelenti, hogy egy újrapróbált létrehozási kérés az első átírást adja vissza, nem egy másodikat. A TypeScript- és Python-SDK ugyanezeket a hívásokat csomagolja, és a Developers area oldalról tölthetők le; az API-referencia minden útvonalat és keretet tartalmaz.
Az MI-ügynök kód nélkül is kezelheti a könyvtárat. Az MCP-szerver a /v1/mcp címen az ügynöknek eszközkészletet ad; ezek közül négy számít itt. A search_transcriptions a fiók összes átiratában keres, bármilyen nyelven, és a találatokat sorokban adja vissza, mindegyiket az átirattal és az elhangzás idejével. A get_summary egy felvétel összefoglalóját adja vissza. A transcribe_url és a wait_for_transcription egy befejezett videót vagy egy felvétel linkjét írja át, és megvárja az eredményt. Egy élő stream figyelésének elindítása a Dashboardon vagy a fent leírt API-n marad. A Claude Code-, Cursor- vagy bármely Streamable HTTP-kliens beállítása a Developers → Connect an AI agent alatt található; az MCP-cikk lépésről lépésre végigvezet rajta. Hogy mennyibe kerül futtatni a szkriptet, az az utolsó kérdés.
Az élő átírás óránként $0.60 hangidőre számítódik, másodpercre számlázva ($0.01 percenként), átiratonként 5 perces minimummal. Az élő drágább, mint a fájl, mert az adás közben íródik át, és ameddig fut, annyiba kerül. A fájlok óránként $0.20 ($0.0033 percenként; egy 30 perces fájl $0.10). Az árak minden csomagban és az API-n keresztül is ugyanazok, a fordítások, összefoglalók, beszélőnevezés, közvetítés és megosztás pedig soha nem növelik a számlát.
Egy adó, amelyet napi nyolc órán át, heti öt napon figyelnek, heti 40 élő órát tesz ki: $24 hetente, bármilyen nyelveken olvassa is a szerkesztőség.
A figyeléshez fontos korlátok csomagonként változnak. Mindegyiket a Pay as you go, Premium, Enterprise sorrendben adjuk meg:
Az új fiók $5 regisztrációs kredittel indul, bankkártya nélkül, ami több mint nyolc óra élő figyelés kipróbálásához elég. A teljes táblázat az árak oldalán található.