Поставете потока, не страницата. Истинският звук на станцията е на адрес, който завършва на .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 плейлист без край или за динамичен 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 dealing или 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 прави повторено създаване да върне първата транскрипция, вместо втора. TypeScript и Python SDK обвиват същите извиквания и се изтеглят от зоната за разработчици; API справочникът съдържа всеки маршрут и неговите кадри.
AI агент може да работи с библиотеката без никакъв код. 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 и без карта, което стига за повече от осем часа наблюдение на живо, за да го изпробвате. Пълната таблица е на страницата с цените.