Įklijuokite srauto adresą, o ne puslapį. Tikras stoties garsas slypi adrese, kuris baigiasi .mp3, .aac ar .m3u8, o kai tiesioginis transkribavimas jį pasiekia, niekam nebereikia klausytis.
Redakcijoje, kuri stebi tris radijo stotis, du televizijos srautus ir keletą YouTube tiesioginių transliacijų, pirmiausia iškyla personalo problema, o tik paskui transkribavimo. Kažkas turi klausytis, o kažkas turi paspausti įrašymo mygtuką. Tiesioginis transkribavimas, kurio šaltinis yra srautas, perima abi šias užduotis: pateikite jam srauto adresą, ir serveris jį atvers, iššifruos ir transkribuos kaip jis eteryje, todėl niekas nebūtinai turi sėdėti prie stalo, kai spaudos konferencija prasideda anksčiau. Sunkiausia, kaip paaiškėjo, yra surasti patį adresą.
Tiesioginis transkribavimas gali imti garsą iš srauto, kurį serveris pats pasiima: internetinės radijo stoties, HLS grojaraščio (.m3u8), DASH manifesto (.mpd) ar YouTube tiesioginės transliacijos. Valdymo skydelyje tai yra nauja tiesioginė transkripcija Transcriptions → New → Live, kurios šaltinis yra srautas, o ne mikrofonas. Adresas nustatomas sukūrus transkripciją ir vėliau nebekeičiamas, todėl stebėjimas nustatomas vieną kartą ir paleidžiamas tada, kai stotis verta įrašyti.
Adresas turi būti pats srautas, o ne puslapis, kuris jį groja. Stoties puslapis yra HTML; garsas, kurį jis groja, dažniausiai ateina iš kito serverio, paprastai Icecast ar Shoutcast, o puslapio grotuvas tą adresą suranda JavaScript kodu jam jau įsikrovus. Ieškokite svetainėje nuorodos „Listen“, „Direct stream“ ar „Other players“: ji baigiasi .mp3, .aac, .m3u, .m3u8 arba .pls. .pls ar .m3u taip pat nėra garsas. Tai trumpas teksto failas, kelių eilučių ilgio, kiekvienoje eilutėje nurodantis srauto adresą; jis egzistuoja tam, kad darbalaukio grotuvams būtų galima perduoti vieną nuorodą, o VocalStack transkribuoja srautą, kurį jis nurodo. Jei vietoj to įklijuosite puslapį, VocalStack jį užklaus, pamatys grįžtantį HTML ir apie tai jums praneš. Kiekviena stotis savo srautą slepia šiek tiek kitaip; dauguma slepia jį už mygtuko „Listen“, ir tai vienintelis puslapio elementas, kurio nereikia spausti.
Dvi nuorodų rūšys atmetamos iš karto. Nuorodos į puslapius, kuriuose grojama medija, pavyzdžiui Spotify, SoundCloud ar Twitch, atmetamos dar prieš prisijungiant. Srautai su autorių teisių apsauga taip pat nepalaikomi: grojaraštis ar manifestas, kuriam reikia DRM licencijos, nepavyksta, ir apie tai praneša pranešimas. Kai kurie srautai taip pat atmeta užklausas iš už stoties šalies ribų, todėl adresas, kuris groja biure, gali negroti iš serverio užsienyje. Jei srautas groja naršyklėje, bet ne VocalStack, stotis atmeta kitus grotuvus; paprašykite stoties adreso, kurį gali naudoti kitos programos. Dauguma siūlo MP3, AAC ar HLS srautą. Kai turite tinkamą adresą, kitas klausimas – ar jis kada nors baigiasi.
Tiesioginis srautas niekada nesibaigia, todėl tai ne failas. Skirtumas ypač svarbus YouTube atveju. YouTube tiesioginė transliacija, kuri eteryje, priklauso tiesioginei transkripcijai, ir valdymo skydelis ją seka, kol ji vyksta. YouTube tiesioginė transliacija, kuri suplanuota, bet dar neprasidėjo, rodoma kaip Not live yet ir gali būti įrašoma, kai pradeda eteryje. Baigtas vaizdo įrašas yra kas kita: jis turi trukmę, todėl transkribuojamas kaip failas – įklijuokite nuorodą į Transcriptions → New.
Pats grojaraštis parodo, kuris tai yra, ir taip bet koks grotuvas atskiria vieną nuo kito. Baigtame HLS grojaraštyje yra žymė #EXT-X-ENDLIST arba #EXT-X-PLAYLIST-TYPE:VOD; tiesioginiame jų nėra, jis nuolat auga, todėl grotuvas kas kelias sekundes iš naujo užklausia naujų segmentų. DASH manifestas deklaruoja type="dynamic", kol transliacija vyksta eteryje, ir type="static", kai tai jau įrašas. MP3 ar AAC srautas iš Icecast serverio neturi jokios trukmės: jis tiesiog niekada nesustoja.
Iš kodo GET /v1/transcriptions/probe?url= tai išsiaiškina dar prieš ką nors išsaugant. Atsakymo kind yra live, jei YouTube tiesioginė transliacija vyksta eteryje ar yra suplanuota, begalinis HTTP srautas, HLS grojaraštis be pabaigos ar dinaminis DASH manifestas. Jis yra file, jei turi pabaigą, ir unknown, kai probe negalėjo nustatyti. Kai nuoroda neatsidarė kaip medija, ok yra false, o problem yra sakinys, kurį galite parodyti. Probe nieko neišsaugo ir yra ribojamas iki 60 užklausų per minutę.
Failų transkribavimas vyksta daug kartų greičiau nei garsas groja, todėl baigta valanda televizijos nereikalauja valandos. Tiesioginis srautas transkribuojamas realiuoju laiku, bet „realusis laikas“ jau atsilieka nuo transliacijos, ir verta žinoti, kiek. Icecast srautas pasiekia grotuvą už kelių sekundžių nuo mikrofono. HLS ir DASH yra suskaidyti į segmentus, o grotuvas nepradės groti, kol neturės dviejų ar trijų segmentų, kurių kiekvienas trunka apie šešias sekundes, todėl HLS srautas paprastai atsilieka nuo transliacijos 10–30 sekundžių, o transkribavimas prideda savo vėlavimą. Eilutė, kuri pasirodo vėluodama, dažniausiai vėluoja dėl stoties delsos, o ne dėl transkribavimo. Vienas srautas sudaro vieną įrašą; redakcija gali vesti kelis, ir visi jie galiausiai atsiduria toje pačioje vietoje.
Kiekviena tiesioginė transkripcija patenka į Transkripcijų biblioteką kartu su kiekvienu failu. Kiekvienas įrašas saugomas kartu su savo nuorašu, o kai žodžiai galutiniai, jam parašomi pavadinimas ir santrauka visomis kalbomis. Kalba aptinkama automatiškai, o kalbėtojai gali bet kada persijungti į kitą kalbą. Kai žinote kalbą, jos nurodymas pagerina transkribavimo kokybę.
Biblioteka ieškoma visomis kalbomis: ieškokite visuose nuorašuose, kokia bebūtų jų kalba, ir gaukite rezultatus savo kalba. Reporteris, skaitantis tik angliškai, gali ieškoti rumunų kalbos stoties rytinės laidos ministro pavardės ir skaityti rezultatus angliškai, kiekvienas su transkripcija, iš kurios jis kilo, ir laiku, kada tai buvo pasakyta. Ministro pavardė trijose stotyse bus parašyta trimis skirtingais būdais; ieškoti jos angliškai sutaupo laiko skaitant visas tris versijas.
Transkripciją galima išversti į iki 10 kalbų vienu metu, todėl tas pats įrašas skaitomas kiekviena kalba, kuria dirba redakcija. Paieškos rezultatas naudingas tik tada, kai galite jį cituoti.
Nuorašas – ne sienos tekstas. API GET /v1/recordings/{id}/transcript grąžina sentences, segments su žodžių laiko žymomis ir speakers, todėl citatą galima tiksliai sekundėmis priskirti įrašui. Valdymo skydelis atkuria tiesioginį įrašą tiksliai taip, kaip jis atkeliavo, su garsu, todėl sakinį galima išgirsti prieš cituojant.
Prieš pasitikėdami bet kokiu radijo garso nuorašu, iš bet kokios sistemos, verta žinoti du dalykus. Kalbos atpažinimas dažniausiai klysta su asmenvardžiais, vietovardžiais ir skaičiais – būtent tuo, ko reporteris ieško. Pavardė, kurios atpažintuvas dar niekada nebuvo girdėjęs, virsta artimiausiu įprastu žodžiu, ir paieška pagal teisingą rašybą jos nesuranda. Vietoj to ieškokite ryškaus žodžio, pasakyto tame pačiame sakinyje, ir tada perskaitykite aplink rastą vietą. Be to, radijas nėra vien kalba: muzikos fonai, džinglai ir reklamos pertraukos sukuria eilutes, kurios atrodo kaip sakiniai, bet sakiniais nėra. Prieš cituodami patikrinkite garsą.
Kalbėtojų žymėjimas turi tris nustatymus: išjungta, įjungta arba When Needed, kuris rodo žymas, kai išgirstamas antras kalbėtojas. Įrašo kalbėtoją galima pavadinti (PUT /v1/recordings/{id}/speakers/{idx}), o kai kalbėtojo balsas užregistruotas, būsimuose įrašuose jis atpažįstamas pagal vardą. Stotims, kurių laidų vedėjai grįžta kiekvieną rytą, po pirmos savaitės žymos nebėra „Speaker 2“. Patikrinus citatą, ją reikia išleisti į pasaulį.
Kiekvienas formatas transkripcijos skirtuke Export turi savo vaidmenį redakcijoje. SRT eina į vaizdo redaktorių, kad klipas iš srauto turėtų subtitrus; išverstas SRT juos turi kita kalba. Excel eina tyrėjui, po vieną eilutę kiekvienam sakiniui su jo laiku, kad būtų galima filtruoti ir komentuoti. PDF eina redaktoriui, norinčiam perskaityti visą valandą kelionėje traukiniu. JSON eina tam, kas rašo redakcijos įrankius. Per API eksportas yra GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, o išverstai versijai – lang=. Download audio atsisiunčia įrašą kaip MP3 pačiam paketui.
Transliacijos stebėjimas pranešimams yra įprasta naujienų praktika. Jos fragmento perpublikavimas – kitas veiksmas. Jį reglamentuoja sąžiningo naudojimo taisyklės ten, kur esate, ir stoties sąlygos, todėl redakcijos įprastos taisyklės cituojant konkurentą galioja ir konkurento garsui. Viskas, kas aprašyta aukščiau, valdymo skydelyje atliekama keliais paspaudimais; dvidešimties stočių redakcijai geriau automatizuoti per skriptą.
Visas kelias pasiekiamas API, įtrauktas į kiekvieną planą ir apmokestinamas tuo pačiu tarifu kaip valdymo skydelyje. Tiesioginė transkripcija su srauto šaltiniu sukuriama neaktyvi, paleidžiama pirmuoju įrašu ir valdoma per HTTP. Kadangi garsą traukia serveris, įrašo pradžia negrąžina srauto, į kurį galėtumėte transliuoti: jūsų pusėje nėra nieko, kas siųstų garsą.
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 užtikrina, kad pakartotinis sukūrimas grąžintų pirmąją transkripciją, o ne antrą. TypeScript ir Python SDK apvynioja tuos pačius kvietimus ir atsisiunčiami iš Developers srities; API nuorodoje yra visi maršrutai ir jų kadrai.
Dirbtinio intelekto agentas gali dirbti su biblioteka visiškai be kodo. MCP serveris adresu /v1/mcp suteikia agentui įrankių rinkinį; iš jų čia svarbūs keturi. search_transcriptions ieško to, kas buvo pasakyta, visose paskyros transkripcijose bet kokia kalba ir grąžina atitinkamas eilutes, kiekviena su transkripcija, kurioje ji yra, ir laiku, kada tai buvo pasakyta. get_summary grąžina įrašo santrauką. transcribe_url ir wait_for_transcription transkribuoja baigtą vaizdo įrašą ar įrašo nuorodą ir laukia rezultato. Tiesioginio srauto stebėjimo pradžia lieka valdymo skydelyje arba aukščiau aprašytame API. Nustatymas, skirtas Claude Code, Cursor ar bet kuriam Streamable HTTP klientui, yra Developers → Connect an AI agent skiltyje; MCP straipsnyje tai aprašyta žingsnis po žingsnio. Kiek kainuoja tokio skripto veikimas – paskutinis klausimas.
Tiesioginis transkribavimas kainuoja $0.60 už valandą garso, apmokestinamas kiekvieną sekundę ($0.01 už minutę), su 5 minučių minimumu kiekvienai transkripcijai. Tiesioginis transkribavimas brangesnis nei failo, nes jis transkribuojamas, kol vyksta, tiek ilgai, kiek trunka. Failai kainuoja $0.20 už valandą ($0.0033 už minutę; 30 minučių failas kainuoja $0.10). Tarifai vienodi visuose planuose ir per API, o vertimai, santraukos, kalbėtojų pavadinimai, transliavimas ir bendrinimas į sąskaitą niekada nepridedami.
Stotis, stebima aštuonias valandas per dieną penkias dienas per savaitę, sudaro 40 tiesioginių valandų: $24 per savaitę, nepriklausomai nuo to, kokiomis kalbomis redakcija ją skaito.
Limitai, svarbūs stebėjimui, skiriasi pagal planą. Kiekvienas nurodytas tokia tvarka: Pay as you go, Premium, Enterprise:
Naujai paskyrai suteikiamas $5 registracijos kreditas be kortelės, ir to pakanka daugiau nei aštuonioms valandoms tiesioginio stebėjimo išbandyti. Visa lentelė – kainų puslapyje.