Liitä striimi, älä sivua. Aseman oikea ääni on osoitteessa, joka päättyy .mp3-, .aac- tai .m3u8-päätteeseen, ja kun suora litterointi on saanut sen, kenenkään ei tarvitse kuunnella.
Toimituksessa, joka seuraa kolmea radioasemaa, kahta televisiostriimiä ja kourallista YouTube-suoria lähetyksiä, on ensin henkilöstöongelma ja vasta sitten litterointiongelma. Jonkun täytyy kuunnella, ja jonkun täytyy painaa tallennusta. Striimiä lähteenä käyttävä suora litterointi hoitaa molemmat tehtävät: anna sille striimin osoite, ja palvelin avaa sen, purkaa sen ja litteroi sen samalla kun se lähetetään. Kenenkään ei tarvitse istua pöydän ääressä, kun lehdistötilaisuus alkaa aikaisin. Vaikein osa on, kuten käy ilmi, osoitteen löytäminen.
Suora litterointi voi ottaa äänensä striimiltä, jonka palvelin hakee itse: internet-radioasemalta, HLS-soittolistalta (.m3u8), DASH-manifestilta (.mpd) tai YouTube-suorasta lähetyksestä. Hallintapaneelissa tämä on uusi suora litterointi kohdassa Transcriptions → New → Live, jonka lähde on striimi eikä mikrofoni. Osoite asetetaan, kun litterointi luodaan, eikä se muutu koskaan. Valvonta asetetaan siis kerran ja käynnistetään aina, kun asema on tallentamisen arvoinen.
Osoitteen täytyy olla itse striimi, ei sivu, joka sitä soittaa. Aseman sivu on HTML. Sen ääni tulee jostain muualta, yleensä Icecast- tai Shoutcast-palvelimelta, ja sivun soitin löytää tuon osoitteen JavaScriptillä sivun latauduttua. Etsi sivustolta linkki nimeltä ”Listen”, ”Direct stream” tai ”Other players”: se päättyy .mp3-, .aac-, .m3u-, .m3u8- tai .pls-tiedostopäätteeseen. Myöskään .pls tai .m3u ei ole ääntä. Se on muutaman rivin mittainen tekstitiedosto, jossa jokaisella rivillä on striimin osoite. Se on olemassa, jotta työpöytäsoittimille voidaan antaa yksi linkki, ja VocalStack litteroi striimin, jonka se nimeää. Jos liität sivun, VocalStack pyytää sitä, näkee HTML-vastauksen ja kertoo siitä sinulle. Jokainen asema piilottaa striiminsä hieman eri tavalla. Useimmat piilottavat sen ”Listen”-painikkeen taakse, ja se on ainoa asia sivulla, jota ei kannata napsauttaa.
Kaksi linkkityyppiä hylätään suoraan. Linkit sivuille, jotka soittavat mediaa, kuten Spotifyyn, SoundCloudiin tai Twitchiin, torjutaan ennen kuin yhteyttä edes avataan. Myöskään kopiosuojatut striimit eivät ole tuettuja: soittolista tai manifesti, joka vaatii DRM-lisenssin, epäonnistuu viestillä, joka kertoo siitä. Jotkin striimit hylkäävät myös pyynnöt aseman maan ulkopuolelta, joten osoite, joka toimii toimistossa, ei välttämättä toimi palvelimelta ulkomailta. Jos striimi toimii selaimessa mutta ei VocalStackissa, asema torjuu muut soittimet. Pyydä silloin asemalta osoite, jota muut sovellukset saavat käyttää. Useimmat tarjoavat MP3-, AAC- tai HLS-striimin. Kun osoite on oikea, seuraava kysymys on, päättyykö se koskaan.
Elävä striimi ei lopu koskaan, joten se ei ole tiedosto. Ero on tärkeä erityisesti YouTuben kohdalla. YouTube-suora, joka on ilmassa, kuuluu suoraan litterointiin, ja hallintapaneeli seuraa sitä lähetyksen edetessä. YouTube-suora, joka on ajastettu mutta ei ole vielä alkanut, näkyy tilassa Not live yet, ja sen voi tallentaa, kun se on ilmassa. Valmis video on eri asia: sillä on pituus, joten se litteroidaan tiedostona. Liitä linkki kohtaan Transcriptions → New.
Soittolista kertoo itse, mikä se on, ja sen kautta mikä tahansa soitin erottaa eron. Valmis HLS-soittolista sisältää tagin #EXT-X-ENDLIST tai #EXT-X-PLAYLIST-TYPE:VOD. Suora ei sisällä kumpaakaan, ja se kasvaa koko ajan, joten soitin hakee sen uudelleen muutaman sekunnin välein uusien segmenttien perässä. DASH-manifesti ilmoittaa type="dynamic", kun lähetys on ilmassa, ja type="static", kun se on tallenne. MP3- tai AAC-striimillä Icecast-palvelimelta ei ole pituutta lainkaan. Se yksinkertaisesti ei koskaan pysähdy.
Koodista GET /v1/transcriptions/probe?url= ratkaisee tämän ennen kuin mitään tallennetaan. Vastauksen kind on live YouTube-suoralle, joka on ilmassa tai ajastettu, loputtomalle HTTP-striimille, HLS-soittolistalle ilman loppua tai dynaamiselle DASH-manifestille. Se on file kaikelle, jolla on loppu, ja unknown, kun probe ei pystynyt päättelemään. Kun linkki ei avautunut mediana, ok on false ja problem on lause, jonka voit näyttää. Probe ei tallenna mitään, ja sitä rajoittaa 60 kutsua minuutissa.
Tiedostolitteroinnit kulkevat moninkertaisesti toistonopeutta nopeammin, joten valmis tunnin television litterointi ei vie tuntia. Suora striimi litteroidaan reaaliajassa, mutta ”reaaliaika” on silti jäljessä lähetyksestä, ja on hyvä tietää kuinka paljon. Icecast-striimi saavuttaa soittimen muutaman sekunnin mikrofonin jälkeen. HLS ja DASH ovat segmentoituja, ja soitin ei käynnisty ennen kuin sillä on kaksi tai kolme noin kuuden sekunnin segmenttiä. HLS-striimi on siksi tyypillisesti 10–30 sekuntia lähetyksen jäljessä, ennen kuin litterointi lisää oman viiveensä. Rivi, joka näyttää saapuvan myöhässä, on yleensä aseman viive eikä litteroijan. Yksi striimi tuottaa yhden tallenteen. Pöytä ajaa useita, ja ne kaikki päätyvät samaan paikkaan.
Jokainen suora litterointi päätyy Transcriptions-kirjastoon kaikkien tiedostojen viereen. Jokainen tallenne säilytetään litteraatin kanssa, ja kun sanat ovat lopulliset, sille kirjoitetaan otsikko ja yhteenveto jokaisella kielellä. Puhutun kielen tunnistus tapahtuu automaattisesti, ja puhujat voivat vaihtaa kieltä milloin tahansa. Kun tiedät kielen, sen nimeäminen parantaa litteroinnin laatua.
Kirjasto on haettavissa kielestä riippumatta. Hae kaikki litteraatit, millä kielellä tahansa, ja saa tulokset omalla kielelläsi. Englantia lukeva toimittaja voi hakea romanialaisen aseman aamuohjelmasta ministerin nimeä ja lukea osumat englanniksi, jokaisen siihen litterointiin ja aikaan, jolloin se sanottiin, kiinnitettynä. Ministerin nimi kirjoitetaan kolmella eri tavalla kolmella eri asemalla, ja sen hakeminen englanniksi säästää lukemasta kaikkia kolmea.
Tallenne voidaan kääntää jopa 10 kielelle kerralla, joten sama tallenne luetaan jokaisella kielellä, jota pöytä käyttää. Hakutulos on hyödyllinen vain, jos sen voi lainata.
Litteraatti ei ole tekstimassa. API:n GET /v1/recordings/{id}/transcript palauttaa sentences, segments sanakohtaisilla ajoituksilla ja speakers, joten lainaus voidaan sijoittaa sekuntitarkasti tallenteeseen. Hallintapaneeli toistaa suoran tallenteen täsmälleen sellaisena kuin se saapui, äänineen, joten lausuma voidaan kuulla ennen kuin se lainataan.
Ennen kuin luotat radioäänen litteraattiin mistä tahansa järjestelmästä, on hyvä tietää kaksi asiaa. Puheentunnistus takkuaa eniten erisnimien, paikkojen ja lukujen kohdalla, eli juuri niiden kohdalla, joita toimittaja hakee. Nimi, jota tunnistin ei ole koskaan nähnyt, tulee ulos lähimpänä olevana yleisenä sanana, eikä oikean kirjoitusasun haku löydä sitä. Hae sen sijaan erottuvaa sanaa, joka sanotaan samassa hengenvedossa, ja lue osuman ympäristö. Lisäksi radio ei ole pelkkää puhetta. Musiikkitaustat, tunnusmusiikit ja mainostauot tuottavat rivejä, jotka näyttävät lauseilta mutta eivät ole. Tarkista ääni ennen lainaamista.
Puhujamerkinnöillä on kolme asetusta: pois, päällä tai When Needed, joka näyttää merkinnät, kun toinen puhuja kuullaan. Tallenteessa voi nimetä puhujan (PUT /v1/recordings/{id}/speakers/{idx}), ja kun puhujan ääni on rekisteröity, tulevat tallenteet tunnistavat hänet nimellä. Aseman juontajille, jotka palaavat joka aamu, merkinnät lakkaavat olemasta ”Speaker 2” ensimmäisen viikon jälkeen. Kun lainaus on tarkistettu, sen on lähdettävä talosta.
Jokaisella muodolla litteroinnin Export-välilehdellä on tehtävä toimituksessa. SRT menee videoeditorille, joten striimin leikkeessä on tekstitys, ja käännetty SRT kantaa tekstityksen toisella kielellä. Excel menee tutkijalle: yksi rivi lausumaa kohden aikaleimoineen, suodatettavaksi ja merkittäväksi. PDF menee toimittajalle, joka haluaa lukea koko tunnin junassa. JSON menee sille, joka kirjoittaa toimituksen omia työkaluja. API:n kautta vienti on GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, ja käännetylle versiolle lang=. Download audio antaa tallenteen MP3-tiedostona itse paketille.
Lähetyksen valvominen raportointia varten on tavallista toimitustyötä. Sen klipin julkaiseminen uudelleen on eri asia. Siihen sovelletaan reilun käytön (fair dealing tai fair use) säännöksiä siellä, missä asut, ja aseman omia ehtoja. Toimituksen tavalliset säännöt kilpailijan lainaamisesta koskevat siis myös kilpailijan ääntä. Kaikki yllä oleva on muutaman napsautuksen päässä hallintapaneelissa. Kahdellekymmenelle asemalle se kannattaa kuitenkin skriptata.
Koko polku on API:ssa. Se on mukana jokaisessa paketissa ja laskutetaan samalla hinnalla kuin hallintapaneelissa. Striimilähteinen suora litterointi luodaan lepotilassa, sen ensimmäinen tallenne käynnistää sen, ja sitä ohjataan HTTP:n kautta. Koska palvelin hakee äänen itse, tallenteen käynnistys ei palauta striimiä, johon sinun pitäisi julkaista. Sinun puolellasi ei ole mitään, joka lähettää ääntä.
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 saa uudelleen yritetyn luonnin palauttamaan ensimmäisen litteroinnin toisen sijaan. TypeScript- ja Python-SDK:t kääräisevät samat kutsut, ja ne ladataan Developers-alueelta. API-viite sisältää jokaisen reitin ja sen kehykset.
AI-agentti voi käsitellä kirjastoa ilman mitään koodia. MCP-palvelin osoitteessa /v1/mcp antaa agentille joukon työkaluja, joista neljä on tässä olennaisia. search_transcriptions hakee kaikki tilin litteroinnit mistä tahansa kielestä ja palauttaa osuvat rivit, joista kukin kertoo litteroinnin ja ajan, jolloin se sanottiin. get_summary palauttaa tallenteen yhteenvedon. transcribe_url ja wait_for_transcription litteroivat valmiin videon tai tallenteen linkin ja odottavat tulosta. Suoran striimin valvonnan aloitus pysyy hallintapaneelissa tai yllä olevassa API:ssa. Asennus Claude Codelle, Cursorille tai mille tahansa Streamable HTTP -asiakkaalle löytyy kohdasta Developers → Connect an AI agent, ja MCP-artikkeli käy sen läpi. Viimeinen kysymys on, mitä skriptin ajaminen maksaa.
Suora litterointi maksaa $0.60 tunnilta, laskutettuna sekunnin tarkkuudella ($0.01 minuutilta), ja vähimmäiskesto on 5 minuuttia litterointia kohden. Suora maksaa enemmän kuin tiedosto, koska se litteroidaan lähetyksen aikana niin kauan kuin se kestää. Tiedostot maksavat $0.20 tunnilta ($0.0033 minuutilta; 30 minuutin tiedosto maksaa $0.10). Hinnat ovat samat jokaisessa paketissa ja API:n kautta. Käännökset, yhteenvedot, puhujien nimeäminen, lähetykset ja jakaminen eivät koskaan lisää laskua.
Asemaa, jota seurataan kahdeksan tuntia päivässä viitenä päivänä viikossa, on 40 suoraa tuntia: $24 viikossa, millä kielillä pöytä sitä lukeekin.
Seurannan kannalta tärkeät rajat vaihtelevat paketin mukaan. Jokainen on listattu järjestyksessä Pay as you go, Premium, Enterprise:
Uusi tili saa alkuun $5 saldoa ilman korttia, mikä riittää yli kahdeksaan tuntiin suoraa seurantaa kokeiluun. Täysi taulukko on hinnoittelusivulla.