Canlı tərcümədəki gecikmənin əksəriyyəti gözləmədir: axın üçün, növbəti söz üçün, cümlə üçün. Nəzarət edə biləcəyiniz yeganə hissə gecikmə rejimidir: az gecikmə və ya az yenidən dəyişiklik.
Canlı tərcüməni izləyən dinləyici hər sətri danışanın sözündən bir neçə saniyə sonra görür. Bu fasilə tək bir gecikmə deyil, zəncirdə bir-birinin üstünə gələn bir neçə gecikmədir və onların çoxu bir növ gözləmədir. Bu gözləmələrin hansının hansı olduğunu bilmək gecikmə rejimini seçməyi asanlaşdırır və oxucu tətbiqini quran developer-ə nəyi və nə vaxt göstərməli olduğunu deyir.
Rəqəmlərdən əvvəl faydalı bir müqayisə: insan sinxron tərcüməçisi adətən danışandan iki-dörd saniyə geridə danışır. Tərcüməçilər bu fasiləni qulaq-səs intervalı adlandırırlar və fel sonda gələn dillərlə işləyəndə felin gəlməsini gözləmək əvəzinə onu qabaqcadan təxmin edir və ya cümləni tək başına dura bilən hissələrə bölürlər. Bir-iki saniyəlik gecikmə proqram təminatının nöqsanı deyil; bu, çox yaxşı bir insanın təxminən etdiyi işdir.
VocalStack-də hər canlı transkripsiya eyni mərhələlərdən, eyni sırayla keçir və hər mərhələ ondan əvvəlkini gözləyir.
Orijinal dildəki mətn demək olar ki, deyildiyi kimi oxucuya çatır. Tərcümə bir-iki saniyə sonra gəlir, danışılan cümlə isə tərcüməsindən sonra gəlir, ona görə səs klipi həmişə ən sonda çatır. Ancaq zəncirin ilk görünən təsiri səsdən çox əvvəl başlayır: mətnin özü hərəkət edir.
Canlı transkriptdə insanların ilk gördüyü şey ən yeni sözlərin yerini dəyişməsidir. Bir ifadə görünür, dəyişir və oturur. Bu, qaralama mərhələsinin işidir və bu, hər nitq tanıyıcısına aid olan bir səbəbə görə mövcuddur.
Tanıyıcı sözü onun arxasınca gələn sözə baxaraq müəyyənləşdirir. "I scream" və "ice cream" növbəti söz gələnə qədər eyni səslənir; sonda gələn "s" hərfi bu sözə də, növbətiyə də aid ola bilər. Sözün sağında səs olmayana qədər onun yazılışı təxmindir, ona görə hər canlı transkriptdə ən yeni sözlər həmişə ən az əminlik daşıyan sözlərdir. Qaralama sadəcə bu təxminin gizlədilmək əvəzinə erkən göstərilməsidir.
Hər qaralama canlı quyruğu tamamilə əvəz edir: son təsdiqdən bəri eşidilən, hələ dəyişən sözləri. Təsdiq isə son haldır. Heç vaxt dəyişmir, söz səviyyəli vaxt məlumatı daşıyır və təsdiqlər boşluq olmadan nömrələnir ki, oxucu hansısa birini itirdiyini anlaya bilsin.
Developer üçün realtime API-nin israr etdiyi bir qayda var: hər təsdiqlənmiş seqmenti göstər, ondan sonra ən son qaralamanı, təsdiq gələndə isə qaralamanı təmizlə. Qaralamaları əlavə etmək əvəzinə yığmaq təkrarlanan, titrəyən mətn yaradır; təsdiq quyruğu sadəcə istehlak edir. WebSocket dərsliyi məhz bu üzərində oxucu qurur.
Host üçün hərəkət edən mətn aşağı gecikmənin qiymətidir. İfadə bitmədən sözləri göstərmək transkripti canlı hiss etdirən şeydir. Lakin tərcümə bu hiylə üçün ödəyə bilmir, çünki söz yarım ifadədən təxmin oluna bilər, tərcümə isə yox.
Sözlərin sırası tərcümənin qaralamanın ardınca gedə bilməməsinin səbəbidir. Alman dilində fel bəndin sonunda ola bilər, yapon dilində isə fel sonda gəlir. Hər tərcüməçi bəndi sadiq şəkildə tərcümə etmək üçün onun tam halını görməlidir. Sözbaşı tərcümə oxucuya bənd bağlanana qədər oxunmamış qalan parçalar verir. Alman dili proqram təminatının bunu etməyə çalışmasından çox əvvəl tərcüməçiləri felə qədər gözləməyə məcbur edib.
VocalStack buna görə seqmentləri yox, cümlələri tərcümə edir. Cümlələr defolt olaraq aktivdir və bu rejimdə server təsdiqləri cümləyə yığır və bütövlükdə tərcümə edir. Cümlə açıq olduqca onun tərcüməsi müvəqqətidir; bağlandıqdan sonra tərcümə son olur. Oxucu hər cümlə üçün bir element saxlayır və yeniləmələr gəldikcə onu əvəz edir.
Səs isə daha da çox gözləyir. Yalnız bağlanmış cümlə səsləndirilir, çünki hələ dəyişən cümlə hər revizyonda yenidən sintez edilərdi. Uzun cümlə hissələrə bölünərək səsləndirilir ki, birinci hissə digərləri hazırlanarkən oynaya bilsin.
Cümlələr söndürülübsə, hər təsdiq öz tərcümə kadrını alır. Bu yol heç nə gözləmir, lakin bütöv cümlələr xeyli yaxşı oxunur.
Bütün bu gözləmələr VocalStack audionu aldığı andan ölçülür. Bir çox yayımda audio buraya çatanda artıq gecikmişdi.
Mənbə mikrofon yox, axın olduqda audio hələ heç nə transkripsiya olunmadan geridə olur. O, axının dərc etdiyi ən yeni anın, yəni canlı kənarın gerisində qalır.
Sadə HTTP audio axını — əksər internet radio stansiyalarının yaydığı tip — adətən bir-üç saniyə geridə işləyir. Serverdə burst buffer var: bir neçə saniyəlik son audio, yeni dinləyicinin pleyerinin ləngimədən başlaya bilməsi üçün bir anda göndərilir. Hər dinləyici, VocalStack də daxil olmaqla, bu qədər geriyə qoşulur. HLS daha pisdir: onun playlistləri müştərini canlı kənardan üç seqment geridən başladır, bu da seqmentin uzunluğundan asılı olaraq praktikada bir neçə saniyədən yarım dəqiqəyə qədər deməkdir. Standart DASH adətən HLS ilə eyni diapazonda olur; yalnız onun aşağı gecikməli variantı bundan xeyli aşağı düşür. Stansiyanın "canlı" axını məktubun aktual olması kimi canlı ola bilər.
Bu rəqəmlər təxminidir və onlar transkripsiyaya yox, axına aiddir: VocalStack tərəfindəki heç bir parametr bu saniyələri geri qaytara bilməz. Həmin saniyələr bir tədbir üçün vacibdirsə, audionu ictimai axından yox, mikrofondan və ya kodlaşdırıcıdan verin. Axın gecikməsi VocalStack bir söz eşitməzdən əvvəl müəyyən olunur; dəyişə biləcəyiniz şey gecikmə rejimidir.
Gecikmə rejimi yalnız bir şey edir: gecikmə ilə dəqiqlik arasında balansı müəyyən edir. Parametr canlı transkripsiya yaradılarkən Advanced altında yerləşir, işləyərkən isə Speed tabında. Orada çip AUTO, SPEED və ya ACCURACY yazır (Fast SPEED kimi görünür). API üzərindən session.update axın davam edərkən onu dəyişdirir.
Mübadilə adların təklif etdiyi kimidir. Fast mətni daha tez çıxarır, amma onun daha çox hissəsini yenidən dəyişir; Accuracy bir az daha çox vaxt aparır və daha az yenidən dəyişir. Oturan və tərcümə olunmuş altyazıları oxuyan tamaşaçı bir əlavə saniyəni nadir hallarda hiss edir, lakin davamlı dəyişən sözləri hiss edir. Gecikmə qrafiki hamar qaldığı müddətcə Accuracy çox vaxt daha yaxşı seçimdir. Auto isə öz niyyətini açıq göstərir: boşluğu bağlamaq üçün sürətləndirdiyi sətir host-un transkriptində FAST MODE nişanı daşıyır və orada dəqiqliyin orada aşağı ola biləcəyi barədə qeyd olunur.
Rejim nə olursa olsun, transkripsiya ilk sözdən əvvəl hazır olmalıdır və onu hazırlamaq zəncirin yalnız bir dəfə ödədiyi gecikmədir.
Bəzi planlarda canlı transkripsiyanın başlaması bir neçə saniyə çəkir. Müddət plandan asılıdır: qiymətlər səhifəsindəki Start-up speed sırası İstifadə etdikcə ödə planında soyuq başlanğıcın 15 saniyəyə qədər olduğunu, Enterprise-da isə həmişə isti olduğunu göstərir.
API üzərindən gözləmə sessiya başlayarkən session.loading kadrları ilə, sonra session.ready ilə görünür; müştəri audionu yalnız bundan sonra göndərir. Bu arada linki açan dinləyici "Live. The first line appears in a moment." görür. Transkripsiya işə düşdükdən sonra bu gecikmə geridə qalır və yeganə qalan sual, qalan gecikmənin nə qədərini daşıdığınızdır.
Canlı transkripsiya işləyərkən host-un Speed tabı bütün bunların necə toplandığını göstərir: danışan ilə mətn arasındakı cari boşluq, yanında rejim çipi və yazı boyunca bu boşluğun orta və pik dəyərləri ilə qrafik. Transkriptin özündə isə dinləyicilərə gec çatmış sətir, deyildiyi vaxtla çatdığı vaxt arasında saniyələrin sayını göstərən nişan daşıyır.
Qrafik aşağı və hamar qalırsa, rejim audioya uyğundur. Qrafik yuxarı qalxırsa, pipeline geri qalır. Accuracy rejimində bu, boşluq bağlanana qədər bir qədər dəqiqlikdən güzəşt edib sürəti artıran Auto-ya keçmək üçün ola biləcək an ola bilər.
Developer-lər isə bir rəqəm alır. Realtime sessiya bitdikdə session.done stats.realtimeFactor göndərir: transkripsiya edilmiş audionun, ona sərf olunan vaxta bölünməsi. Bir konvensiya xəbərdarlığı: nitq tanıma ədəbiyyatında real-time factor adətən əksini, yəni emal vaxtının audio vaxtına nisbətini bildirir və orada kiçik olması yaxşıdır. VocalStack isə onu tərsinə bildirir, buna görə burada böyük olması yaxşıdır: canlı sessiya təxminən 1-ə yaxın olur, 1-dən aşağı isə audionun pipeline-ın transkripsiya edə biləcəyindən daha sürətli gəldiyi deməkdir.
Bu saniyələrin heç biri sirli deyil. Bəziləri axına, bəziləri sözün sonrakı sözü gözləməsinə, bəziləri tərcümənin ehtiyac duyduğu cümləyə, qalanları isə seçdiyiniz gecikmə rejiminə aiddir. API referansı kadr-kadr təfərrüatları ehtiva edir, ana səhifədəki demo isə bütün zənciri işləyən halda göstərir.