Lim inn strømmen, ikke siden. En stasjons faktiske lyd ligger på en adresse som slutter på .mp3, .aac eller .m3u8, og når en direktetranskripsjon først har fått den, trenger ingen å lytte.
En redaksjon som følger tre radiostasjoner, to TV-strømmer og en håndfull YouTube-direktesendinger har først et bemanningsproblem og så et transkripsjonsproblem. Noen må lytte, og noen må trykke på opptak. En direktetranskripsjon med en strøm som kilde overtar begge jobbene: gi den adressen til strømmen, så åpner serveren den, dekoder den og transkriberer den mens den sendes, slik at ingen må sitte ved pulten når en pressekonferanse starter tidlig. Det vanskelige, viser det seg, er å finne adressen.
En direktetranskripsjon kan hente lyden fra en strøm som serveren henter selv: en internettradio, en HLS-spilleliste (.m3u8), et DASH-manifest (.mpd) eller en YouTube-direktesending. I dashbordet er dette en ny direktetranskripsjon under Transcriptions → New → Live der kilden er en strøm i stedet for mikrofonen. Adressen settes når transkripsjonen opprettes og endrer seg aldri, så en overvåking settes opp én gang og startes når stasjonen er verdt å ta opp.
Adressen må være selve strømmen, ikke nettsiden som spiller den av. En stasjons side er HTML; lyden den spiller kommer fra et annet sted, vanligvis fra en Icecast- eller Shoutcast-server, og sidens spiller finner den adressen med JavaScript etter at siden er lastet. Se etter en lenke som heter «Listen», «Direct stream» eller «Other players» på nettstedet: den ender på .mp3, .aac, .m3u, .m3u8 eller .pls. En .pls eller .m3u er heller ikke lyd. Det er en kort tekstfil på noen få linjer, der hver linje gir adressen til en strøm; den finnes for at skrivebordsspillere kan få en enkelt lenke, og VocalStack transkriberer strømmen den peker på. Hvis du limer inn siden i stedet, henter VocalStack den, ser HTML komme tilbake og sier fra om det. Hver stasjon skjuler strømmen litt forskjellig; de fleste gjemmer den bak en knapp merket «Listen», som er det eneste på siden som ikke er verdt å klikke på.
To typer lenker avvises rett ut. Lenker til sider som spiller av medier, som Spotify, SoundCloud eller Twitch, avvises før noe kobler til. Strømmer med kopibeskyttelse støttes heller ikke: en spilleliste eller et manifest som krever en DRM-lisens, feiler med en melding som sier det. Noen strømmer avviser også forespørsler utenfra stasjonens land, så en adresse som spiller på kontoret, spiller kanskje ikke fra en server i utlandet. Hvis en strøm spiller i en nettleser, men ikke i VocalStack, avviser stasjonen andre spillere; be stasjonen om en adresse som andre apper har lov til å bruke. De fleste tilbyr en MP3-, AAC- eller HLS-strøm. Når du har riktig adresse, er neste spørsmål om den noen gang tar slutt.
En direktestrøm tar aldri slutt, så den er ikke en fil. Skillet er spesielt viktig for YouTube. En YouTube-direktesending som sendes, hører hjemme i en direktetranskripsjon, og dashbordet følger den mens den sendes. En YouTube-direktesending som er planlagt, men ikke har startet, vises som Not live yet og kan tas opp når den er på lufta. En ferdig video er noe annet: den har en lengde og transkriberes derfor som en fil. Lim inn lenken i Transcriptions → New.
Spillelisten sier selv hva den er, og slik skiller enhver spiller mellom dem. En ferdig HLS-spilleliste har en #EXT-X-ENDLIST-tagg eller #EXT-X-PLAYLIST-TYPE:VOD; en direkte en har ingen av delene og vokser hele tiden, så spilleren henter den på nytt hvert par sekund for nye segmenter. Et DASH-manifest erklærer type="dynamic" mens sendingen er på lufta og type="static" når det er et opptak. En MP3- eller AAC-strøm fra en Icecast-server har ingen lengde i det hele tatt; den stopper bare aldri.
Fra kode avgjør GET /v1/transcriptions/probe?url= dette før noe lagres. Svaret har feltet kind: live for en YouTube-direktesending som er på lufta eller planlagt, en strøm uten slutt, en HLS-spilleliste uten slutt eller et dynamisk DASH-manifest. Det er file for alt med en slutt, og unknown når proben ikke kunne avgjøre det. Når lenken ikke åpnet seg som media, er ok false, og problem er en setning du kan vise. Proben lagrer ingenting og er begrenset til 60 kall i minuttet.
Filtranskripsjoner kjører mange ganger raskere enn lyden spilles av, så en ferdig time med TV tar ikke en time. En direkte strøm transkriberes i sanntid, men «sanntid» ligger allerede etter sendingen, og det er verdt å vite hvor mye. En Icecast-strøm når en spiller noen sekunder etter mikrofonen. HLS og DASH er segmentert, og en spiller starter ikke før den har to eller tre segmenter på omtrent seks sekunder hver, så en HLS-strøm ligger typisk 10 til 30 sekunder etter sendingen før transkripsjonen legger til sin egen forsinkelse. En linje som later til å komme for sent, skyldes vanligvis stasjonens forsinkelse, ikke transkriberingen. Én strøm gir ett opptak; en pult kjører flere, og de havner alle på samme sted.
Hver direktetranskripsjon havner i Transcriptions-biblioteket sammen med alle filene. Hvert opptak beholdes med sin transkripsjon, og når ordene er endelige, skrives en tittel og et sammendrag for det, på alle språk. Språket oppdages automatisk, og talere kan bytte språk når som helst. Når du vet språket, gir det bedre transkripsjonskvalitet å oppgi det.
Biblioteket kan søkes på tvers av språk: søk i alle transkripsjoner, uansett språk, og få resultatene på ditt eget. En reporter som bare leser engelsk kan søke i den rumenske stasjonens morgenprogram etter en ministers navn og lese treffene på engelsk, hver med transkripsjonen de kommer fra og tidspunktet da det ble sagt. Navnet på ministeren vil bli stavet på tre måter på tre stasjoner; å søke etter det på engelsk sparer deg for å lese dem alle tre.
En transkripsjon kan oversettes til opptil 10 språk samtidig, slik at samme opptak leses på alle språkene redaksjonen jobber med. Et søketreff er bare nyttig hvis du kan sitere det.
En transkripsjon er ikke en vegg av tekst. API-ets GET /v1/recordings/{id}/transcript returnerer sentences, segments med ordtider og speakers, slik at et sitat kan plasseres til sekundet mot opptaket. Dashbordet spiller av et direkte opptak nøyaktig slik det kom inn, med lyden, slik at en setning kan høres før den siteres.
Før du stoler på en transkripsjon av radiolyd, fra hvilket system som helst, er to ting verdt å vite. Talegjenkjenning snubler mest på egennavn, steder og tall, som nettopp er det en reporter søker etter. Et navn gjenkjenneren aldri har hørt, kommer ut som det nærmeste vanlige ordet, og et søk etter den riktige stavemåten finner det ikke. Søk i stedet etter et særegent ord som ble sagt i samme pust, og les rundt treffet. Og radio er ikke bare tale: musikkunderlag, jingler og reklamepauser gir linjer som ser ut som setninger, men ikke er det. Sjekk lyden før du siterer.
Talermerking har tre innstillinger: av, på eller When Needed, som viser merking når en andre taler høres. Du kan gi en taler et navn i et opptak (PUT /v1/recordings/{id}/speakers/{idx}), og når en talers stemme er registrert, gjenkjenner fremtidige opptak dem på navn. For en stasjon der programlederne er tilbake hver morgen, slutter etikettene å være «Speaker 2» etter den første uken. Når sitatet er sjekket, må det ut av redaksjonen.
Hvert format på en transkripsjons Export-fane har en jobb i en redaksjon. SRT går til videoredigereren, så et klipp fra strømmen har undertekster; en oversatt SRT har dem på et annet språk. Excel går til researcheren, én rad per setning med tidspunkt, som skal filtreres og kommenteres. PDF går til redaktøren som vil lese hele timen på toget. JSON går til den som skriver redaksjonens egne verktøy. Gjennom API-et er eksporten GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, med lang= for en oversatt versjon. Download audio gir opptaket som en MP3 til selve innslaget.
Å overvåke en sending for rapportering er vanlig praksis i redaksjoner. Å republisere et klipp av den er noe annet. Det styres av reglene for sitat og rimelig bruk der du befinner deg, og av stasjonens egne vilkår, så redaksjonens vanlige regler for å sitere en konkurrent gjelder også konkurrentens lyd. Alt over er noen få klikk i dashbordet; for en redaksjon med tjue stasjoner er det bedre å skripte det.
Hele løpet er i API-et, inkludert i hver plan og fakturert til samme sats som i dashbordet. En direktetranskripsjon med en strøm som kilde opprettes inaktiv, startes av sitt første opptak og styres over HTTP. Fordi serveren henter lyden, returnerer det å starte et opptak ingen strøm for deg å publisere til: det finnes ingenting på din side som sender lyd.
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 gjør at et nytt forsøk på å opprette returnerer den første transkripsjonen i stedet for en andre. TypeScript- og Python-SDK-ene pakker de samme kallene og lastes ned fra utviklerområdet; API-referansen har alle rutene og rammene deres.
En AI-agent kan jobbe i biblioteket uten kode i det hele tatt. MCP-serveren på /v1/mcp gir agenten et sett med verktøy; blant dem er fire som betyr noe her. search_transcriptions søker i det som ble sagt på tvers av kontoens transkripsjoner på alle språk og returnerer de treffende linjene, hver med transkripsjonen den er i og tidspunktet den ble sagt. get_summary returnerer et opptaks sammendrag. transcribe_url og wait_for_transcription transkriberer en ferdig video eller et opptaks lenke og venter på resultatet. Å starte en overvåking av en direkte strøm blir i dashbordet eller i API-et over. Oppsettet for Claude Code, Cursor eller en hvilken som helst Streamable HTTP-klient ligger under Developers → Connect an AI agent; MCP-artikkelen går gjennom det. Hva skriptet koster å kjøre, er det siste spørsmålet.
Direkte transkripsjon koster $0.60 per time med lyd, faktureres per sekund ($0.01 per minutt), med et minimum på 5 minutter per transkripsjon. Direkte koster mer enn en fil fordi den transkriberes mens den skjer, så lenge den kjører. Filer koster $0.20 per time ($0.0033 per minutt; en fil på 30 minutter koster $0.10). Satsene er like i alle planer og via API-et, og oversettelser, sammendrag, navngivning av talere, kringkasting og deling legger aldri til på regningen.
En stasjon som overvåkes åtte timer om dagen, fem dager i uken, er 40 direktetimer: $24 i uken, uansett hvilke språk redaksjonen leser den på.
Grensene som betyr noe for overvåking varierer med plan. Hver er oppført i rekkefølgen Betal etter bruk, Premium, Enterprise:
En ny konto starter med en registreringskreditt på $5 uten kort, noe som er mer enn åtte timer med direkte overvåking å prøve det på. Hele tabellen står på prissiden.