Kleebi voog, mitte lehekülg. Jaama tegelik heli asub aadressil, mis lõpeb .mp3, .aac või .m3u8-ga, ja kui otsetranskriptsioon sellele juba ligi pääseb, pole kellegi kuulamine enam vajalik.
Toimetusel, mis jälgib kolme raadiojaama, kahte telejaama voogu ja mitut YouTube'i otseülekannet, on esmalt personaliprobleem ja alles siis transkriptsiooniprobleem. Keegi peab kuulama ja keegi peab vajutama salvestusnuppu. Otsetranskriptsioon voo allikaga võtab mõlema töö enda peale: anna sellele voo aadress, server avab selle, dekodeerib ja transkribeerib selle juba eetris olles, nii et keegi ei pea laua taga istuma, kui pressikonverents varem algab. Raske osa on, nagu selgub, aadressi leidmine.
Otsetranskriptsioon võib heli võtta voost, mille server ise avab: internetiraadiojaamast, HLS-esitusloendist (.m3u8), DASH-manifestist (.mpd) või YouTube'i otseülekandest. Töölaual on see uus otsetranskriptsioon lehel Transcriptions → New → Live, mille allikaks on voog, mitte mikrofon. Aadress määratakse transkriptsiooni loomisel ja seda ei saa hiljem muuta, seega seadistatakse jälgimine ühe korra ning käivitatakse siis, kui jaam on salvestamist väärt.
Aadress peab olema voog ise, mitte veebileht, mis seda mängib. Jaama leht on HTML ja heli tuleb mujalt, tavaliselt Icecasti või Shoutcasti serverist; lehe mängija leiab selle aadressi JavaScripti abil pärast lehe laadimist. Otsi saidilt linki „Listen”, „Direct stream” või „Other players”: see lõpeb .mp3, .aac, .m3u, .m3u8 või .pls-ga. .pls ega .m3u ei ole samuti heli. See on paarirealine tekstifail, kus iga rida annab ühe voo aadressi; selline fail on olemas selleks, et esitusprogrammile saaks anda ühe lingi, ja VocalStack transkribeerib selle voo, mille fail nimetab. Kui kleebid selle asemel lehe, küsib VocalStack seda, saab vastuseks HTML ja teatab sellest. Iga jaam peidab oma voo veidi erinevalt; enamik peidab selle nupu „Listen” taha, ja see on ainus asi lehel, mida klõpsata ei tasu.
Kaks linki lükatakse kohe tagasi. Lingid lehtedele, mis esitavad meediat, nagu Spotify, SoundCloud või Twitch, jäetakse vastu võtmata enne, kui ühendust üldse luuakse. Autoriõigusega kaitstud voogusid ei toetata samuti: esitusloend või manifest, mis nõuab DRM-litsentsi, ebaõnnestub koos teatega, mis seda ütleb. Mõned voogud keelduvad päringutest ka väljastpoolt jaama riiki, nii et aadress, mis kontoris mängib, ei pruugi mängida välismaisest serverist. Kui voog mängib brauseris, kuid mitte VocalStackis, siis jaam tõrjub teisi mängijaid; palu jaamalt aadress, mida teised rakendused tohivad kasutada. Enamik pakub MP3-, AAC- või HLS-voogu. Kui õige aadress on käes, on järgmine küsimus, kas see kunagi lõpeb.
Otsevoog ei lõpe kunagi, seega see ei ole fail. Vahe on oluline eriti YouTube'i puhul. Eetris olev YouTube'i otseülekanne kuulub otsetranskriptsiooni ja töölaud jälgib seda, kuni see on eetris. YouTube'i otseülekanne, mis on ajastatud, kuid pole veel alanud, kuvatakse staatusega Not live yet ja seda saab salvestada, kui see on eetris. Lõppenud video on hoopis midagi muud: sellel on pikkus ja seda transkribeeritakse failina – kleebi link lehele Transcriptions → New.
Esitusloend ise ütleb, mis ta on, ja nii saab iga mängija vahet teha. Lõppenud HLS-esitusloendil on silt #EXT-X-ENDLIST või #EXT-X-PLAYLIST-TYPE:VOD; otsesel ei ole kumbagi ja see kasvab pidevalt, nii et mängija laadib seda iga paari sekundi tagant uuesti, et uusi segmente järele tuua. DASH-manifest deklareerib type="dynamic", kui ülekanne on eetris, ja type="static", kui see on salvestis. MP3- või AAC-voog Icecasti serverist ei oma üldse pikkust; see lihtsalt ei lõpe kunagi.
Koodist saab selle kontrollida enne, kui midagi salvestatakse: GET /v1/transcriptions/probe?url=. Vastuse kind on live YouTube'i otseülekande puhul, mis on eetris või ajastatud, lõputu HTTP-voo, lõputu HLS-esitusloendi või dünaamilise DASH-manifesti puhul. See on file kõige puhul, millel on lõpp, ja unknown, kui probe ei suutnud kindlaks teha. Kui link ei avanenud meediana, on ok väärtuseks false ja problem on lause, mida saab kasutajale näidata. Probe ei salvesta midagi ja seda piirab 60 päringut minutis.
Failide transkribeerimine käib mitu korda kiiremini, kui heli mängib, seega ei võta lõpetatud tunnine telesaade tunniga aega. Otsevoogu transkribeeritakse reaalajas, kuid „reaalaeg” jääb ülekandest juba maha, ja on hea teada, kui palju. Icecasti voog jõuab mängijani mõne sekundi jooksul pärast mikrofoni. HLS ja DASH on segmenteeritud ning mängija ei alusta enne, kui tal on kaks-kolm segmenti, igaüks umbes kuue sekundi pikkune; seega on HLS-voog tavaliselt 10–30 sekundit ülekandest maas enne, kui transkriptsioon lisab oma viivituse. Rida, mis tundub hilja saabuvat, on tavaliselt jaama viivitus, mitte transkribeerija oma. Üks voog teeb ühe salvestise; toimetuses töötab neid mitu ja need kõik jõuavad samasse kohta.
Iga otsetranskriptsioon satub transkriptsioonide raamatukogusse kõigi failide kõrvale. Iga salvestis hoitakse koos oma transkriptiga ning kui sõnad on lõplikud, kirjutatakse sellele pealkiri ja kokkuvõte igas keeles. Kõnekeel tuvastatakse automaatselt ja kõneleja võib keelt igal ajal vahetada. Kui tead keelt, parandab selle nimetamine transkriptsiooni kvaliteeti.
Raamatukogu on kõigi keelte peale otsitav: otsi kõigist transkriptsioonidest, sõltumata nende keelest, ja saa tulemused oma keeles. Reporter, kes loeb ainult inglise keelt, saab otsida rumeenia jaama hommikusaate ministri nime järgi ja lugeda vasteid inglise keeles, igaüks koos transkriptsiooniga, millest see pärineb, ja ajaga, millal see öeldi. Ministri nime kirjutatakse kolme jaama peal kolmel viisil; selle otsimine inglise keeles säästab kolme variandi läbilugemise.
Transkriptsiooni saab tõlkida kuni 10 keelde korraga, nii et sama salvestist loetakse kõigis keeltes, millega toimetus töötab. Otsingutulemus on kasulik ainult siis, kui seda saab tsiteerida.
Transkript ei ole tekstiseina. API GET /v1/recordings/{id}/transcript tagastab sentences, segments sõnade ajastustega ja speakers, nii et tsitaat saab paigutada salvestisel täpselt sekundi täpsusega. Töölaud mängib otsesalvestise täpselt nii, nagu see saabus, koos heliga, nii et lauset saab enne tsiteerimist kuulata.
Enne kui usaldad raadioheli transkriptsiooni, mis tahes süsteemist see ka pärineb, on kaks asja, mida on hea teada. Kõnetuvastus komistab kõige enam pärisnimede, kohanimede ja arvude peal – just neid, mida reporter otsib. Nimi, mida tuvastaja pole kunagi kuulnud, tuleb välja lähima tavalise sõnana ja õige kirjapildi järgi otsing seda ei leia. Otsi selle asemel mõnda eristuvat sõna, mis öeldi samas hingetõmbes, ja loe siis tabamuse ümbert. Ja raadio ei ole kõik kõne: muusikaalused, jingle'id ja reklaamipausid tekitavad ridu, mis näevad välja nagu laused, aga ei ole. Kontrolli heli enne tsiteerimist.
Kõnelejate sildid on kolme seadega: väljas, sees või When Needed, mis näitab silte alles siis, kui kuuldakse teist kõnelejat. Salvestises saab kõneleja nimetada (PUT /v1/recordings/{id}/speakers/{idx}) ja kui kõneleja hääl on registreeritud, tunnevad tulevased salvestised ta nime järgi ära. Jaama puhul, kus saatejuhid naasevad iga hommik, lakkavad sildid olemast „Kõneleja 2” pärast esimest nädalat. Kui tsitaat on kontrollitud, tuleb see ka toimetusest välja saata.
Igal transkriptsiooni vahekaardi Export vormingul on toimetuses oma ülesanne. SRT läheb videotoimetajale, nii et voost pärit klipp kannab subtiitreid; tõlgitud SRT kannab neid teises keeles. Excel läheb uurijale, üks rida lause kohta koos ajaga, et seda filtreerida ja märkida. PDF läheb toimetajale, kes soovib kogu tunni rongis läbi lugeda. JSON läheb sellele, kes kirjutab toimetuse enda tööriistu. API kaudu on eksport GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, tõlgitud versiooni puhul koos parameetriga lang=. Download audio annab salvestise MP3-na, et see pakendisse panna.
Ülekande jälgimine ajakirjanduslikuks kajastamiseks on tavaline toimetustöö. Selle klipi uuesti avaldamine on hoopis teine tegu. Seda reguleerib õiglase kasutuse (fair dealing või fair use) reegel sinu asukohas ning jaama enda tingimused, ja toimetuse tavalised reeglid konkurendi tsiteerimise kohta kehtivad ka konkurendi heli kohta. Kõik eelnev on Töölaual mõne klõpsuga tehtav; kakskümmend jaama toimetusel on parem see skriptida.
Kogu tee on API-s, see sisaldub igas paketis ja maksustatakse samas hinnas mis Töölaual. Voogu allikaks võtev otsetranskriptsioon luuakse tühikäigul, käivitatakse esimese salvestisega ja juhitakse HTTP kaudu. Kuna server tõmbab heli ise, ei tagasta salvestise alustamine voogu, millesse sina peaksid edastama: sinu poolelt ei saadeta heli kuhugi.
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 teeb nii, et korduv loomispäring tagastab esimese transkriptsiooni, mitte teist. TypeScripti ja Pythoni SDK-d mähivad samad päringud ja on allalaaditavad arendajate alalt; API viide sisaldab iga marsruuti ja selle sõnumeid.
AI-agent saab raamatukogus töötada ilma ühegi koodita. MCP-server aadressil /v1/mcp annab agendile tööriistade komplekti; neist neli on siin olulised. search_transcriptions otsib, mida on öeldud konto kõigis transkriptsioonides, mis tahes keeles, ja tagastab vastavad read, igaüks koos transkriptsiooniga, milles ta on, ja ajaga, millal see öeldi. get_summary tagastab salvestise kokkuvõtte. transcribe_url ja wait_for_transcription transkribeerivad lõppenud video või salvestise lingi ja ootavad tulemust. Otsevoo jälgimise alustamine jääb Töölauale või ülal kirjeldatud API-le. Seadistus Claude Code'i, Cursori või mis tahes Streamable HTTP kliendi jaoks on menüüs Developers → Connect an AI agent; MCP-artikkel käib selle läbi. Viimane küsimus on, mida skript maksab.
Otsetranskriptsioon maksab $0.60 tunni kohta, arveldatakse sekundipõhiselt ($0.01 minuti kohta) ja transkriptsiooni kohta on miinimum 5 minutit. Otsene maksab failist rohkem, sest seda transkribeeritakse kohe, nii kaua kui see kestab. Failid maksavad $0.20 tunni kohta ($0.0033 minuti kohta; 30-minutiline fail maksab $0.10). Hinnad on kõigis paketides ja API kaudu samad ning tõlked, kokkuvõtted, kõnelejate nimetamine, ülekanded ja jagamine ei lisa arvele midagi.
Jaama, mida jälgitakse kaheksa tundi päevas viis päeva nädalas, on 40 otsetundi: $24 nädalas, sõltumata sellest, mitmes keeles toimetus seda loeb.
Jälgimise jaoks olulised piirangud sõltuvad paketist. Igaüks on loetletud järjekorras Maksa kasutuse järgi, Premium, Enterprise:
Uuel kontol on algul $5 registreerimiskrediit ja kaarti pole vaja, see on rohkem kui kaheksa tundi otsejälgimist proovimiseks. Täielik tabel on hinnalehel.