Enganxa el flux, no la pàgina. L'àudio real d'una emissora viu en una adreça que acaba en .mp3, .aac o .m3u8, i quan una transcripció en directe ja el té, ningú no ha d'escoltar.
Una redacció que segueix tres emissores de ràdio, dos canals de televisió en flux i un grapat de directes de YouTube té primer un problema de personal i després un problema de transcripció. Algú ha d'estar escoltant i algú ha de prémer el botó de gravar. Una transcripció en directe amb un flux com a font fa les dues feines: li dones l'adreça del flux i el servidor l'obre, el decodifica i el transcriu mentre s'emet, de manera que ningú no ha d'estar davant de l'escriptori quan una roda de premsa comença abans d'hora. La part difícil, resulta, és trobar l'adreça.
Una transcripció en directe pot prendre l'àudio d'un flux que el servidor mateix descarrega: una emissora de ràdio per internet, una llista de reproducció HLS (.m3u8), un manifest DASH (.mpd) o un directe de YouTube. Al tauler, és una nova transcripció en directe a Transcriptions → New → Live la font de la qual és un flux i no el micròfon. L'adreça es fixa en crear la transcripció i no canvia mai, de manera que un monitor es configura una vegada i s'inicia cada cop que l'emissora val la pena gravar.
L'adreça ha de ser el flux en si, no la pàgina web que el reprodueix. La pàgina d'una emissora és HTML; l'àudio que reprodueix ve d'un altre lloc, normalment d'un servidor Icecast o Shoutcast, i el reproductor de la pàgina troba aquesta adreça amb JavaScript després de carregar-se. Busca al lloc un enllaç que digui «Listen», «Direct stream» o «Other players»: acaba en .mp3, .aac, .m3u, .m3u8 o .pls. Un .pls o un .m3u tampoc és àudio. És un fitxer de text curt de poques línies, cadascuna amb l'adreça d'un flux; existeix perquè els reproductors d'escriptori es puguin passar un sol enllaç, i VocalStack transcriu el flux que hi apareix. Si enganxes la pàgina, VocalStack la demana, veu que torna HTML i t'ho diu. Cada emissora amaga el seu flux una mica diferent; la majoria l'amaguen darrere d'un botó marcat «Listen», que és l'única cosa de la pàgina que no val la pena clicar.
Dos tipus d'enllaç es rebutgen de bell antuvi. Els enllaços a pàgines que reprodueixen contingut multimèdia, com Spotify, SoundCloud o Twitch, es descarten abans de connectar-se a res. Tampoc no s'admeten els fluxos protegits contra còpia: una llista de reproducció o un manifest que necessita una llicència DRM falla amb un missatge que ho diu. Alguns fluxos també rebutgen les peticions de fora del país de l'emissora, de manera que una adreça que sona a l'oficina pot no sonar des d'un servidor a l'estranger. Si un flux es reprodueix en un navegador però no a VocalStack, l'emissora està refusant altres reproductors; demana-li una adreça que altres aplicacions puguin fer servir. La majoria ofereixen un flux MP3, AAC o HLS. Quan tinguis l'adreça bona, la pregunta següent és si mai s'acaba.
Un flux en directe no s'acaba mai, de manera que no és un fitxer. La distinció importa sobretot per a YouTube. Un directe de YouTube que és en antena pertany a una transcripció en directe, i el tauler el segueix mentre s'emet. Un directe de YouTube programat però que encara no ha començat es mostra com Not live yet i es pot gravar quan entri en antena. Un vídeo acabat és una altra cosa: té una durada i, per tant, es transcriu com a fitxer; enganxa l'enllaç a Transcriptions → New.
La mateixa llista de reproducció indica de quin tipus és, i així és com qualsevol reproductor distingeix els dos casos. Una llista HLS acabada porta l'etiqueta #EXT-X-ENDLIST o #EXT-X-PLAYLIST-TYPE:VOD; una en directe no en té cap i continua creixent, de manera que el reproductor la torna a descarregar cada pocs segons per buscar segments nous. Un manifest DASH declara type="dynamic" mentre l'emissió és en antena i type="static" quan ja és una gravació. Un flux MP3 o AAC d'un servidor Icecast no té durada en absolut; simplement no s'acaba mai.
Des del codi, GET /v1/transcriptions/probe?url= ho resol abans que res no es guardi. El camp kind de la resposta és live per a un directe de YouTube que és en antena o programat, per a un flux HTTP sense fi, per a una llista HLS sense final o per a un manifest DASH dinàmic. És file per a qualsevol cosa que tingui final, i unknown quan la comprovació no ho pot determinar. Quan l'enllaç no s'ha obert com a contingut multimèdia, ok és false i problem és una frase que pots mostrar. La comprovació no guarda res i està limitada a 60 crides per minut.
Les transcripcions de fitxers funcionen moltes vegades més ràpid que el temps d'àudio, de manera que una hora de televisió acabada no triga una hora. Un flux en directe es transcriu en temps real, però el «temps real» ja va per darrere de l'emissió, i convé saber quant. Un flux Icecast arriba a un reproductor uns quants segons després del micròfon. HLS i DASH van per segments, i un reproductor no arrenca fins que no té dos o tres segments d'uns sis segons cadascun; per això un flux HLS va normalment entre 10 i 30 segons per darrere de l'emissió abans que la transcripció hi afegeixi el seu propi retard. Una línia que sembla arribar tard sol ser el retard de l'emissora, no el de la transcripció. Un flux fa una gravació; una taula en fa diverses, i totes acaben al mateix lloc.
Cada transcripció en directe va a la biblioteca de Transcriptions, al costat de tots els fitxers. Cada gravació es guarda amb la seva transcripció i, quan les paraules són definitives, s'escriuen un títol i un resum per a cada idioma. L'idioma parlat es detecta automàticament, i els parlants poden canviar d'idioma en qualsevol moment. Quan saps quin és l'idioma, indicar-lo millora la qualitat de la transcripció.
La biblioteca es pot cercar entre idiomes: cerca en totes les transcripcions, sigui quin sigui el seu idioma, i obtén els resultats en el teu. Algú que només llegeix anglès pot cercar el nom d'un ministre al programa del matí de l'emissora romanesa i llegir els encerts en anglès, cadascun amb la transcripció d'on surt i l'hora en què es va dir. El nom del ministre s'escriurà de tres maneres en tres emissores; cercar-lo en anglès t'estalvia llegir les tres versions.
Una transcripció es pot traduir a fins a 10 idiomes alhora, de manera que la mateixa gravació es llegeix en cada idioma amb què treballa la redacció. Un encert de cerca només és útil si el pots citar.
Una transcripció no és un mur de text. GET /v1/recordings/{id}/transcript de l'API retorna sentences, segments amb els temps de cada paraula, i speakers, de manera que una cita es pot situar al segon dins de la gravació. El tauler reprodueix una gravació en directe exactament com va arribar, amb el seu àudio, de manera que una frase es pot escoltar abans de citar-la.
Abans de confiar en qualsevol transcripció d'àudio de ràdio, de qualsevol sistema, convé saber dues coses. El reconeixement de la parla s'equivoca més amb els noms propis, els llocs i les xifres, que són justament el que cerca un periodista. Un nom que el reconeixedor no ha vist mai surt com la paraula comuna més propera, i una cerca amb l'ortografia correcta no el troba. Cerca en canvi una paraula distintiva dita en el mateix tram de la conversa i llegeix el context de l'encert. I la ràdio no és només parla: les sintonies, les falques i els blocs publicitaris produeixen línies que semblen frases però no ho són. Comprova l'àudio abans de citar.
Les etiquetes de parlants tenen tres opcions: off, on o When Needed, que mostra les etiquetes quan se sent un segon parlant. Pots posar nom a un parlant en una gravació (PUT /v1/recordings/{id}/speakers/{idx}), i quan la veu d'un parlant està registrada, les gravacions següents el reconeixen pel nom. Per a una emissora els presentadors de la qual tornen cada matí, les etiquetes deixen de ser «Speaker 2» després de la primera setmana. Un cop comprovada la cita, ha de sortir de la redacció.
Cada format de la pestanya Export d'una transcripció té una feina a la redacció. SRT va a l'editor de vídeo, de manera que un clip de l'emissió porta subtítols; un SRT traduït els porta en un altre idioma. Excel va a qui investiga, una fila per frase amb la seva hora, per filtrar-la i anotar-la. PDF va a qui vol llegir tota l'hora al tren. JSON va a qui escriu les eines pròpies de la redacció. Per l'API, l'exportació és GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, amb lang= per a una versió traduïda. Download audio dona la gravació com a MP3 per al paquet mateix.
Vigilar una emissió per informar-ne és una pràctica habitual a la redacció. Republicar un clip és una altra cosa. Es regeix pel fair dealing o pel fair use del país on siguis, i per les condicions de l'emissora, i les regles habituals de la redacció sobre citar un competidor també s'apliquen a l'àudio del competidor. Tot el que s'ha descrit són uns quants clics al tauler; per a una redacció amb vint emissores, és millor automatitzar-ho.
Tot el camí és a l'API, inclòs en cada pla i facturat a la mateixa tarifa que el tauler. Una transcripció en directe amb un flux com a font es crea inactiva, s'inicia amb la seva primera gravació i es controla per HTTP. Com que el servidor descarrega l'àudio, començar la gravació no retorna cap flux on hagis de publicar: no hi ha res per la teva part que enviï àudio.
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"
La capçalera Idempotency-Key fa que un intent de creació repetit retorni la primera transcripció en lloc d'una segona. Els SDK de TypeScript i Python encapsulen les mateixes crides i es descarreguen des de l'àrea Developers; la referència de l'API té totes les rutes i les seves trames.
Un agent d'IA pot treballar amb la biblioteca sense cap codi. El servidor MCP a /v1/mcp dona a l'agent un conjunt d'eines; entre elles, quatre són importants aquí. search_transcriptions cerca el que s'ha dit en totes les transcripcions del compte, en qualsevol idioma, i retorna les línies que coincideixen, cadascuna amb la transcripció on és i l'hora en què es va dir. get_summary retorna el resum d'una gravació. transcribe_url i wait_for_transcription transcriuen un vídeo acabat o l'enllaç d'una gravació i esperen el resultat. Iniciar un monitor de flux en directe continua sent cosa del tauler o de l'API de dalt. La configuració per a Claude Code, Cursor o qualsevol client Streamable HTTP és a Developers → Connect an AI agent; l'article sobre MCP la explica pas a pas. Quant costa executar l'script és la darrera pregunta.
La transcripció en directe costa $0.60 per hora d'àudio, facturada per segon ($0.01 per minut), amb un mínim de 5 minuts per transcripció. El directe costa més que un fitxer perquè es transcriu mentre passa, durant tot el temps que duri. Els fitxers costen $0.20 per hora ($0.0033 per minut; un fitxer de 30 minuts costa $0.10). Les tarifes són les mateixes en tots els plans i a través de l'API, i les traduccions, els resums, el reconeixement de parlants, les emissions i la compartició mai no augmenten la factura.
Una emissora seguida vuit hores al dia, cinc dies a la setmana, són 40 hores en directe: $24 a la setmana, siguin quins siguin els idiomes en què la redacció la llegeixi.
Els límits que importen per vigilar un flux varien segons el pla. Cadascun es llista en l'ordre Pagament per ús, Premium, Enterprise:
Un compte nou comença amb un crèdit de benvinguda de $5 i sense targeta, que són més de vuit hores de seguiment en directe per provar-ho. La taula completa és a la pàgina de preus.