Υπάρχουν εξαιρετικά προγράμματα υπαγόρευσης φωνής για Windows και Mac. Το Wispr Flow, το VoiceOS και δεκάδες άλλα. Κρατάς ένα πλήκτρο, μιλάς, και το κείμενο εμφανίζεται εκεί που δουλεύεις. Στα αγγλικά εντυπωσιάζουν. Στα ελληνικά, όχι.
Αυτό είναι το χρονικό ενός εργαλείου που φτιάξαμε επειδή δεν υπήρχε.
Το πρόβλημα δεν ήταν η ακρίβεια
Θα περίμενε κανείς ότι το θέμα είναι μερικές λέξεις λάθος. Δεν ήταν αυτό.
Λάθος γλώσσα, ολικά. Πολλές φορές μια καθαρά ελληνική φράση αναγνωριζόταν ως ισπανική, κινεζική ή ρωσική. Το αποτέλεσμα δεν ήταν λάθος λέξη, ήταν ακατάληπτο: σωρός από χαρακτήρες που δεν έλεγαν απολύτως τίποτα. Δεν είχες κάτι να διορθώσεις, είχες σκουπίδια να σβήσεις και να ξαναρχίσεις. Ένα εργαλείο που αποτυγχάνει έτσι δεν είναι ανακριβές, είναι άχρηστο.
Μπέρδεμα γλωσσών. Ο λόγος ενός Έλληνα επαγγελματία είναι κυρίως ελληνικός, με σκόρπιες αγγλικές λέξεις ανάμεσα: Plesk, Supabase, Next.js, deploy, commit. Τα εμπορικά εργαλεία είτε «διόρθωναν» τις αγγλικές λέξεις σε λάθος ελληνικές, είτε γύριζαν ολόκληρη την πρόταση στα αγγλικά.
Λάθος στίξη. Το ελληνικό ερωτηματικό «;» σχεδόν ποτέ δεν έμπαινε σωστά. Οι προτάσεις έβγαιναν σαν ατέλειωτες σειρές λέξεων με σκέτες τελείες.
Καμία προσαρμογή. Ονόματα εργαλείων, τεχνικοί όροι, ονόματα πελατών: ποτέ σωστά, και κανένας τρόπος να τα μάθεις στο πρόγραμμα.
Κλείδωμα σε μία μηχανή. Κάθε εργαλείο χρησιμοποιεί μία μηχανή αναγνώρισης. Αν δεν σου κάνει, δεν έχεις εναλλακτική.
Το ζητούμενο ήταν απλό στη διατύπωση και δύσκολο στην υλοποίηση: ένα εργαλείο που καταλαβαίνει πραγματικά ελληνικά, μαζί με το ελληνικό μπέρδεμα με τα αγγλικά, και βάζει σωστή στίξη.
Δύο στάδια, όχι ένα κόλπο
Το VoiceType ζει στη γραμμή εργασιών των Windows. Κρατάς ένα πλήκτρο, μιλάς, το αφήνεις, και το κείμενο πληκτρολογείται μόνο του μέσα σε όποια εφαρμογή δουλεύεις εκείνη τη στιγμή: Word, browser, editor κώδικα, chat, οπουδήποτε.
Αυτό που το κάνει διαφορετικό δεν είναι κάποια εξυπνάδα, είναι η αρχιτεκτονική δύο σταδίων.
Στάδιο ένα, η ακρόαση. Ο ήχος περνά από μηχανή αναγνώρισης της επιλογής σου, και υποστηρίζονται τέσσερις:
- ElevenLabs Scribe, που στην πράξη βγήκε η καλύτερη για ελληνικά.
- Azure Speech, γρήγορη και σταθερή, κλειδωμένη στο el-GR.
- OpenAI, με
gpt-4o-transcribe,gpt-4o-mini-transcribeκαιwhisper-1. - Τοπικό Whisper, που τρέχει στον υπολογιστή σου, χωρίς σύνδεση και χωρίς κόστος ανά λέξη.
Μπορείς να ορίσεις δύο ανεξάρτητα πλήκτρα, καθένα με τη δική του μηχανή. Ένα για γρήγορη τοπική αναγνώριση, ένα για την πιο ακριβή cloud μηχανή.
Στάδιο δύο, η επιμέλεια. Εδώ είναι η καρδιά. Το ωμό κείμενο, που συνήθως έρχεται με σκέτες τελείες, περνά από τον Claude, που δουλεύει σαν επιμελητής φωνητικής υπαγόρευσης φτιαγμένος ειδικά για ελληνικά. Βάζει σωστή ελληνική στίξη, ερωτηματικά, θαυμαστικά, κόμματα και κεφαλαία στην αρχή προτάσεων και στα κύρια ονόματα. Δεν μεταφράζει, κρατά τις αγγλικές λέξεις όπως τις είπες. Δεν αλλάζει το νόημα, μόνο καθαρίζει. Και αναγνωρίζει το προσωπικό σου λεξιλόγιο: αν πεις έναν όρο που ακούγεται παραμορφωμένος, τον γράφει σωστά.
Επειδή όμως η «σωστή στίξη» σημαίνει άλλα πράγματα σε άλλες δουλειές, υπάρχει κλίμακα έντασης 1 έως 5: από πολύ συντηρητική, μόνο σίγουρες τελείες, μέχρι πολύ επιθετική, που πιάνει κάθε ερώτηση και κάθε έμφαση.
Αυτό το σημείο αξίζει προσοχή, γιατί εξηγεί κάτι που πολλοί παρανοούν. Το Wispr Flow δεν πιάνει τα ερωτηματικά επειδή «ακούει» καλύτερα. Τα πιάνει επειδή τα βάζει στην επεξεργασία, μετά την αναγνώριση. Το VoiceType κάνει το ίδιο, με τη διαφορά ότι το ρυθμιστικό είναι στα χέρια σου.
Πέρα από τη φωνή σε κείμενο
Γρήγορα το εργαλείο έγινε κάτι παραπάνω. Απέκτησε πίνακα ελέγχου με λέξεις ανά λεπτό, χρόνο που εξοικονομήθηκε, διορθώσεις, ημερολόγιο συνέπειας, κορυφαίες εφαρμογές και εκτίμηση κόστους ανά μηχανή.
Στη δική μας χρήση ο ρυθμός ομιλίας μετριέται γύρω στις 94 λέξεις το λεπτό. Δεν χρειάζεται να ξέρετε τι πληκτρολογείτε για να καταλάβετε τη διαφορά: κανείς δεν γράφει με αυτή την ταχύτητα. Οπτική κυματομορφή πάνω από τον κέρσορα την ώρα που μιλάς, διακριτική, χωρίς να κλέβει την εστίαση. Ήχους σαν σταγόνα νερού στην έναρξη και τη λήξη, συνθεμένους εσωτερικά. Φωνητικές εντολές που γίνονται μορφοποίηση. Προσωπικό λεξικό αντικαταστάσεων. Τρεις τρόπους εισαγωγής: επικόλληση, πληκτρολόγηση χαρακτήρα προς χαρακτήρα, ή μόνο αντιγραφή στο πρόχειρο.
Τα τέσσερα δύσκολα
Το εύκολο ήταν να στείλουμε ήχο σε ένα API. Το δύσκολο ήταν να συμπεριφέρεται σαν πραγματικό πρόγραμμα των Windows: αόρατο, γρήγορο, να μην ενοχλεί. Εκεί κρύβονταν τα πραγματικά προβλήματα.
Η στοίβα: Python 3.13 σε 64-bit, PySide6 για το γραφικό, sounddevice για τη σύλληψη μικροφώνου στα 16 kHz mono, τη βιβλιοθήκη keyboard για τα καθολικά πλήκτρα, ctypes για απευθείας κλήσεις στα Windows API, και PyInstaller για το τελικό .exe.
Ο κέρσορας έφευγε. Πατούσες το πλήκτρο μέσα σε ορισμένες εφαρμογές και η εστίαση χανόταν. Η πρώτη εικασία, ότι έφταιγε το overlay της κυματομορφής, ήταν λάθος. Η πραγματική αιτία ήταν ότι το πάτημα έφτανε και στην ίδια την εφαρμογή από κάτω. Η λύση ήταν suppress=True στη βιβλιοθήκη keyboard, ώστε το πλήκτρο ενεργοποίησης να καταπίνεται και να μη φτάνει ποτέ πιο κάτω.
Χαμένα handles στα 64-bit. Το overlay επίμονα έκλεβε εστίαση παρά τις σωστές ρυθμίσεις. Η αιτία ήταν λεπτή: στα 64-bit Windows τα handles παραθύρων είναι μεγέθους δείκτη, δηλαδή 64 bit, αλλά η ctypes από προεπιλογή τα κόβει στα 32. Τα handles έβγαιναν αλλοιωμένα και οι κλήσεις αποτύγχαναν σιωπηλά, που είναι το χειρότερο είδος αποτυχίας. Η λύση ήταν να δηλωθεί ρητά ο τύπος HWND σε κάθε κλήση. Το ίδιο ίσχυε για τη δομή INPUT του SendInput, που έπρεπε να περιλαμβάνει ολόκληρη την ένωση για να έχει το σωστό μέγεθος στα x64.
Το exe ξεχνούσε τις ρυθμίσεις. Μόλις πακετάραμε την εφαρμογή, κάθε εκκίνηση έχανε τα κλειδιά API. Οι ρυθμίσεις γράφονταν δίπλα στο εκτελέσιμο, σε φάκελο που δεν ήταν πάντα εγγράψιμος. Η λύση ήταν να μεταφερθούν στον μόνιμο φάκελο χρήστη, με αυτόματη μεταφορά των παλιών μία φορά και ένα διαγνωστικό αρχείο που επιβεβαιώνει πού ψάχνει.
Έτρωγε την τελευταία λέξη. Άφηνες το πλήκτρο και η ηχογράφηση σταματούσε ακαριαία, κόβοντας την τελευταία συλλαβή. Η λύση ήταν μια μικρή ουρά καταγραφής, μερικών εκατοντάδων χιλιοστών του δευτερολέπτου μετά την απελευθέρωση.
Υπήρχαν κι άλλα, από το πακετάρισμα με το σωστό περιβάλλον Python μέχρι το να σχεδιαστεί η κυματομορφή ώστε να μοιάζει ζωντανή αντί για ίσια γραμμή. Αυτά τα τέσσερα όμως είναι που ξεχωρίζουν ένα πρωτότυπο από ένα εργαλείο που το εμπιστεύεσαι καθημερινά.
Τι βγήκε
Ένα προσωπικό εργαλείο που, για ελληνικά με σκόρπια αγγλικά, δίνει καλύτερα αποτελέσματα από τα εμπορικά προγράμματα που το ενέπνευσαν. Όχι επειδή είμαστε καλύτεροι μηχανικοί από εκείνους, αλλά επειδή λύνει το δικό μας πρόβλημα, που εκείνοι δεν είχαν λόγο να το λύσουν.
Κλείδωμα γλώσσας, ώστε να μη «διορθώνει» τα ελληνικά σε αγγλικά ούτε το αντίστροφο. Επιμέλεια με ρυθμιστικό έντασης. Προσωπικό λεξιλόγιο. Τέσσερις μηχανές, ώστε να διαλέγεις ισορροπία ταχύτητας, κόστους και ακρίβειας χωρίς εξάρτηση από έναν πάροχο. Και πλήρης έλεγχος, αφού τρέχει τοπικά και τα δεδομένα μένουν στο μηχάνημά σου.
Το μάθημα όμως είναι πιο γενικό, και είναι το ίδιο που βγαίνει και από το MS-Tools: τα καλά γενικά εργαλεία χάνουν στις άκρες. Και οι άκρες, μια δεύτερη γλώσσα, ένα εξειδικευμένο λεξιλόγιο, μια συγκεκριμένη στίξη, είναι συχνά ακριβώς εκεί που ζει η δουλειά σου.
Όταν το έτοιμο δεν κάνει τη δουλειά, το φτιάχνουμε. Αν έχετε ένα πρόβλημα που κανένα έτοιμο εργαλείο δεν το λύνει, πείτε μου.