Устаўляйце паток, а не старонку. Сапраўднае аўдыё станцыі знаходзіцца па адрасе, які заканчваецца на .mp3, .aac або .m3u8, і калі транскрыбаванне ў рэальным часе яго атрымала, ніхто не павінен слухаць.
Рэдакцыя, якая сочыць за трема радыёстанцыямі, двума тэлевізійнымі патокамі і некалькімі прамымі эфірамі на YouTube, спачатку мае праблему з людзьмі, а не з транскрыбаваннем. Хтосьці павінен слухаць, і хтосьці павінен націснуць запіс. Транскрыбаванне ў рэальным часе, у якім крыніцай з’яўляецца паток, бярэ на сябе абедзве гэтыя задачы: дайце яму адрас патоку, і сервер адкрые яго, дэкадуе і транскрыбуе ў той момант, калі ідзе эфір, таму нікому не трэба сядзець за сталом, калі прэс-канферэнцыя пачынаецца раней. Складаным, як аказваецца, будзе знайсці адрас.
Транскрыбаванне ў рэальным часе можа браць аўдыё з патоку, які сервер загружае сам: інтэрнэт-радыёстанцыі, плэйліста HLS (.m3u8), маніфеста DASH (.mpd) або прамога эфіру на YouTube. На панэлі кіравання гэта новае транскрыбаванне ў рэальным часе па спасылцы Transcriptions → New → Live, крыніцай якога з’яўляецца паток, а не мікрафон. Адрас задаецца пры стварэнні транскрыпцыі і не мяняецца, таму маніторынг наладжваецца адзін раз і запускаецца тады, калі станцыя варта запісу.
Адрас павінен быць самім патокам, а не старонкай, якая яго прайграе. Старонка станцыі — гэта HTML; аўдыё, якое яна прайграе, ідзе з іншага месца, звычайна з сервера Icecast або Shoutcast, а плэер на старонцы знаходзіць гэты адрас з дапамогай JavaScript пасля загрузкі. Шукайце на сайце спасылку «Listen», «Direct stream» або «Other players»: яна заканчваецца на .mp3, .aac, .m3u, .m3u8 або .pls. Файл .pls ці .m3u таксама не аўдыё. Гэта кароткі тэкставы файл з некалькіх радкоў, кожны з якіх змяшчае адрас патоку; ён існуе для таго, каб настольным плэерам можна было перадаць адну спасылку, а VocalStack транскрыбуе паток, які ў ім названы. Калі вы ўставіце старонку, VocalStack запытае яе, убачыць у адказе HTML і паведаміць вам пра гэта. Кожная станцыя хавае свой паток па-рознаму; большасць хаваюць яго за кнопкай з надпісам «Listen», і гэта адзінае на старонцы, па чым не варта націскаць.
Два віды спасылак адхіляюцца адразу. Спасылкі на старонкі, якія прайграюць медыя, напрыклад Spotify, SoundCloud або Twitch, адхіляюцца, перш чым нешта злучыцца. Паток з абаронай ад капіравання таксама не падтрымліваецца: плэйліст або маніфест, які патрабуе ліцэнзіі DRM, не ўдаецца, і сістэма паведамляе пра гэта. Некаторыя патокі таксама адмаўляюць у запытах па-за межамі краіны станцыі, таму адрас, які прайграецца ў офісе, можа не прайграцца з сервера за мяжой. Калі паток гуляе ў браўзеры, але не ў VocalStack, станцыя не пускае іншыя плэеры; папрасіце ў станцыі адрас, які дазволены іншым праграмам. Большасць прапануюць паток MP3, AAC або HLS. Калі правільны адрас у вас ёсць, наступнае пытанне — ці заканчваецца ён калі-небудзь.
Жывы паток ніколі не канчаецца, таму гэта не файл. Адрозненне важнае, асабліва для YouTube. Прамы эфір на YouTube, які ідзе ў эфіры, належыць да транскрыбавання ў рэальным часе, і панэль кіравання ідзе за ім па меры трансляцыі. Прамы эфір на YouTube, які запланаваны, але яшчэ не пачаўся, паказваецца як Not live yet і можа запісвацца, калі выйдзе ў эфір. Завершанае відэа — іншая справа: у яго ёсць працягласць, таму яно транскрыбуецца як файл: устаўце спасылку ў Transcriptions → New.
Сам плэйліст паказвае, якім ён з’яўляецца, і па гэтым любы плэер адрозніць адно ад другога. У завершаным плэйлісце HLS ёсць тэг #EXT-X-ENDLIST або #EXT-X-PLAYLIST-TYPE:VOD; у жывым няма ані аднаго, і ён расце, таму плэер запытвае яго нанова кожныя некалькі секунд па новыя сегменты. Маніфест DASH мае type="dynamic", пакуль трансляцыя ідзе ў эфіры, і type="static", калі гэта ўжо запіс. MP3- ці AAC-паток з сервера Icecast не мае ніякай працягласці; ён проста ніколі не спыняецца.
З кода GET /v1/transcriptions/probe?url= вырашае гэта да таго, як што-небудзь будзе захавана. Поле kind у адказе мае значэнне live для прамога эфіру на YouTube, які ідзе ў эфіры або запланаваны, бясконцага HTTP-патоку, плэйліста HLS без канца або dynamic-маніфеста DASH. Значэнне file азначае, што ў таго ёсць канец, а unknown — што праверка не змагла вызначыць. Калі спасылка не адкрылася як медыя, ok мае значэнне false, а problem — гэта сказ, які можна паказаць карыстальніку. Праверка нічога не захоўвае і абмежаваная 60 выклікамі за хвіліну.
Транскрыбаванне файлаў ідзе ў многа разоў хутчэй за гук, таму завершаная гадзіна тэлебачання не займае гадзіну. Паток у рэальным часе транскрыбуецца ў рэальным часе, але «рэальны час» ужо адстае ад трансляцыі, і варта ведаць, на колькі. Паток Icecast даходзіць да плэера праз некалькі секунд пасля мікрафона. HLS і DASH разбіваюцца на сегменты, і плэер не пачне, пакуль не атрымае два-тры сегменты па шэсць секунд кожны, таму паток HLS звычайна адстае ад трансляцыі на 10–30 секунд, перш чым транскрыбаванне дадасць сваю затрымку. Радок, які з’яўляецца з спазненнем, звычайна — гэта затрымка станцыі, а не сістэмы транскрыбавання. Адзін паток дае адзін запіс; рэдакцыя вядзе некалькі, і ўсе яны трапляюць у адно месца.
Кожнае транскрыбаванне ў рэальным часе трапляе ў бібліятэку Transcriptions разам з кожным файлам. Кожны запіс захоўваецца разам са сваім транскрыптам, а калі словы фіналізаваныя, для яго пішуцца назва і падсумаванне на кожнай мове. Мова маўлення вызначаецца аўтаматычна, і спікеры могуць мяняць мову ў любы момант. Калі вы ведаеце мову, яе ўказанне паляпшае якасць транскрыбавання.
Бібліятэка шукае праз мовы: шукайце па кожным транскрыпту, на якой бы мове ён ні быў, і атрымлівайце вынікі ў сваёй. Журналіст, які чытае толькі па-англійску, можа знайсці ў ранішняй праграме румынскай станцыі імя міністра і прачытаць супадзенні па-англійску, кожнае з транскрыпцыяй, з якой яно ўзята, і часам, калі яно было сказана. Імя міністра на трох станцыях будзе напісана трыма спосабамі; пошук па ім па-англійску дазваляе не чытаць усе тры варыянты.
Транскрыпцыю можна перакласці адразу на да 10 моў, таму адзін і той жа запіс чытаецца на кожнай мове, з якой працуе рэдакцыя. Вынік пошуку карысны толькі тады, калі яго можна працытаваць.
Транскрыпт — не суцэльны тэкст. GET /v1/recordings/{id}/transcript у API вяртае sentences, segments з часам кожнага слова і speakers, таму цытату можна звязаць з запісам да секунды. Панэль кіравання прайграе прамы запіс дакладна так, як ён прыйшоў, разам з гукам, таму сказ можна паслухаць перад тым, як яго працытаваць.
Перш чым давяраць любому транскрыпту радыёгуку, з любой сістэмы, варта ведаць дзве рэчы. Распазнаванне маўлення найбольш памыляецца на ўласных назвах, месцах і лічбах, а менавіта іх журналіст і шукае. Імя, якое распазнавальнік ніколі не бачыў, выходзіць як найбліжэйшае агульнае слова, і пошук па правільным напісанні яго не знаходзіць. Замест гэтага шукайце выразнае слова, сказанае ў той жа фразе, а потым чытайце вакол супадзення. І радыё — не толькі маўленне: музычныя падкладкі, джынглы і рэкламныя блокі даюць радкі, якія выглядаюць як сказы, але імі не з’яўляюцца. Праверце гук, перш чым цытаваць.
Пазнакі спікераў маюць тры налады: off, on або When Needed, якая паказвае пазнакі, калі пачуты другі спікер. Вы можаце назваць спікера ў запісе (PUT /v1/recordings/{id}/speakers/{idx}), і, калі голас спікера занесены, будучыя запісы распазнаюць яго па імі. Для станцыі, вядучыя якой вяртаюцца кожную раніцу, пасля першага тыдня пазнакі перастаюць быць «Speaker 2». Калі цытата правераная, яна павінна выйсці за сцены рэдакцыі.
Кожны фармат на ўкладцы Export транскрыпцыі мае сваю працу ў рэдакцыі. SRT ідзе відэарэдактару, таму кліп з патоку мае субцітры; перакладзены SRT мае іх на іншай мове. Excel ідзе даследчыку: адзін радок на сказ з часам, каб фільтраваць і рабіць заўвагі. PDF ідзе рэдактару, які хоча прачытаць усю гадзіну ў цягніку. JSON ідзе таму, хто піша ўласныя інструменты рэдакцыі. Праз API экспарт — гэта GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, з lang= для перакладзенай версіі. Download audio дае запіс як MP3 для самога пакета.
Маніторынг трансляцыі для падрыхтоўкі матэрыялу — звычайная практыка рэдакцый. Паўторная публікацыя кліпа — гэта іншая справа. Яна рэгулюецца правілам добрасумленнага выкарыстання ці fair use там, дзе вы знаходзіцеся, і ўмовамі самой станцыі, таму звычайныя правілы рэдакцыі пра цытаванне канкурэнта распаўсюджваюцца і на аўдыё канкурэнта. Усё вышэйсказанае — гэта некалькі клікаў на панэлі кіравання; для рэдакцыі з дваццаццю станцыямі лепш напісаць скрыпт.
Увесь шлях даступны ў API, уключаны ў кожны тарыф і тарыфікуецца па той жа стаўцы, што і на панэлі кіравання. Транскрыбаванне ў рэальным часе з крыніцай-патокам ствараецца ў стане чакання, запускаецца сваім першым запісам і кіруецца праз HTTP. Паколькі сервер сам загружае аўдыё, запуск запісу не вяртае патоку, у які вы маглі б весці перадачу: на вашым баку няма нічога, што адпраўляе гук.
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 дазваляе паўторнаму стварэнню вярнуць першае транскрыбаванне, а не другое. SDK для TypeScript і Python абгортваюць тыя ж выклікі і спампоўваюцца з раздзела Developers; у даведніку API ёсць кожны маршрут і яго кадры.
ШІ-агент можа працаваць з бібліятэкай без аніякага кода. MCP-сервер па адрасе /v1/mcp дае агенту набор інструментаў; з іх тут важныя чатыры. search_transcriptions шукае тое, што было сказана, па ўсіх транскрыбаваннях уліковага запісу на любой мове і вяртае супадаючыя радкі, кожны з транскрыпцыяй, у якой ён знаходзіцца, і часам, калі яго сказалі. get_summary вяртае падсумаванне запісу. transcribe_url і wait_for_transcription транскрыбуюць завершанае відэа або спасылку на запіс і чакаюць выніку. Запуск маніторынгу патоку застаецца ў панэлі кіравання або ў API вышэй. Налада для Claude Code, Cursor або любога кліента Streamable HTTP знаходзіцца ў Developers → Connect an AI agent; артыкул пра MCP падрабязна апісвае яе. Апошняе пытанне — колькі каштуе запуск скрыпта.
Транскрыбаванне ў рэальным часе каштуе $0.60 за гадзіну аўдыё, тарыфікуецца па секундах ($0.01 за хвіліну), з мінімумам 5 хвілін на транскрыбаванне. Транскрыбаванне ў рэальным часе каштуе даражэй за файл, таму што транскрыбуецца ў момант эфіру, столькі, колькі ідзе запіс. Файлы каштуюць $0.20 за гадзіну ($0.0033 за хвіліну; файл на 30 хвілін каштуе $0.10). Стаўкі аднолькавыя ва ўсіх тарыфах і праз API, а перакладамі, падсумаваннямі, назвамі спікераў, трансляваннем і абменам рахунак ніяк не павялічваецца.
Станцыя, за якой назіраюць восем гадзін у дзень, пяць дзён на тыдзень, — гэта 40 гадзін у рэальным часе: $24 на тыдзень, на якой бы мове рэдакцыя яе ні чытала.
Абмежаванні, важныя для маніторынгу, розныя ў залежнасці ад тарыфа. Кожнае пералічана ў парадку: Аплата па факце, Premium, Enterprise:
Новы ўліковы запіс пачынаецца з рэгістрацыйным крэдытам $5 і без карткі, чаго хопіць больш чым на восем гадзін маніторынгу ў рэальным часе, каб паспрабаваць. Поўная табліца — на старонцы цэн.