Canlı çevirideki gecikmenin çoğu beklemedir: akış için, bir sonraki kelime için, cümle için. Kontrol edebildiğiniz tek parça gecikme modudur: daha az gecikme mi, yoksa daha az revizyon mu.
Canlı çeviri izleyen bir dinleyici, her satırı konuşmacı söyledikten birkaç saniye sonra görür. Bu boşluk tek bir gecikme değil, bir zincir boyunca birikmiş birkaç gecikmedir ve bunların çoğu bir tür beklemedir. Hangi beklemenin hangisi olduğunu bilmek gecikme modunu kolay bir seçim haline getirir; bir geliştiriciye de okuyucuda neyi ne zaman göstereceğini söyler.
Rakamlardan önce işe yarar bir ölçü: insan eşzamanlı tercüman genellikle konuşmacının iki ila dört saniye gerisinde konuşur. Tercümanlar bu boşluğa kulak-ses aralığı derler. Fiili sonda getiren dillerle, fiili beklemek yerine tahmin ederek ya da cümleyi tek başına durabilecek parçalara bölerek başa çıkarlar. Bir ya da iki saniyelik gecikme yazılımın bir kusuru değildir; çok iyi bir insanın da yaptığı şeydir.
VocalStack üzerindeki her canlı transkripsiyon aynı aşamalardan, aynı sırayla geçer ve her aşama kendinden öncekini bekler.
Orijinal dildeki metin okuyucuya konuşulduğu hemen hemen anda ulaşır. Çeviri bir ya da iki saniye sonra gelir ve konuşulan cümle çevirisinden sonra gelir; bu yüzden bir ses klibi her zaman en sonda ulaşır. Zincirin ilk görünür etkisi ise sese çok önce gelir: metnin kendisi hareket eder.
Canlı bir transkriptte insanların ilk fark ettiği şey, en yeni kelimelerin yer değiştirmesidir. Bir ifade belirir, değişir ve yerleşir. Bu, taslak aşamasının işidir ve her konuşma tanıyıcı için geçerli bir nedenle vardır.
Bir tanıyıcı bir kelimeyi, ondan sonra gelen şeye bakarak yerleştirir. "I scream" ile "ice cream" bir sonraki kelime gelene kadar aynı şekilde duyulur; sondaki bir "s" bu kelimeye de sonrakine de ait olabilir. Bir kelimenin sağında ses olmadığı sürece yazımı bir tahmindir; bu yüzden her canlı transkriptin en yeni kelimeleri her zaman en az emin olanlardır. Taslak, bu tahminin gizlenmek yerine erkenden gösterilmiş halidir.
Her taslak canlı kuyruğun tamamını değiştirir: son kayıttan bu yana duyulan ve hâlâ değişen kelimeleri. Kayıt kesindir. Asla değişmez, kelime düzeyinde zamanlamalar taşır ve kayıtlar boşluksuz numaralandırılır; böylece okuyucu bir kaydı kaçırıp kaçırmadığını anlayabilir.
Gerçek zamanlı API'nin bir geliştiriciden istediği tek kural şudur: önce kayıtlanmış her segmenti, ardından bunların ardındaki en son taslağı göster ve bir kayıt geldiğinde taslağı temizle. Taslakları eklemek yerine değiştirmemek, tekrarlanan ve titreyen metin üretir; kayıt kuyruğu zaten tüketir. WebSocket eğitimi tam da bu mantık üzerine bir okuyucu kurar.
Bir sunucu için metnin hareket etmesi düşük gecikmenin bedelidir. İfade bitmeden kelimeleri göstermek transkripti canlı hissettiren şeydir. Ama çeviri bu numarayı kaldıramaz, çünkü bir kelime yarım bir ifadeden tahmin edilebilir, bir çeviri ise edilemez.
Kelime sırası, çevirinin taslakla ayak uyduramamasının nedenidir. Almancada bir fiil cümlenin sonunda yer alabilir, Japonca ise fiili en sona koyar. Herhangi bir çevirmen, cümleyi doğru aktarabilmek için bütün cümleye ihtiyaç duyar. Kelime kelime çevirmek, cümle kapandığında okunmadan kalması gereken parçalar sunar. Almanca, yazılımın bunu denemesinden çok önce tercümanları fiili beklemeye zorlamıştır.
VocalStack bu yüzden segmentleri değil, cümleleri çevirir. Cümleler varsayılan olarak açıktır; bu durumda sunucu kayıtları bir cümlede birleştirir ve cümlenin tamamını çevirir. Cümle açıkken çevirisi geçicidir; kapandığında çeviri kesinleşir. Okuyucu her cümle için tek bir girdi tutar ve güncellemeler geldikçe onu değiştirir.
Seslendirme daha da uzun bekler. Yalnızca kapanmış bir cümle seslendirilir, çünkü hâlâ değişen bir cümle her revizyonda yeniden sentezlenirdi. Uzun bir cümle parça parça seslendirilir; böylece ilk parça, kalanlar üretilirken çalmaya başlayabilir.
Cümleler kapalıyken her kayıt kendi çeviri karesini alır. Bu yol hiçbir şeyi beklemez, ama bütün cümleler çok daha iyi okunur.
Bütün bu beklemeler, ses VocalStack'e ulaştığı andan itibaren ölçülür. Birçok yayında ses, oraya ulaştığında zaten gecikmiş olmuştur.
Kaynak bir mikrofon yerine bir akış olduğunda, ses daha hiçbir şey çözümlenmeden geridedir. Akış, yayımlanmış en son andan, yani canlı kenardan geriden gelir.
Çoğu internet radyosunun yayınladığı düz bir HTTP ses akışı genellikle bir ila üç saniye geriden gelir. Sunucu bir patlama tamponu tutar: yakın zamandaki birkaç saniyelik sesi bir seferde gönderir, böylece yeni bir dinleyicinin oynatıcısı takılmadan başlayabilir. Her dinleyici, VocalStack dahil, o kadar geriden katılır. HLS daha kötüdür: oynatma listeleri istemciyi canlı kenardan üç segment geriden başlatır; bu da segment uzunluğuna bağlı olarak pratikte birkaç saniye ile yarım dakika arası demektir. Standart DASH genellikle HLS ile aynı aralıktadır; yalnızca düşük gecikmeli varyantı bunun çok altına iner. Bir istasyonun "canlı" akışı, bir mektubun "güncel" olması gibi canlı olabilir.
Bu rakamlar yaklaşıktır ve bunlar transkripsiyona değil akışa aittir: VocalStack tarafındaki hiçbir ayar bu saniyeleri geri kazandıramaz. Bir etkinlik için bu saniyeler önemliyse, sesi genel bir akıştan değil, bir mikrofondan ya da kodlayıcıdan besleyin. Akış gecikmesi, VocalStack tek bir kelime duymadan önce sabitlenmiştir; gerçekten değiştirebildiğiniz şey gecikme modudur.
Gecikme modu tek bir şey yapar: gecikme ile doğruluk arasındaki dengeyi belirler. Ayar, canlı bir transkripsiyon oluşturulduğunda Advanced altında yer alır ve çalışırken Speed sekmesinde bulunur. Orada çip AUTO, SPEED ya da ACCURACY okur (Fast, SPEED olarak görünür). API üzerinden session.update akış sırasında modu değiştirir.
Takas, adlarının ima ettiği gibidir. Fast metni daha erken çıkarır ama daha fazlasını revize eder; Accuracy biraz daha uzun sürer ama daha az revize eder. Çevrilmiş altyazı okuyan oturmuş bir izleyici bir saniyelik ek gecikmeyi nadiren fark eder, ama sürekli değişen kelimeleri fark eder. Bu yüzden gecikme grafiği düz kaldığı sürece Accuracy çoğu zaman daha nazik bir ayardır. Auto ne yaptığını gösterir: boşluğu kapatmak için hızlandırdığı bir satır, ana bilgisayarın transkriptinde FAST MODE rozeti taşır ve orada doğruluğun daha düşük olabileceğine dair bir not bulunur.
Mod ne olursa olsun, transkripsiyon ilk kelimeden önce hazır olmalıdır; hazır hale gelmesi, zincirin yalnızca bir kez ödediği tek gecikmedir.
Bazı planlarda canlı bir transkripsiyonun başlaması birkaç saniye sürer. Süre plana göre değişir: fiyatlandırma sayfasındaki Start-up speed satırı, Kullandıkça Öde planında 15 saniyeye kadar soğuk başlatmadan Enterprise'da her zaman sıcak olmaya kadar uzanır.
API üzerinden bu bekleme, oturum başlarken session.loading çerçeveleri, ardından bir session.ready olarak görünür; istemci ancak bundan sonra ses gönderir. Bu sırada bağlantıyı açan bir dinleyici "Live. The first line appears in a moment." yazısını görür. Transkripsiyon çalışmaya başladığında bu gecikme geride kalır; geriye kalan tek soru, kalan gecikmenin ne kadarını taşıdığınızdır.
Canlı bir transkripsiyon çalışırken, ana bilgisayarın Speed sekmesi tüm bunların toplamını gösterir: konuşmacıyla metin arasındaki anlık boşluğu, yanında mod çipini ve kaydın boyunca bu boşluğun bir grafiğini; grafikte ortalama ve tepe değeri de vardır. Transkriptin kendisinde, dinleyicilere geç ulaşan bir satır, konuşulduğu an ile ulaştığı an arasındaki saniye sayısını gösteren bir rozet taşır.
Grafik düşük ve düz kalıyorsa mod sesle uyumludur. Grafik yükseliyorsa işlem hattı geride kalıyor demektir. Accuracy modundayken bu, Auto'ya geçmenin zamanı olabilir; Auto, boşluk kapanana kadar biraz doğruluktan ödün verip hızı artırır.
Geliştiriciler ise tek bir sayı alır. Gerçek zamanlı bir oturum sona erdiğinde session.done, stats.realtimeFactor değerini taşır: transkript edilen sesin, onu transkript etmek için harcanan süreye bölümü. Bir uyarı: konuşma tanıma literatüründe real-time factor genellikle tersini, yani işleme süresinin ses süresine oranını ifade eder ve bu değer ne kadar düşükse o kadar iyidir. VocalStack ise bunu tersine bildirir; burada daha yüksek daha iyidir: canlı bir oturum 1'e yakın durur, 1'in altı ise sesin işlem hattının transkript edebileceğinden daha hızlı geldiği anlamına gelir.
Bu saniyelerin hiçbiri gizemli değildir. Bir kısmı akışa, bir kısmı bir sonraki kelimeyi bekleyen bir kelimeye, bir kısmı çevirinin ihtiyaç duyduğu cümleye, geri kalanı da seçtiğiniz gecikme moduna aittir. API referansı çerçeve çerçeve ayrıntıyı verir; ana sayfadaki demo ise zinciri çalışırken gösterir.