Sayfayı değil, yayının kendisini yapıştırın. Bir istasyonun gerçek sesi .mp3, .aac ya da .m3u8 ile biten bir adreste durur; canlı transkripsiyon bu adresi aldıktan sonra kimsenin dinlemesi gerekmez.
Üç radyo istasyonunu, iki televizyon yayınını ve birkaç YouTube canlı yayınını izleyen bir haber masasının önce bir kadro sorunu vardır; transkripsiyon sorunu ondan sonra gelir. Birinin dinlemesi, birinin de kaydı başlatması gerekir. Akış kaynaklı bir canlı transkripsiyon bu iki işi de üstlenir: akışın adresini verirsiniz, sunucu onu açar, çözer ve yayınlandığı anda yazıya döker; bir basın toplantısı erken başladığında kimsenin masada olması gerekmez. Ama zor kısım, görünen o ki, adresi bulmak.
Canlı transkripsiyon sesini, sunucunun kendisinin çektiği bir akıştan alabilir: bir internet radyosu, bir HLS oynatma listesi (.m3u8), bir DASH manifesti (.mpd) ya da bir YouTube canlı yayını. Panelde bu, mikrofon yerine bir akış kaynağı olan yeni bir canlı transkripsiyondur ve Transcriptions → New → Live adresinden oluşturulur. Adres transkripsiyon oluşturulurken belirlenir ve bir daha değişmez; bu yüzden bir izleme görevi bir kez kurulur ve istasyon kayda değer olduğunda başlatılır.
Adres, akışı oynatan web sayfası değil, akışın kendisi olmalıdır. Bir istasyonun sayfası HTML'dir; duyduğunuz ses ise başka bir yerden gelir, genellikle bir Icecast ya da Shoutcast sunucusundan, ve sayfadaki oynatıcı bu adresi sayfa yüklendikten sonra JavaScript ile bulur. Sitede "Listen", "Direct stream" ya da "Other players" bağlantısını arayın: adresi .mp3, .aac, .m3u, .m3u8 ya da .pls ile biter. Bir .pls ya da .m3u de ses değildir. Birkaç satırlık kısa bir metin dosyasıdır ve her satırda bir akışın adresi yer alır; masaüstü oynatıcılara tek bir bağlantı verilebilsin diye vardır. VocalStack, içinde adı geçen akışı yazıya döker. Sayfayı yapıştırırsanız, VocalStack onu ister, HTML geri geldiğini görür ve bunu size söyler. Her istasyon akışını biraz farklı gizler; çoğu, "Listen" yazan bir düğmenin arkasına saklar ve sayfadaki tek tıklanmaya değmeyen şey budur.
İki tür bağlantı kesinlikle reddedilir. Spotify, SoundCloud ya da Twitch gibi medya oynatan sayfalara verilen bağlantılar, hiçbir bağlantı kurulmadan geri çevrilir. Telif korumalı akışlar da desteklenmez: bir DRM lisansı gerektiren bir oynatma listesi ya da manifest, bunu söyleyen bir mesajla başarısız olur. Bazı akışlar ayrıca istasyonun ülkesi dışından gelen istekleri reddeder; yani ofiste çalışan bir adres, yurt dışındaki bir sunucudan oynamayabilir. Bir akış tarayıcıda çalışıyor ama VocalStack'te çalışmıyorsa, istasyon diğer oynatıcıları geri çeviriyordur; istasyondan diğer uygulamaların kullanmasına izin verilen bir adres isteyin. Çoğu MP3, AAC ya da HLS akışı sunar. Doğru adresi bulduktan sonra bir sonraki soru, akışın hiç bitip bitmediğidir.
Canlı bir akış hiç bitmez, bu yüzden bir dosya değildir. Ayrım özellikle YouTube için önemlidir. Yayında olan bir YouTube canlı yayını canlı transkripsiyona aittir ve Panel onu yayınlandığı gibi takip eder. Planlanmış ama henüz başlamamış bir YouTube canlı yayını Not live yet olarak gösterilir ve yayına girdiğinde kaydedilebilir. Bitmiş bir video ise başka bir şeydir: bir uzunluğu vardır, bu yüzden dosya olarak yazıya dökülür; bağlantısını Transcriptions → New adresine yapıştırın.
Oynatma listesinin kendisi hangisi olduğunu söyler ve her oynatıcı farkı bu şekilde anlar. Bitmiş bir HLS oynatma listesi #EXT-X-ENDLIST ya da #EXT-X-PLAYLIST-TYPE:VOD etiketini taşır; canlı olanda ikisi de yoktur ve liste büyümeye devam eder, bu yüzden oynatıcı yeni segmentler için her birkaç saniyede bir yeniden ister. Bir DASH manifesti, yayın havadayken type="dynamic", kayda dönüştüğünde type="static" bildirir. Icecast sunucusundan gelen bir MP3 ya da AAC akışının hiç uzunluğu yoktur; sadece hiç durmaz.
Koddan bakıldığında, hiçbir şey saklanmadan önce GET /v1/transcriptions/probe?url= bunu çözer. Yanıttaki kind alanı; yayında ya da planlanmış bir YouTube canlı yayını, sonu olmayan bir HTTP akışı, sonu olmayan bir HLS oynatma listesi ya da dinamik bir DASH manifesti için live olur. Sonu olan her şey için file, probe anlayamadığında unknown olur. Bağlantı medya olarak açılmadığında ok değeri false olur ve problem alanı gösterebileceğiniz bir cümle içerir. Probe hiçbir şey saklamaz ve dakikada 60 çağrıyla sınırlıdır.
Dosya transkripsiyonları, ses çalınandan çok daha hızlı çalışır; bu yüzden bitmiş bir saat televizyon yayını bir saat sürmez. Canlı bir akış gerçek zamanlı yazıya dökülür, ancak "gerçek zaman" yine de yayının gerisinde kalır ve bunun ne kadar olduğunu bilmek faydalıdır. Icecast akışı, mikrofondan birkaç saniye sonra bir oynatıcıya ulaşır. HLS ve DASH segmentlidir ve bir oynatıcı, her biri yaklaşık altı saniyelik iki ya da üç segment tutmadan başlamaz; bu yüzden bir HLS akışı, transkripsiyonun kendi gecikmesi eklenmeden önce bile tipik olarak yayının 10 ila 30 saniye gerisindedir. Geç gelen gibi görünen bir satır çoğunlukla istasyonun gecikmesidir, transkripsiyon sisteminin değil. Bir akış tek bir kayıt oluşturur; bir masa birkaçını çalıştırır ve hepsi aynı yere düşer.
Her canlı transkripsiyon, her dosyanın yanında Transcriptions kütüphanesine düşer. Her kayıt transkriptiyle birlikte saklanır ve sözcükler kesinleşince, her dilde bir başlık ve özet yazılır. Konuşulan dil otomatik algılanır ve konuşmacılar istedikleri zaman dil değiştirebilir. Dili bildiğinizde belirtmek transkripsiyon kalitesini artırır.
Kütüphane diller arasında aranabilir: her dildeki her transkripti arayın, sonuçları kendi dilinizde alın. Yalnızca İngilizce okuyan bir muhabir, Romence bir istasyonun sabah programında bir bakanın adını arayabilir ve sonuçları İngilizce okuyabilir; her sonuç, geldiği transkripsiyonla ve söylendiği saatle birlikte gelir. Bakanın adı üç istasyonda üç farklı biçimde yazılacaktır; onu İngilizce aramak, üçünü de tek tek okumaktan kurtarır.
Bir transkripsiyon aynı anda en fazla 10 dile çevrilebilir; böylece aynı kayıt masanın çalıştığı her dilde okunur. Bir arama sonucu ancak alıntılanabiliyorsa işe yarar.
Transkript bir yazı bloğu değildir. API'nin GET /v1/recordings/{id}/transcript uç noktası sentences, kelime zamanlamalı segments ve speakers döndürür; böylece bir alıntı kayda saniyesine kadar yerleştirilebilir. Panel, canlı bir kaydı geldiği haliyle, sesiyle birlikte yeniden oynatır; bu sayede bir cümle alıntılanmadan önce duyulabilir.
Radyo sesinin herhangi bir sistemden gelen herhangi bir transkriptine güvenmeden önce iki şeyi bilmek yararlıdır. Konuşma tanıma en çok özel adlarda, yer adlarında ve rakamlarda sendeler; bunlar tam da muhabirin aradığı şeylerdir. Tanıyıcının daha önce hiç görmediği bir ad, en yakın yaygın sözcüğe dönüşür ve adın doğru yazımına göre yapılan bir arama onu kaçırır. Bunun yerine aynı nefeste söylenen ayırt edici bir sözcüğü arayın, sonra sonucun çevresini okuyun. Ayrıca radyo yalnızca konuşmadan ibaret değildir: müzik altları, jingle'lar ve reklam blokları, cümleye benzeyen ama cümle olmayan satırlar üretir. Alıntı yapmadan önce sesi kontrol edin.
Konuşmacı etiketlerinin üç ayarı vardır: kapalı, açık ya da When Needed; bu son ayar, ikinci bir konuşmacı duyulduğunda etiketleri gösterir. Bir kayıttaki bir konuşmacıya isim verebilirsiniz (PUT /v1/recordings/{id}/speakers/{idx}) ve bir konuşmacının sesi kaydedildiğinde, sonraki kayıtlar onu adıyla tanır. Her sabah geri dönen sunucular için etiketler, ilk haftadan sonra "Speaker 2" olmaktan çıkar. Alıntı kontrol edildikten sonra, binanın dışına çıkması gerekir.
Bir transkripsiyonun Export sekmesindeki her biçimin haber masasında bir görevi vardır. SRT video editörüne gider; akıştan alınan bir klip altyazı taşır, çevrilmiş bir SRT ise onları başka bir dilde taşır. Excel araştırmacıya gider; her cümle için bir satır, zamanıyla birlikte, filtrelenip not düşülmek üzere. PDF, tüm saati trende okumak isteyen editöre gider. JSON, masanın kendi araçlarını yazan kişiye gider. API üzerinden dışa aktarma GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf ile yapılır; çevrilmiş bir sürüm için lang= eklenir. Download audio ise kaydı, paketin kendisi için MP3 olarak verir.
Bir yayını raporlamak için izlemek normal bir haber pratiğidir. Bir klibini yeniden yayımlamak ise başka bir eylemdir. Bu, bulunduğunuz yerdeki adil kullanım (fair dealing ve fair use) kurallarıyla ve istasyonun kendi koşullarıyla yönetilir; masanın bir rakibi alıntılama kuralları, rakibin sesi için de geçerlidir. Yukarıdakilerin hepsi Panelde birkaç tıklamadır; yirmi istasyonu olan bir masa için ise betiklenmesi daha iyidir.
Tüm yol API'dedir, her planda dahildir ve Panelle aynı oranda faturalandırılır. Akış kaynaklı bir canlı transkripsiyon boşta oluşturulur, ilk kaydıyla başlatılır ve HTTP üzerinden kontrol edilir. Sunucu sesi kendisi çektiği için, kaydı başlatmak size yayınlayabileceğiniz bir akış döndürmez: tarafınızda ses gönderen hiçbir şey yoktur.
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, yeniden denenen bir oluşturma isteğinin ikinci bir transkripsiyon yerine ilkini döndürmesini sağlar. TypeScript ve Python SDK'ları aynı çağrıları sarmalar ve Developers alanından indirilir; API referansı her rotayı ve çerçevesini içerir.
Bir AI ajanı kütüphaneyi hiç kod yazmadan çalıştırabilir. /v1/mcp adresindeki MCP sunucusu ajana bir araç kümesi verir; bunların içinde burada dört tanesi önemlidir. search_transcriptions, hesabın tüm transkripsiyonlarında her dilde söylenenleri arar ve eşleşen satırları, geçtiği transkripsiyonla ve söylendiği saatle birlikte döndürür. get_summary bir kaydın özetini döndürür. transcribe_url ve wait_for_transcription, bitmiş bir videoyu ya da bir kaydın bağlantısını yazıya döker ve sonucu bekler. Canlı bir akış izleyicisi başlatmak ise yukarıdaki Panel ya da API'de kalır. Claude Code, Cursor ya da herhangi bir Streamable HTTP istemcisi için kurulum Developers → Connect an AI agent altındadır; MCP makalesi adımları anlatır. Betiğin çalıştırmasının maliyeti ise son sorudur.
Canlı transkripsiyon, ses saati başına $0.60'dır; saniye başına faturalandırılır ($0.01 dakika başına) ve transkripsiyon başına 5 dakikalık bir asgari süre vardır. Canlı, bir dosyadan daha pahalıdır çünkü yayın gerçekleşirken, çalıştığı sürece yazıya dökülür. Dosyalar saat başına $0.20'dir (dakikası $0.0033; 30 dakikalık bir dosya $0.10 tutar). Oranlar her planda ve API üzerinden aynıdır; çeviriler, özetler, konuşmacı adlandırma, yayınlama ve paylaşım faturaya asla eklenmez.
Haftada beş gün, günde sekiz saat izlenen bir istasyon 40 canlı saattir: haftada $24, masanın metni hangi dillerde okuduğu fark etmez.
Bir izleme için önemli sınırlar plana göre değişir. Her biri şu sırayla listelenir: Kullandıkça Öde, Premium, Enterprise:
Yeni bir hesap, kart girmeden $5 kayıt kredisiyle başlar; bu, denemek için sekiz saatten fazla canlı izleme demektir. Tam tablo fiyatlandırma sayfasındadır.