لینک خود استریم را بچسبانید، نه صفحه. صدای واقعی یک ایستگاه در نشانیای قرار دارد که به .mp3، .aac یا .m3u8 ختم میشود، و وقتی رونویسی زنده به آن دسترسی پیدا کند، دیگر لازم نیست کسی گوش بدهد.
اتاق خبری که سه ایستگاه رادیویی، دو استریم تلویزیونی و چند پخش زندهٔ یوتیوب را زیر نظر دارد، پیش از آنکه با مشکل رونویسی روبهرو باشد، با مشکل نیروی انسانی روبهرو است. باید کسی گوش بدهد و کسی ضبط را بزند. یک رونویسی زنده با استریم بهعنوان منبع، هر دو کار را بر عهده میگیرد: نشانی استریم را به آن بدهید، سرور آن را باز میکند، رمزگشایی میکند و همانطور که پخش میشود رونویسی میکند، پس وقتی نشست خبری زودتر شروع میشود، لازم نیست کسی پشت میز باشد. معلوم میشود که بخش سخت، پیدا کردن نشانی است.
یک رونویسی زنده میتواند صدایش را از استریمی بگیرد که خود سرور آن را دریافت میکند: یک ایستگاه رادیویی اینترنتی، یک فهرست پخش HLS (.m3u8)، یک مانیفست DASH (.mpd) یا یک پخش زندهٔ یوتیوب. در داشبورد، این یعنی یک رونویسی زندهٔ جدید در Transcriptions → New → Live که منبعش یک استریم است، نه میکروفون. نشانی هنگام ساخت رونویسی تنظیم میشود و هرگز تغییر نمیکند، پس یک پایش را یکبار راه میاندازید و هر وقت ایستگاه ارزش ضبط داشت، آن را شروع میکنید.
نشانی باید خود استریم باشد، نه صفحه وبی که آن را پخش میکند. صفحهٔ یک ایستگاه HTML است؛ صدایی که پخش میشود از جای دیگری میآید، معمولاً از یک سرور Icecast یا Shoutcast، و پخشکنندهٔ صفحه پس از بارگذاری با جاوااسکریپت آن نشانی را پیدا میکند. در سایت دنبال پیوندی با عنوان "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" را اعلام میکند. یک استریم MP3 یا AAC از سرور Icecast اصلاً مدتی ندارد؛ فقط هرگز تمام نمیشود.
از طریق کد، GET /v1/transcriptions/probe?url= پیش از ذخیرهٔ هر چیزی این را مشخص میکند. مقدار kind در پاسخ live است برای پخش زندهٔ یوتیوب که روی آنتن است یا برنامهریزی شده، یک استریم HTTP بیپایان، یک فهرست پخش HLS بدون پایان، یا یک مانیفست DASH پویا. مقدار آن file است برای هر چیزی که پایان دارد، و unknown وقتی که probe نتوانسته تشخیص دهد. وقتی پیوند بهعنوان رسانه باز نشد، ok برابر false است و problem جملهای است که میتوانید نشانش دهید. probe چیزی را نگه نمیدارد و به 60 فراخوانی در دقیقه محدود است.
رونویسی فایل چندین برابر سریعتر از پخش صدا انجام میشود، پس یک ساعت تلویزیون تمامشده یک ساعت طول نمیکشد. استریم زنده بهصورت بلادرنگ رونویسی میشود، اما «بلادرنگ» از قبل کمی عقبتر از پخش است، و ارزش دارد بدانید چقدر. یک استریم Icecast چند ثانیه پس از میکروفون به پخشکننده میرسد. HLS و DASH به بخشهایی تقسیم میشوند و پخشکننده تا وقتی دو یا سه بخش هر کدام حدود شش ثانیه را در اختیار نداشته باشد شروع نمیکند، پس یک استریم HLS معمولاً 10 تا 30 ثانیه پشت پخش است، پیش از آنکه خود رونویسی تأخیر خودش را اضافه کند. خطی که دیرتر از موعد به نظر میرسد معمولاً تأخیر خود ایستگاه است، نه تأخیر رونویسکننده. هر استریم یک ضبط میسازد؛ یک میز خبر چند استریم را اجرا میکند و همهشان در یک جا جمع میشوند.
هر رونویسی زنده در کتابخانهٔ Transcriptions کنار هر فایلی قرار میگیرد. هر ضبط همراه متن رونویسیاش نگه داشته میشود و وقتی کلمات نهایی شدند، عنوان و خلاصهای برایش در هر زبان نوشته میشود. زبان گفتار خودکار تشخیص داده میشود و گویندهها میتوانند هر لحظه زبان را عوض کنند. اگر زبان را میدانید، نام بردن از آن کیفیت رونویسی را بهتر میکند.
کتابخانه در میان زبانها قابل جستجوست: همهٔ متنها را، با هر زبانی که دارند، جستجو کنید و نتایج را به زبان خودتان بگیرید. خبرنگاری که فقط انگلیسی میخواند میتواند برنامهٔ صبحگاهی ایستگاه رومانیایی را برای نام یک وزیر جستجو کند و نتایج را به انگلیسی بخواند، با رونویسیای که نتیجه از آن آمده و زمانی که جمله گفته شده است. نام وزیر در سه ایستگاه به سه شکل نوشته خواهد شد؛ جستجوی آن به انگلیسی، خواندن هر سه را لازم نمیکند.
یک رونویسی را میتوان همزمان به حداکثر 10 زبان ترجمه کرد، تا همان ضبط به هر زبانی که میز خبر با آن کار میکند خوانده شود. نتیجهٔ جستجو فقط وقتی مفید است که بتوان از آن نقل قول کرد.
متن رونویسی یک دیوارهٔ متن نیست. GET /v1/recordings/{id}/transcript در API، مقادیر 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 میدهد تا برای بستهی خبری خودش استفاده شود.
پایش یک پخش برای گزارشدهی، رویهٔ عادی اتاق خبر است. بازنشر یک کلیپ از آن کار دیگری است. در کشور شما، این کار تابع قواعد «استفادهٔ منصفانه» (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 باعث میشود وقتی ساخت دوباره تلاش میشود، بهجای ساخت رونویسی دوم، همان رونویسی اول برگردانده شود. SDKهای TypeScript و Python همان فراخوانیها را در بر میگیرند و از بخش توسعهدهندگان دانلود میشوند؛ مرجع 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 و بدون نیاز به کارت شروع میکند، که برای امتحان آن بیش از هشت ساعت پایش زنده است. جدول کامل در صفحهٔ قیمتگذاری است.