Το μεγαλύτερο μέρος της καθυστέρησης στη ζωντανή μετάφραση είναι αναμονή: για τη ροή, για την επόμενη λέξη, για την πρόταση. Το μόνο μέρος που ελέγχετε είναι η λειτουργία καθυστέρησης: λιγότερη καθυστέρηση ή λιγότερες αναθεωρήσεις.
Ο ακροατής που διαβάζει μια ζωντανή μετάφραση βλέπει κάθε γραμμή μερικά δευτερόλεπτα αφότου ο ομιλητής την είπε. Το κενό αυτό δεν είναι μία καθυστέρηση, αλλά αρκετές, που προστίθενται σε μια αλυσίδα, και οι περισσότερες είναι μια μορφή αναμονής. Αν ξέρετε ποια αναμονή είναι ποια, η επιλογή της λειτουργίας καθυστέρησης γίνεται εύκολη, και ο προγραμματιστής που φτιάχνει μια εφαρμογή ανάγνωσης μαθαίνει τι να εμφανίσει και πότε.
Ένα χρήσιμο μέτρο σύγκρισης πριν από τους αριθμούς: ένας άνθρωπος συνδρομητής διερμηνέας συνήθως μιλά δύο έως τέσσερα δευτερόλεπτα πίσω από τον ομιλητή. Οι διερμηνείς ονομάζουν αυτό το κενό «ear-voice span», και αντιμετωπίζουν τις γλώσσες με ρήμα στο τέλος όχι περιμένοντας το ρήμα, αλλά προβλέποντάς το, ή χωρίζοντας την πρόταση σε κομμάτια που μπορούν να στέκονται μόνα τους. Ένα ή δύο δευτερόλεπτα καθυστέρησης δεν είναι ελάττωμα του λογισμικού· είναι περίπου αυτό που κάνει ένας πολύ καλός άνθρωπος.
Κάθε ζωντανή απομαγνητοφώνηση στο VocalStack περνά από τα ίδια στάδια, με την ίδια σειρά, και καθένα περιμένει το προηγούμενο.
Το κείμενο στη γλώσσα του πρωτοτύπου φτάνει σε έναν αναγνώστη σχεδόν όπως ειπώθηκε. Η μετάφραση ακολουθεί ένα ή δύο δευτερόλεπτα αργότερα, και η προφορική πρόταση έρχεται μετά τη μετάφρασή της, γι' αυτό ένα ηχητικό απόσπασμα φτάνει πάντα τελευταίο. Το πρώτο ορατό αποτέλεσμα της αλυσίδας, ωστόσο, έρχεται πολύ πριν από οποιαδήποτε φωνή: το ίδιο το κείμενο κινείται.
Το πρώτο που προσέχουν οι άνθρωποι σε μια ζωντανή απομαγνητοφώνηση είναι ότι οι τελευταίες λέξεις μετακινούνται. Μια φράση εμφανίζεται, αλλάζει και σταθεροποιείται. Αυτό είναι το στάδιο του προσχεδίου και υπάρχει για έναν λόγο που ισχύει για κάθε αναγνώστη ομιλίας.
Ένας αναγνώστης ομιλίας σταθεροποιεί μια λέξη κοιτάζοντας τι έρχεται μετά από αυτήν. Τα «I scream» και «ice cream» ακούγονται ίδια μέχρι να έρθει η επόμενη λέξη· ένα τελικό «s» μπορεί να ανήκει σε αυτή τη λέξη ή στην επόμενη. Όσο δεν υπάρχει ήχος δεξιά από μια λέξη, η γραφή της είναι εικασία, άρα οι τελευταίες λέξεις σε κάθε ζωντανή απομαγνητοφώνηση είναι πάντα οι λιγότερο σίγουρες. Ένα προσχέδιο είναι απλώς αυτή η εικασία, δείχνοντάς τη νωρίς αντί να την κρύβουμε.
Κάθε προσχέδιο αντικαθιστά πλήρως τη ζωντανή ουρά: τις λέξεις που ακούστηκαν από την τελευταία οριστικοποίηση, και που ακόμα αλλάζουν. Η οριστικοποίηση είναι τελική. Δεν αλλάζει ποτέ, φέρει χρονισμούς σε επίπεδο λέξης, και οι οριστικοποιήσεις αριθμούνται χωρίς κενά, ώστε ένας αναγνώστης να καταλαβαίνει αν έχασε κάποια.
Για έναν προγραμματιστή, αυτός είναι ο μοναδικός κανόνας που απαιτεί το realtime API: εμφανίστε κάθε οριστικό τμήμα και μετά το τελευταίο προσχέδιο μετά από αυτά, και καθαρίστε το προσχέδιο όταν φτάνει μια οριστικοποίηση. Αν τα προσχέδια προστίθενται αντί να αντικαθίστανται, το κείμενο διπλασιάζεται και τρεμοπαίζει· η οριστικοποίηση απλώς καταναλώνει την ουρά. Ο οδηγός για WebSocket χτίζει έναν αναγνώστη ακριβώς πάνω σε αυτή την ιδέα.
Για έναν οργανισμό, η κίνηση του κειμένου είναι το τίμημα της χαμηλής καθυστέρησης. Το να δείχνετε λέξεις πριν τελειώσει η φράση είναι αυτό που κάνει την απομαγνητοφώνηση να φαίνεται ζωντανή. Η μετάφραση, όμως, δεν μπορεί να αντέξει αυτό το τέχνασμα, γιατί μια λέξη μπορεί να εικαστεί από το μισό της φράσης, αλλά μια μετάφραση όχι.
Η σειρά των λέξεων είναι ο λόγος που η μετάφραση δεν μπορεί να συμβαδίσει με το προσχέδιο. Ένα γερμανικό ρήμα μπορεί να βρίσκεται στο τέλος της πρότασης, και τα ιαπωνικά βάζουν το ρήμα τελευταίο. Κάθε μεταφραστής χρειάζεται ολόκληρη την πρόταση πριν την αποδώσει πιστά. Η μετάφραση λέξη προς λέξη παραδίδει στον ακροατή θραύσματα που πρέπει να μείνουν ακατανόητα μέχρι να κλείσει η πρόταση. Οι διερμηνείς περιμένουν το γερμανικό ρήμα εδώ και πολύ πριν το δοκιμάσει το λογισμικό.
Το VocalStack μεταφράζει, επομένως, προτάσεις και όχι τμήματα. Οι προτάσεις είναι ενεργοποιημένες από προεπιλογή, και με αυτές ενεργές, ο διακομιστής συναρμολογεί τις οριστικοποιήσεις σε πρόταση και μεταφράζει ολόκληρη. Όσο η πρόταση είναι ανοιχτή, η μετάφρασή της είναι προσωρινή· όταν κλείσει, η μετάφραση είναι τελική. Ένας αναγνώστης κρατά μία εγγραφή ανά πρόταση και την αντικαθιστά καθώς έρχονται ενημερώσεις.
Η ομιλία περιμένει ακόμα περισσότερο. Μόνο μια κλειστή πρόταση διαβάζεται, γιατί μια πρόταση που αλλάζει ακόμα θα συντίθετο ξανά σε κάθε αναθεώρηση. Μια μεγάλη πρόταση διαβάζεται σε κομμάτια, ώστε το πρώτο να παίζει ενώ φτιάχνονται τα υπόλοιπα.
Με τις προτάσεις απενεργοποιημένες, κάθε οριστικοποίηση παίρνει τη δική της μετάφραση ως ξεχωριστό πλαίσιο. Αυτή η διαδρομή δεν περιμένει τίποτα, αλλά οι ολόκληρες προτάσεις διαβάζονται πολύ καλύτερα.
Όλες αυτές οι αναμονές μετρώνται από τη στιγμή που ο ήχος φτάνει στο VocalStack. Για πολλές μεταδόσεις, ο ήχος είχε ήδη καθυστερήσει όταν έφτασε.
Όταν η πηγή είναι μια ροή και όχι ένα μικρόφωνο, ο ήχος είναι ήδη πίσω πριν μεταγραφεί οτιδήποτε. Υστερεί από το ζωντανό άκρο, τη νεότερη στιγμή που έχει δημοσιεύσει η ροή.
Μια απλή ροή ήχου HTTP, το είδος που δημοσιεύουν οι περισσότεροι ραδιοφωνικοί σταθμοί στο διαδίκτυο, συνήθως καθυστερεί από ένα έως τρία δευτερόλεπτα. Ο διακομιστής κρατά ένα burst buffer: μερικά δευτερόλεπτα πρόσφατου ήχου, που στέλνονται μονομιάς ώστε το πρόγραμμα αναπαραγωγής ενός νέου ακροατή να ξεκινήσει χωρίς διακοπές. Κάθε ακροατής, συμπεριλαμβανομένου του VocalStack, μπαίνει τόσο πίσω. Το HLS είναι χειρότερο: οι λίστες αναπαραγωγής του ξεκινούν τον πελάτη τρία τμήματα πίσω από το ζωντανό άκρο, που στην πράξη σημαίνει αρκετά δευτερόλεπτα έως μισό λεπτό, ανάλογα με τη διάρκεια των τμημάτων. Το standard DASH συνήθως βρίσκεται στην ίδια περιοχή με το HLS· μόνο η παραλλαγή του με χαμηλή καθυστέρηση πέφτει αισθητά κάτω από αυτήν. Η «ζωντανή» ροή ενός σταθμού μπορεί να είναι ζωντανή όπως είναι επίκαιρη μια επιστολή.
Αυτά τα νούμερα είναι κατά προσέγγιση, και ανήκουν στη ροή, όχι στην απομαγνητοφώνηση: καμία ρύθμιση από την πλευρά του VocalStack δεν μπορεί να τα επαναφέρει. Αν αυτά τα δευτερόλεπτα έχουν σημασία για μια εκδήλωση, τροφοδοτήστε το στάδιο με ήχο από ένα μικρόφωνο ή έναν κωδικοποιητή αντί για δημόσια ροή. Η καθυστέρηση της ροής καθορίζεται πριν το VocalStack ακούσει μια λέξη· η λειτουργία καθυστέρησης είναι αυτό που μπορείτε πραγματικά να μετακινήσετε.
Η λειτουργία καθυστέρησης κάνει μόνο ένα πράγμα: ρυθμίζει την ισορροπία ανάμεσα στην καθυστέρηση και την ακρίβεια. Η ρύθμιση βρίσκεται κάτω από το Advanced όταν δημιουργείται μια ζωντανή απομαγνητοφώνηση, και στην καρτέλα Speed όσο αυτή τρέχει. Εκεί η ετικέτα γράφει AUTO, SPEED ή ACCURACY (το Fast εμφανίζεται ως SPEED). Μέσω του API, το session.update την αλλάζει εν κινήσει.
Η ανταλλαγή είναι αυτή που υποδηλώνουν τα ονόματα. Το Fast βγάζει το κείμενο νωρίτερα αλλά αναθεωρεί περισσότερο από αυτό· το Accuracy αργεί λίγο περισσότερο και αναθεωρεί λιγότερο. Ένα καθιστό κοινό που διαβάζει μεταφρασμένους υπότιτλους σπάνια προσέχει ένα επιπλέον δευτερόλεπτο, αλλά προσέχει λέξεις που συνεχώς αλλάζουν. Γι' αυτό το Accuracy είναι συχνά η πιο φιλική ρύθμιση, αρκεί το γράφημα καθυστέρησης να μένει σταθερό. Το Auto δείχνει τι κάνει: μια γραμμή που την επιτάχυνε για να κλείσει ένα κενό φέρει το σήμα FAST MODE στην απομαγνητοφώνηση του οργανωτή, με σημείωση ότι η ακρίβεια μπορεί να είναι χαμηλότερη εκεί.
Όποια και να είναι η λειτουργία, η απομαγνητοφώνηση πρέπει να είναι έτοιμη πριν από την πρώτη λέξη, και η προετοιμασία της είναι η μόνη καθυστέρηση που πληρώνει η αλυσίδα μία φορά.
Σε ορισμένα πλάνα, μια ζωντανή απομαγνητοφώνηση χρειάζεται μερικά δευτερόλεπτα για να ξεκινήσει. Πόσο εξαρτάται από το πλάνο: η γραμμή Start-up speed στη σελίδα τιμών κυμαίνεται από μια ψυχρή εκκίνηση έως 15 δευτερόλεπτα στο pay as you go μέχρι πάντα ζεστή στο Enterprise.
Μέσω του API, η αναμονή εμφανίζεται ως πλαίσια session.loading ενώ ξεκινά η συνεδρία, και μετά ένα session.ready· ο πελάτης στέλνει ήχο μόνο μετά από αυτό. Ένας ακροατής που ανοίγει τον σύνδεσμο στο μεταξύ χρονικό διάστημα βλέπει «Ζωντανά. Η πρώτη γραμμή εμφανίζεται σε μια στιγμή.» Όταν η απομαγνητοφώνηση τρέχει, αυτή η καθυστέρηση έχει περάσει, και το μόνο που μένει είναι πόση από την υπόλοιπη καθυστέρηση κουβαλάτε.
Ενώ τρέχει μια ζωντανή απομαγνητοφώνηση, η καρτέλα Speed του οργανωτή δείχνει το άθροισμα όλων αυτών: το τρέχον κενό ανάμεσα στον ομιλητή και το κείμενο, με την ετικέτα της λειτουργίας δίπλα του, και ένα γράφημα αυτού του κενού σε όλη την εγγραφή με τον μέσο όρο και την αιχμή του. Στην ίδια την απομαγνητοφώνηση, μια γραμμή που έφτασε αργά στους ακροατές φέρει ένα σήμα με τον αριθμό των δευτερολέπτων ανάμεσα στη στιγμή που ειπώθηκε και στη στιγμή που έφτασε.
Ένα γράφημα που μένει χαμηλό και επίπεδο σημαίνει ότι η λειτουργία ταιριάζει στον ήχο. Ένα γράφημα που ανεβαίνει σημαίνει ότι η διαδρομή καθυστερεί. Στο Accuracy, αυτή μπορεί να είναι η στιγμή να μεταβείτε στο Auto, που ανταλλάσσει λίγη ακρίβεια με ταχύτητα μέχρι να κλείσει το κενό.
Οι προγραμματιστές παίρνουν έναν μόνο αριθμό. Όταν τελειώσει μια συνεδρία realtime, το session.done φέρει το stats.realtimeFactor, δηλαδή τον ήχο που απομαγνητοφωνήθηκε διαιρεμένο με τον χρόνο που δαπανήθηκε για την απομαγνητοφώνησή του. Μια προειδοποίηση για τη σύμβαση: στη βιβλιογραφία αναγνώρισης ομιλίας, το real-time factor σημαίνει συνήθως το αντίστροφο, τον χρόνο επεξεργασίας διαιρεμένο με τον χρόνο ήχου, όπου το χαμηλότερο είναι καλύτερο. Το VocalStack το αναφέρει ανάποδα, οπότε εδώ το υψηλότερο είναι καλύτερο: μια ζωντανή συνεδρία βρίσκεται κοντά στο 1, και κάτω από το 1 σημαίνει ότι ο ήχος έφτασε πιο γρήγορα από ό,τι μπορούσε να τον απομαγνητοφωνήσει η διαδρομή.
Κανένα από αυτά τα δευτερόλεπτα δεν είναι μυστηριώδες. Κάποια ανήκουν στη ροή, κάποια σε μια λέξη που περιμένει την επόμενη, κάποια στην πρόταση που χρειάζεται μια μετάφραση, και τα υπόλοιπα στη λειτουργία καθυστέρησης που επιλέξατε. Το API reference έχει τη λεπτομέρεια πλαίσιο προς πλαίσιο, και η επίδειξη στην αρχική σελίδα δείχνει την αλυσίδα σε λειτουργία.