Με λίγα λόγια: Μια τοπική εφαρμογή υπαγόρευσης είναι έργο συστημάτων, όχι ένα κάλεσμα μοντέλου. Το μεγαλύτερο μέρος της αναμονής είναι το decode, οπότε βελτιστοποιείτε το πότε και σε τι καλείτε το μοντέλο. Τα μοντέλα της οικογένειας Whisper μεταφράζουν και παραισθάνονται με τρόπους που χτίζεις harness γύρω τους αντί να τους διορθώνεις, και το πραγματικό offline απαιτεί να απενεργοποιήσεις ρητά τη συνήθεια του οικοσυστήματος ML να βγαίνει στο δίκτυο.
Η υπαγόρευση στο cloud είναι λυμένο πρόβλημα. Στέλνεις ήχο σε ένα API, επιστρέφει κείμενο, για τα μοντέλα νοιάζεται κάποιος άλλος. Γιατί λοιπόν να χτίσεις τοπικά; Τρεις λόγοι επανέρχονταν όσο έφτιαχνα τη δική μου εφαρμογή: ιδιωτικότητα (η υπαγόρευση ακούει τα πάντα, μαζί και ονόματα πελατών και μισογραμμένα email), κόστος (ένας βαρύς χρήστης υπαγόρευσης παράγει ώρες ήχου την ημέρα, για πάντα) και κατώφλια καθυστέρησης (η διαδρομή προς ένα datacenter έχει ένα ελάχιστο τίμημα που μια τοπική GPU δεν πληρώνει). Κι ένας τέταρτος, ειλικρινά: είναι απλώς ικανοποιητικό ότι δουλεύει και στο αεροπλάνο.
Αυτό που δεν είχα εκτιμήσει ξεκινώντας είναι ότι η τοπική υπαγόρευση δεν είναι «τρέξε το Whisper σε ένα loop». Το μοντέλο είναι ίσως το ένα τρίτο του συστήματος. Να το σχήμα των υπολοίπων.
Η καθυστέρηση είναι στο decode, όχι στην ηχογράφηση
Η αφελής μου υπόθεση ήταν ότι η ανταπόκριση θα κρινόταν στη λήψη ήχου και στο πόσο γρήγορα μετέφερα buffers. Λάθος. Όταν επιτέλους έκανα profile μια υπαγόρευση από άκρη σε άκρη, πάνω από τα τέσσερα πέμπτα της αναμονής ήταν το μοντέλο που έκανε decode. Όλα τα άλλα ήταν θόρυβος.
Αυτό αναδιατυπώνει όλο τον σχεδιασμό. Δεν βελτιστοποιείς το pipeline γύρω από το μοντέλο. Βελτιστοποιείς το πόσο συχνά και πάνω σε τι καλείς το μοντέλο. Δύο πράγματα προέκυψαν από αυτό για μένα. Πρώτον, κάνε decode κάθε κομμάτι ήχου μία φορά. Είναι ντροπιαστικά εύκολο να χτίσεις ένα pipeline που μεταγράφει επικαλυπτόμενα κομμάτια και πετάει το μεγαλύτερο μέρος της δουλειάς. Δεύτερον, μην μεταγράφεις σιωπή. Ένας αξιοπρεπής ανιχνευτής φωνητικής δραστηριότητας μπροστά από το μοντέλο αξίζει περισσότερο από οποιοδήποτε flag πάνω στο ίδιο το μοντέλο.
Η στρατηγική τεμαχισμού μετράει περισσότερο απ' όσο φαίνεται. Μετάγραψε σε μικρά μπλοκ όσο ο χρήστης ακόμα μιλάει και η αντιληπτή καθυστέρηση στο τέλος πέφτει θεαματικά, γιατί το μεγαλύτερο μέρος της δουλειάς έχει ήδη γίνει όταν σταματήσει. Το τελικό μπλοκ είναι το μόνο που περιμένει. Ίδιος συνολικός υπολογισμός, τελείως διαφορετική αίσθηση.
Τα μοντέλα της οικογένειας Whisper έχουν απόψεις
Τα ανοιχτά μοντέλα ομιλίας είναι πλέον πραγματικά καλά, αλλά έρχονται με συμπεριφορές που πρέπει να σχεδιάσεις γύρω τους αντί να τις διορθώσεις.
Θέλουν να μεταφράζουν. Αν μιλήσεις γλώσσα στην οποία το μοντέλο πατάει αδύναμα, καμιά φορά θα σου δώσει με αυτοπεποίθηση μια αγγλική μετάφραση αντί για μεταγραφή, και η δική του βεβαιότητα ανίχνευσης γλώσσας δεν θα σε προειδοποιήσει. Ο ανιχνευτής μπορεί να είναι σίγουρος και λάθος ταυτόχρονα. Καταλήγεις να χρειάζεσαι ένα δεύτερο σήμα, όπως έναν έλεγχο της ποιότητας του decode απέναντι στη δηλωμένη γλώσσα, πριν εμπιστευτείς την έξοδο.
Παραισθάνονται στη σιωπή και κόβουν σε περίεργες εισόδους. Δώσε σε ένα μοντέλο σχεδόν σιωπή και μπορεί να παραγάγει μια πειστική πρόταση από το τίποτα. Ορισμένοι συνδυασμοί εισόδου απλώς δυστροπούν, και η λύση συχνά δεν είναι μια παράμετρος αλλά μια διαφορετική είσοδος: ξαναπροσπάθησε, ή άλλαξε ένα μέρος του συμφραζομένου, αντί να γυρίζεις διακόπτες.
Η μεταφορά συμφραζομένου κόβει και προς τις δύο κατευθύνσεις. Κάποιοι τοπικοί servers συμπερασμού κουβαλούν κειμενικό συμφραζόμενο ανάμεσα στα αιτήματα για καλύτερη συνέχεια. Υπέροχο για μια ροή σχετικών προτάσεων, περίεργο όταν οι υπαγορεύσεις σου είναι άσχετες μεταξύ τους και ένα προηγούμενο απόσπασμα προδιαθέτει το επόμενο. Το αν θα το κρατήσεις είναι πραγματικό δίλημμα: απενεργοποίησέ το και μπορεί να χάσεις, μαζί με την προκατάληψη, και την ποιότητα στη στίξη.
Τίποτα από αυτά δεν είναι bug που διορθώνεις μία φορά. Είναι ιδιότητες γύρω από τις οποίες χτίζεις ένα πλαίσιο δοκιμών: ένα σώμα δικών σου ηχογραφήσεων πάνω στο οποίο τρέχεις regression tests, ώστε όταν αλλάζεις μοντέλο ή flag να μαθαίνεις τι πραγματικά βελτιώθηκε.
Το «offline» είναι πειθαρχία, όχι προεπιλογή
Να αυτό που με εκνεύρισε πραγματικά. Φτιάχνεις μια offline εφαρμογή, τη δοκιμάζεις offline, δουλεύει. Μετά ένας χρήστης σε φρέσκο μηχάνημα, με κακή σύνδεση, πέφτει σε ένα μονοπάτι κώδικα όπου κάποια βιβλιοθήκη ML αποφασίζει «βοηθητικά» να κατεβάσει ένα μοντέλο ή να ελέγξει ένα hub για ενημερώσεις. Η offline εφαρμογή σου τώρα κρέμεται σε ένα network call που δεν έγραψες ποτέ.
Το οικοσύστημα ML προϋποθέτει συνδεσιμότητα. Τα εργαλεία του Hugging Face, οι μηχανές TTS, ακόμα και βοηθητικές βιβλιοθήκες θα βγουν αθόρυβα στο δίκτυο αν δεν τους πεις όχι. Αν σοβαρολογείς για το τοπικό, πρέπει να είσαι ρητός: όρισε τα offline flags περιβάλλοντος, προκατέβασε κάθε μοντέλο κατά την εγκατάσταση, και αντιμετώπισε κάθε πρόσβαση δικτύου μετά την εγκατάσταση ως bug. Το κέρδος είναι μια εφαρμογή που στη μέρα 400 συμπεριφέρεται όπως στη μέρα 1, κάτι που οι εφαρμογές με εξάρτηση από το cloud δεν μπορούν να υποσχεθούν.
Το τελευταίο μίλι είναι δουλειά προϊόντος
Τα κομμάτια για τα οποία δεν γράφει κανείς πήραν τον περισσότερο χρόνο. Να μπαίνει το κείμενο σε όποια εφαρμογή έχει το focus, αξιόπιστα, σε όλο το λειτουργικό. Να σιγεί ο ήχος του συστήματος κατά την ηχογράφηση, ώστε το μοντέλο να μην μεταγράφει τους ήχους των ειδοποιήσεων. Να πακεταριστούν gigabytes μοντέλων σε ένα installer που ο κόσμος όντως θα κατεβάσει, και να αποφασιστεί τι μπαίνει στο κουτί και τι εγκαθίσταται στην πρώτη εκτέλεση. Να αντέχει τον χρήστη που υπαγορεύει σε δύο γλώσσες μέσα στην ίδια πρόταση, γιατί οι πραγματικοί άνθρωποι το κάνουν.
Αν ζυγίζετε cloud ή τοπικό για μια λειτουργία υπαγόρευσης: το cloud σας πάει σε demo μέσα σε ένα απόγευμα. Το τοπικό σας δίνει μια εφαρμογή ιδιωτική, δωρεάν στη λειτουργία και δική σας, με κόστος την ιδιοκτησία ενός μικρού project συστημάτων. Έχοντάς το κάνει, θα το ξανάκανα. Αλλά μπείτε ξέροντας ότι το μοντέλο είναι το εύκολο μέρος.
Τα βασικά σημεία
- Κάντε profiling πριν σχεδιάσετε: στη δική μου εφαρμογή, πάνω από τα τέσσερα πέμπτα της αναμονής ήταν το decode του μοντέλου.
- Κάθε κομμάτι ήχου αποκωδικοποιείται μία φορά, η σιωπή κόβεται με VAD, και η μεταγραφή γίνεται σε μπλοκ όσο ο χρήστης ακόμα μιλάει.
- Τα μοντέλα Whisper μεταφράζουν με αυτοπεποίθηση, παραισθάνονται στη σιωπή και σκοντάφτουν σε περίεργα inputs· κάντε regression tests με δικές σας ηχογραφήσεις.
- Το offline είναι πειθαρχία: offline flags, προ-κατέβασμα μοντέλων στην εγκατάσταση, και κάθε μεταγενέστερο network call είναι bug.
- Το τελευταίο μίλι (εισαγωγή κειμένου, mute συστήματος, μέγεθος installer, ανάμεικτες γλώσσες) είναι δουλειά προϊόντος και παίρνει τον περισσότερο χρόνο.
