स्टेशनचा पेज नाही, स्ट्रीमचा पत्ता पेस्ट करा. स्टेशनचा खरा ऑडिओ .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". Icecast सर्व्हरवरील MP3 किंवा AAC स्ट्रीमला कोणतीही लांबी नसते; ती कधीच थांबत नाही.
कोडमधून, कुठलीही गोष्ट साठवण्यापूर्वी GET /v1/transcriptions/probe?url= हे ठरवते. उत्तरातील kind हे YouTube लाइव्हसाठी live असते, जो प्रसारित होत आहे किंवा नियोजित आहे; अंत नसलेल्या HTTP स्ट्रीमसाठी, अंत नसलेल्या HLS प्लेलिस्टसाठी किंवा dynamic DASH मॅनिफेस्टसाठीही live. ज्याला शेवट आहे त्यासाठी file, आणि प्रोबला सांगता न आल्यास unknown. लिंक मीडिया म्हणून उघडली नाही तर ok false असते आणि problem हे तुम्ही दाखवू शकणारे एक वाक्य असते. प्रोब काहीही साठवत नाही आणि प्रति मिनिट 60 कॉल्सपर्यंत मर्यादित आहे.
फाइल ट्रान्सक्रिप्शन ऑडिओ वाजतो त्यापेक्षा कितीतरी पटीने वेगाने चालतात, त्यामुळे एक तासाचा संपलेला टीव्ही कार्यक्रम प्रत्यक्षात एक तास घेत नाही. थेट स्ट्रीम रिअल-टाइममध्ये ट्रान्सक्रिप्ट होतो, पण "रिअल टाइम" म्हणजे प्रसारणाच्या किती मागे, हे जाणून घेणे उपयुक्त ठरते. Icecast स्ट्रीम मायक्रोफोनच्या काही सेकंदांनंतर प्लेअरपर्यंत पोहोचतो. HLS आणि DASH सेगमेंटमध्ये विभागलेले असतात, आणि प्लेअर सुमारे सहा सेकंदांचे दोन-तीन सेगमेंट जमा होईपर्यंत सुरू होत नाही, त्यामुळे ट्रान्सक्रिप्शनचा स्वतःचा विलंब भर घालण्यापूर्वीच HLS स्ट्रीम साधारणपणे प्रसारणाच्या 10 ते 30 सेकंद मागे असतो. एखादी ओळ उशिरा येत आहे असे वाटले, तर ते सहसा स्टेशनचा विलंब असतो, ट्रान्सक्रिप्शनचा नाही. एक स्ट्रीम एक रेकॉर्डिंग तयार करतो; एक डेस्क अनेक चालवतो आणि त्या सर्व एकाच ठिकाणी जमा होतात.
प्रत्येक थेट ट्रान्सक्रिप्शन प्रत्येक फाइलसोबत Transcriptions ग्रंथालयात जमा होते. प्रत्येक रेकॉर्डिंग आपल्या ट्रान्सक्रिप्टसोबत ठेवली जाते, आणि शब्द अंतिम झाल्यावर प्रत्येक भाषेत तिचे शीर्षक आणि सारांश लिहिला जातो. बोलली जाणारी भाषा आपोआप ओळखली जाते, आणि वक्ते कधीही भाषा बदलू शकतात. भाषा माहीत असेल तर ती नाव दिल्यास ट्रान्सक्रिप्शनची गुणवत्ता सुधारते.
ग्रंथालयात भाषा ओलांडून शोध घेता येतो: कोणत्याही भाषेतील सर्व ट्रान्सक्रिप्ट शोधा आणि निकाल तुमच्या भाषेत मिळवा. फक्त इंग्रजी वाचणारा रिपोर्टर रोमानियन स्टेशनच्या सकाळच्या कार्यक्रमात एखाद्या मंत्र्याचे नाव शोधू शकतो, आणि प्रत्येक निकाल इंग्रजीत वाचू शकतो, त्या निकालाच्या ट्रान्सक्रिप्शनसह आणि ते कधी बोलले गेले ती वेळ. तीन स्टेशनवर त्याच मंत्र्याचे नाव तीन प्रकारे लिहिले जाईल; इंग्रजीत शोधले तर तिन्ही वाचत बसावे लागत नाही.
एका ट्रान्सक्रिप्शनचे एकाच वेळी 10 भाषांपर्यंत भाषांतर करता येते, त्यामुळे तीच रेकॉर्डिंग डेस्कवर काम होणाऱ्या प्रत्येक भाषेत वाचता येते. शोध निकाल तेव्हाच उपयोगी असतो जेव्हा तो उद्धृत करता येतो.
ट्रान्सक्रिप्ट हा शब्दांचा ढीग नसतो. API चे GET /v1/recordings/{id}/transcript sentences, शब्द-वेळांसह segments आणि speakers परत देते, त्यामुळे उद्धरण रेकॉर्डिंगमध्ये सेकंदापर्यंत अचूक ठेवता येते. डॅशबोर्ड थेट रेकॉर्डिंग ते आल्याप्रमाणेच, त्याच्या ऑडिओसह पुन्हा वाजवतो, त्यामुळे उद्धृत करण्यापूर्वी वाक्य ऐकता येते.
कोणत्याही सिस्टीमकडून आलेले रेडिओ ऑडिओचे ट्रान्सक्रिप्ट विश्वासार्ह मानण्याआधी दोन गोष्टी माहीत असणे उपयुक्त आहे. स्पीच रेकग्निशन सर्वाधिक अडखळते ते व्यक्तींची नावे, ठिकाणे आणि आकडे यांवर, आणि पत्रकार नेमके हेच शोधतात. रेकग्निशनने कधीच न ऐकलेले नाव जवळच्या सामान्य शब्दासारखे बाहेर येते, आणि त्या नावाचे योग्य स्पेलिंग शोधले तर ते सापडत नाही. त्याऐवजी त्याच वाक्यात बोललेला एखादा वेगळा शब्द शोधा, आणि मग त्या निकालाभोवतीचा मजकूर वाचा. रेडिओ फक्त बोलणे नसते: संगीताचे तुकडे, जिंगल्स आणि जाहिरात-ब्रेक अशा ओळी निर्माण करतात ज्या वाक्यांसारख्या दिसतात पण नसतात. उद्धृत करण्यापूर्वी ऑडिओ तपासा.
स्पीकर लेबल्सच्या तीन सेटिंग्ज आहेत: बंद, चालू, किंवा 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 स्वरूपात देते.
प्रसारण रिपोर्टिंगसाठी मॉनिटर करणे ही न्यूजरूमची नेहमीची पद्धत आहे. त्यातील क्लिप पुन्हा प्रकाशित करणे ही वेगळी कृती आहे. ती तुम्ही जिथे आहात तिथल्या फेअर डीलिंग किंवा फेअर यूज कायद्याने, आणि स्टेशनच्या स्वतःच्या अटींनी नियंत्रित होते; त्यामुळे स्पर्धकाचा उल्लेख करण्याचे डेस्कचे नेहमीचे नियम स्पर्धकाच्या ऑडिओलाही लागू होतात. वरील सर्व काही डॅशबोर्डमध्ये काही क्लिकांवर होते; वीस स्टेशनसाठी मात्र ते स्क्रिप्ट लिहून करणे अधिक चांगले.
संपूर्ण प्रक्रिया 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 हेच कॉल्स वापरतात आणि ते Developers क्षेत्रातून डाउनलोड करता येतात; API reference मध्ये प्रत्येक राउट आणि त्याचे frames आहेत.
AI एजंट कोणत्याही कोडशिवाय ग्रंथालयावर काम करू शकतो. /v1/mcp येथील 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, डेस्क कोणत्याही भाषेत वाचत असले तरी.
मॉनिटरिंगसाठी महत्त्वाच्या मर्यादा प्लॅननुसार बदलतात. प्रत्येक मर्यादा Pay as you go, Premium, Enterprise या क्रमाने दिली आहे:
नवीन खात्याला $5 साइनअप क्रेडिट आणि कार्डाची गरज नसताना सुरुवात होते, जे त्याची चाचणी घेण्यासाठी आठ तासांहून जास्त थेट मॉनिटरिंगइतके आहे. संपूर्ण तक्ता किंमत पानावर आहे.