Υπάρχουν εξαιρετικά προγράμματα υπαγόρευσης φωνής για 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 κάνει το ίδιο, με τη διαφορά ότι το ρυθμιστικό είναι στα χέρια σου. Καμία μαγεία, λοιπόν. Κάποιος αποφασίζει πού μπαίνει το ερωτηματικό, και εμείς προτιμήσαμε αυτός ο κάποιος να είστε εσείς.

Και μετά, όπως πάντα, ξέφυγε λίγο

Γρήγορα το εργαλείο έγινε κάτι παραπάνω. Έτσι πάει πάντα: φτιάχνεις αυτό που σου λείπει, γλυκαίνεσαι, και συνεχίζεις. Απέκτησε πίνακα ελέγχου με λέξεις ανά λεπτό, χρόνο που εξοικονομήθηκε, διορθώσεις, ημερολόγιο συνέπειας, κορυφαίες εφαρμογές και εκτίμηση κόστους ανά μηχανή. Ναι, ένα εργαλείο υπαγόρευσης απέκτησε στατιστικά. Πρόγραμμα είναι, μην μπερδεύεστε, κάπου θα κατέληγε.

Ο πίνακας ελέγχου του VoiceType: ρυθμός ομιλίας 94 λέξεις το λεπτό, χρόνος που κερδήθηκε, εκτίμηση κόστους, ημερολόγιο συνέπειας, κορυφαίες εφαρμογές και λέξεις ανά ημέρα.
Πάνω πάνω, τα δύο πλήκτρα με διαφορετική μηχανή το καθένα και η επιμέλεια ενεργή. Από κάτω, ρυθμός ομιλίας, χρόνος που κερδήθηκε, κόστος, και σε ποιες εφαρμογές πηγαίνει η υπαγόρευση.

Στη δική μας χρήση ο ρυθμός ομιλίας μετριέται γύρω στις 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: τα καλά γενικά εργαλεία χάνουν στις άκρες. Και οι άκρες, μια δεύτερη γλώσσα, ένα εξειδικευμένο λεξιλόγιο, μια συγκεκριμένη στίξη, είναι συχνά ακριβώς εκεί που ζει η δουλειά σας. Στο κέντρο μοιάζουν όλα τέλεια. Στις άκρες κρίνεται η μέρα σας.

Θυμάστε το βαρύγδουπο της αρχής, αυτό που σας είπα να κρατήσετε στην άκρη; Ας το ξαναπιάσουμε τώρα. Ξεκινήσαμε με ένα πρόγραμμα που άκουγε ελληνικά και έγραφε κινέζικα. Καταλήξαμε σε ένα που ακούει ελληνικά και γράφει ελληνικά, με το ερωτηματικό στη θέση του. Όταν το έτοιμο δεν κάνει τη δουλειά, το φτιάχνουμε. Αν έχετε ένα πρόβλημα που κανένα έτοιμο εργαλείο δεν το λύνει, πείτε μου.