اسٹیشن کا صفحہ نہیں، اس کا سٹریم پیسٹ کریں۔ کسی اسٹیشن کی اصل آڈیو .mp3، .aac یا .m3u8 پر ختم ہونے والے ایڈریس پر ہوتی ہے، اور ایک بار لائیو ٹرانسکرپشن اسے پکڑ لے تو کسی کو سننے کی ضرورت نہیں رہتی۔
نیوز روم جو تین ریڈیو اسٹیشنز، دو ٹیلی ویژن اسٹریمز اور کئی یوٹیوب لائیوز کی نگرانی کرتا ہے، اسے ٹرانسکرپشن کا مسئلہ آنے سے پہلے عملے کا مسئلہ درپیش ہوتا ہے۔ کسی کو سننا پڑتا ہے، اور کسی کو ریکارڈ کا بٹن دبانا پڑتا ہے۔ سٹریم کو ذریعہ بنا کر لائیو ٹرانسکرپشن یہ دونوں کام خود سنبھال لیتی ہے: سٹریم کا ایڈریس دیں تو سرور اسے کھولتا ہے، ڈی کوڈ کرتا ہے اور نشر ہوتے ہی ٹرانسکرپٹ بناتا ہے، تاکہ کوئی پریس کانفرنس جلدی شروع ہو جائے تو کسی کو ڈیسک پر موجود نہ ہونا پڑے۔ معلوم ہوتا ہے کہ مشکل حصہ ایڈریس تلاش کرنا ہے۔
لائیو ٹرانسکرپشن اپنی آڈیو ایک ایسے سٹریم سے لے سکتی ہے جسے سرور خود حاصل کرتا ہے: انٹرنیٹ ریڈیو اسٹیشن، HLS پلے لسٹ (.m3u8)، DASH مینی فیسٹ (.mpd)، یا یوٹیوب لائیو۔ ڈیش بورڈ میں یہ 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 سٹریم پیش کرتے ہیں۔ درست ایڈریس مل جائے تو اگلا سوال یہ ہے کہ آیا وہ کبھی ختم بھی ہوتا ہے۔
لائیو سٹریم کبھی ختم نہیں ہوتا، اس لیے وہ فائل نہیں ہوتا۔ یہ فرق یوٹیوب کے لیے خاص اہمیت رکھتا ہے۔ جو یوٹیوب لائیو اس وقت نشر ہو رہا ہو وہ لائیو ٹرانسکرپشن میں آتا ہے، اور ڈیش بورڈ اسے نشر ہوتے ہوئے فالو کرتا ہے۔ جو یوٹیوب لائیو شیڈول ہو مگر ابھی شروع نہ ہوا ہو، وہ 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 کی قیمت live ہوتی ہے اگر یوٹیوب لائیو ابھی نشر ہو رہا ہو یا شیڈول ہو، کوئی بے انت HTTP سٹریم ہو، کوئی HLS پلے لسٹ جس کا خاتمہ نہ ہو، یا نشر ہوتا DASH مینی فیسٹ۔ ہر ایسی چیز کے لیے file جس کا کوئی اختتام ہو، اور جب probe فیصلہ نہ کر سکے تو unknown۔ اگر لنک بطور میڈیا نہ کھلے تو ok false ہوتا ہے اور problem ایک ایسا جملہ ہوتا ہے جو آپ دکھا سکتے ہیں۔ probe کچھ محفوظ نہیں کرتا اور فی منٹ 60 کالز تک محدود ہے۔
فائل ٹرانسکرپشن آڈیو چلنے سے کئی گنا تیز ہوتی ہے، اس لیے ختم شدہ ایک گھنٹے کا ٹیلی ویژن ایک گھنٹہ نہیں لیتا۔ لائیو سٹریم حقیقی وقت میں ٹرانسکرپٹ ہوتا ہے، مگر یہ “حقیقی وقت” بھی نشریات سے پیچھے چلتا ہے، اور یہ جاننا فائدہ مند ہے کہ کتنا پیچھے۔ Icecast سٹریم مائیکروفون سے چند سیکنڈ بعد کسی پلیئر تک پہنچتا ہے۔ HLS اور DASH سیگمنٹڈ ہوتے ہیں، اور پلیئر تب تک شروع نہیں ہوتا جب تک اس کے پاس تقریباً چھ سیکنڈ کے دو یا تین سیگمنٹ نہ ہوں، اس لیے HLS سٹریم عام طور پر نشریات سے 10 سے 30 سیکنڈ پیچھے ہوتا ہے، اور اس پر ٹرانسکرپشن کی اپنی تاخیر الگ سے شامل ہوتی ہے۔ جو لائن دیر سے آتی دکھائی دے وہ عموماً اسٹیشن کی اپنی تاخیر ہوتی ہے، ٹرانسکرپشن کی نہیں۔ ایک سٹریم سے ایک ریکارڈنگ بنتی ہے؛ ایک ڈیسک کئی چلاتا ہے، اور وہ سب ایک ہی جگہ جمع ہوتی ہیں۔
ہر لائیو ٹرانسکرپشن ہر فائل کے ساتھ ٹرانسکرپشنز کی لائبریری میں جاتی ہے۔ ہر ریکارڈنگ اپنے ٹرانسکرپٹ کے ساتھ محفوظ ہوتی ہے، اور جب الفاظ حتمی ہو جائیں تو اس کے لیے ہر زبان میں عنوان اور خلاصہ لکھا جاتا ہے۔ بولی جانے والی زبان خودکار طور پر پہچانی جاتی ہے، اور بولنے والے کسی بھی وقت زبان بدل سکتے ہیں۔ جہاں آپ زبان جانتے ہوں، اسے بتانے سے ٹرانسکرپشن کا معیار بہتر ہوتا ہے۔
لائبریری زبانوں کے پار قابلِ تلاش ہے: کسی بھی زبان کے ہر ٹرانسکرپٹ میں تلاش کریں، اور نتائج اپنی زبان میں پائیں۔ صرف انگریزی پڑھنے والا رپورٹر رومانیہ کے اسٹیشن کے صبح کے شو میں کسی وزیر کا نام تلاش کر سکتا ہے اور ہر نتیجہ انگریزی میں پڑھ سکتا ہے، ہر ایک کے ساتھ وہ ٹرانسکرپشن اور وہ وقت جب بات کہی گئی۔ تین اسٹیشنز پر اس وزیر کا نام تین مختلف املاؤں میں لکھا جائے گا؛ انگریزی میں تلاش کرنے سے تینوں املا پڑھنے کی ضرورت نہیں رہتی۔
ایک ٹرانسکرپشن کو ایک ساتھ زیادہ سے زیادہ 10 زبانوں میں ترجمہ کیا جا سکتا ہے، تاکہ ایک ہی ریکارڈنگ ہر اس زبان میں پڑھی جا سکے جس میں ڈیسک کام کرتا ہے۔ تلاش کا نتیجہ تبھی کام کا ہے جب آپ اسے حوالے کے طور پر نقل کر سکیں۔
ٹرانسکرپٹ محض الفاظ کا ڈھیر نہیں۔ API کا GET /v1/recordings/{id}/transcript sentences، الفاظ کے وقت کے ساتھ segments، اور speakers واپس کرتا ہے، تاکہ ہر حوالہ ریکارڈنگ میں سیکنڈ تک درست جگہ رکھا جا سکے۔ ڈیش بورڈ لائیو ریکارڈنگ کو اسی طرح دوبارہ چلاتا ہے جیسے وہ آئی تھی، اس کی آڈیو کے ساتھ، تاکہ حوالہ دینے سے پہلے جملہ سنا جا سکے۔
ریڈیو کی آڈیو کے کسی بھی ٹرانسکرپٹ پر، کسی بھی نظام سے بنا ہو، بھروسا کرنے سے پہلے دو باتیں جاننا فائدہ مند ہے۔ اسپیچ ریکگنیشن سب سے زیادہ ناموں، مقامات اور اعداد پر ٹھوکر کھاتی ہے، اور یہی وہ چیزیں ہیں جو رپورٹر تلاش کرتا ہے۔ جو نام اسپیچ ریکگنائزر نے پہلے کبھی نہ سنا ہو وہ قریب ترین عام لفظ بن جاتا ہے، اور درست املا سے کی گئی تلاش اسے نہیں ڈھونڈتی۔ اس کے بجائے کوئی منفرد لفظ تلاش کریں جو اسی سانس میں کہا گیا ہو، اور پھر نتیجے کے اردگرد پڑھیں۔ اور ریڈیو صرف بات چیت نہیں: موسیقی کے پس منظر، جنگلز اور اشتہاری وقفوں سے ایسی سطریں بنتی ہیں جو جملوں جیسی لگتی ہیں مگر جملے نہیں ہوتیں۔ حوالہ دینے سے پہلے آڈیو خود سن لیں۔
اسپیکر کے لیبلز کی تین ترتیبیں ہیں: off، on، یا When Needed، جو تب لیبل دکھاتی ہے جب دوسرا اسپیکر سنا جائے۔ آپ کسی ریکارڈنگ میں اسپیکر کا نام رکھ سکتے ہیں (PUT /v1/recordings/{id}/speakers/{idx})، اور ایک بار کسی اسپیکر کی آواز درج ہو جائے تو آئندہ ریکارڈنگز اسے نام سے پہچانیں گی۔ ایک اسٹیشن کے پیش کار جو ہر صبح واپس آتے ہیں، ان کے لیبل پہلے ہفتے کے بعد “Speaker 2” نہیں رہتے۔ جب حوالہ جانچ لیا جائے تو پھر اسے عمارت سے باہر جانا ہوتا ہے۔
کسی ٹرانسکرپشن کے ایکسپورٹ ٹیب پر ہر فارمیٹ کا نیوز روم میں ایک کام ہے۔ 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 SDKs یہی کالز لپیٹتے ہیں اور انہیں Developers area سے ڈاؤن لوڈ کیا جا سکتا ہے؛ API reference میں ہر روٹ اور اس کے فریمز موجود ہیں۔
ایک 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 فی ہفتہ، ڈیسک جس بھی زبان میں اسے پڑھے۔
نگرانی کے لیے اہم حدیں پلان کے لحاظ سے مختلف ہیں۔ ہر حد اس ترتیب میں دی گئی ہے: استعمال کے مطابق ادائیگی، Premium، Enterprise:
ایک نیا اکاؤنٹ $5 کے سائن اپ کریڈٹ اور بغیر کارڈ کے شروع ہوتا ہے، جو اسے آزمانے کے لیے آٹھ گھنٹے سے زیادہ لائیو نگرانی کے برابر ہے۔ مکمل جدول pricing page پر ہے۔