Η υπαγόρευσή σου δεν πρέπει ποτέ απλώς να εξαφανίζεται

Υπαγορεύεις μια μεγάλη σκέψη, η εισαγωγή αποτυγχάνει και το κείμενο χάνεται. Γιατί χάνονται οι λέξεις και τι τοπικό ιστορικό κειμένου κρατά το Keebye.

Teodor Deleanu10 Ιουλίου 20268 λεπτά ανάγνωσης

Ενενήντα δευτερόλεπτα ακριβώς-όπως-το-εννοούσα — μια ολόκληρη περιγραφή PR, μια προσεκτική απάντηση σε πελάτη — και μετά κάτι μικρό πάει στραβά τη στιγμή της εισαγωγής. Το παράθυρο-στόχος δεν είχε focus. Το paste δεν πέρασε. Η εφαρμογή είχε έναν λόξιγκα. Και το κείμενο απλώς χάθηκε. Δεν αποθηκεύτηκε κάπου. Δεν κάθεται σε κάποιον buffer. Χάθηκε. Οποιαδήποτε διαδικασία υπαγόρευσης αντιμετωπίζει την εισαγωγή ως το μοναδικό αντίγραφο της μεταγραφής έχει αυτόν τον τρόπο αποτυχίας.

Αυτό που ακολουθεί είναι ένα συγκεκριμένο, δυσανάλογο είδος θυμού, και νομίζω ότι δικαιολογείται. Τα χαμένα δευτερόλεπτα δεν είναι το θέμα. Το θέμα είναι ότι έκανες τη δουλειά — συνέθεσες τη σκέψη, την είπες καλά, η μηχανή τη μετέγραψε κιόλας σωστά — και το εργαλείο κατέστρεψε το αποτέλεσμα εξαιτίας ενός προβλήματος παράδοσης. Η δεύτερη λήψη δεν είναι ποτέ τόσο καλή όσο η πρώτη. Όποιος έχει ξαναϋπαγορεύσει μια παράγραφο από μνήμης ξέρει ότι δεν την αναπαράγεις· παράγεις έναν πιο επίπεδο ξάδερφό της.

Έχω χάσει υπαγορεύσεις έτσι κι εγώ, σε άλλα εργαλεία, πριν υπάρξει το Keebye. Είναι μία από τις μικρές έκτακτες ανάγκες γύρω από τις οποίες χτίστηκε η εφαρμογή.

Γιατί εξαφανίζεται απλώς το υπαγορευμένο κείμενο;

Αυτό δεν είναι bug ενός προμηθευτή. Είναι σχεδιαστική απόφαση σε επίπεδο κατηγορίας, και αξίζει να καταλάβουμε γιατί την πήρε η κατηγορία.

Μια εφαρμογή υπαγόρευσης είναι σωλήνας, όχι επεξεργαστής κειμένου. Η ομιλία μπαίνει από τη μία άκρη· το κείμενο βγαίνει από την άλλη, μέσα στο παράθυρο κάποιου άλλου — ένα terminal, ένα κουτί στο Slack, ένα Google Doc. Δεν υπάρχει δικό της έγγραφο, που είναι ακριβώς αυτό που κάνει αυτά τα εργαλεία αόρατα και γρήγορα. Σημαίνει όμως ότι η μεταγραφή συχνά υπάρχει για ακριβώς μία στιγμή: την εισαγωγή. Και η εισαγωγή είναι το πιο εύθραυστο βήμα ολόκληρης της διαδικασίας. Εξαρτάται από το ποιο παράθυρο έχει focus το χιλιοστό του δευτερολέπτου της παράδοσης, από το να μην κάνει άλλη εφαρμογή κούρσα για το πρόχειρο, από το αν οι άδειες προσβασιμότητας έχουν διάθεση, από το αν η εφαρμογή-στόχος δέχεται καν συνθετική είσοδο. Όταν οτιδήποτε από αυτά αποτύχει, ένας καθαρός σωλήνας δεν έχει τίποτα από πίσω. Το νερό είναι στο πάτωμα.

Υπάρχει και ένας αρχής λόγος για τον οποίο τα εργαλεία διστάζουν να κρατούν αντίγραφα: ένα αρχείο καταγραφής όλων όσων έχεις υπαγορεύσει είναι ευαίσθητο. Οι υπαγορεύσεις σου είναι τα μηνύματά σου, τα prompts σου, οι μισοδιαμορφωμένες σου αποφάσεις. Ένας προμηθευτής που τα αποθηκεύει — ιδίως κάπου κοντά σε cloud — έχει δημιουργήσει ευθύνη, και ο εύκολος τρόπος να αποφύγεις την ευθύνη είναι να μην κρατάς τίποτα. Οι χρήστες κληρονομούν αυτή την επιφύλαξη ως εφημερότητα: η ασφαλέστερη υπαγόρευση, από τη σκοπιά του προμηθευτή, είναι αυτή που δεν υπήρξε ποτέ.

Καταλαβαίνω τη λογική. Απλώς νομίζω ότι βελτιστοποιεί για τη λάθος πλευρά. Ο τρόπος αποτυχίας του να κρατάς τοπικό ιστορικό είναι ένα αρχείο στον δικό σου δίσκο. Ο τρόπος αποτυχίας του να μην κρατάς τίποτα είναι η δουλειά σου να εξατμίζεται επειδή ένα παράθυρο έχασε το focus.

Τι κρατά το Keebye, και πού

Οπότε το Keebye κρατά ιστορικό, ενεργό από προεπιλογή, και να τι ακριβώς σημαίνει αυτό — ούτε παραπάνω ούτε παρακάτω.

Με το ιστορικό ενεργοποιημένο, κάθε ολοκληρωμένη υπαγόρευση γράφεται σε μια τοπική βάση δεδομένων SQLite στο Mac σου (rusqlite, λειτουργία WAL, για όσους ενδιαφέρονται για τα υδραυλικά). Το αρχείο ζει στον κατάλογο app-support — com.keebye.app/keebye.db — και δεν φεύγει ποτέ από το μηχάνημα. Δεν υπάρχει συγχρονισμός, ούτε ανέβασμα, ούτε λογαριασμός στον οποίο να είναι συνδεδεμένο. Είναι ένα αρχείο, στον δίσκο σου, που σου ανήκει.

Η ανάκτηση είναι σχεδιασμένη γύρω από τους δύο τρόπους με τους οποίους πραγματικά χάνεις κείμενο. Η συνηθισμένη περίπτωση — η εισαγωγή μόλις απέτυχε, πριν από ένα δευτερόλεπτο — έχει την ταχύτερη διαδρομή: το μενού στο tray έχει ένα στοιχείο Copy Last Dictation. Κάνε κλικ, η πιο πρόσφατη υπαγόρευσή σου είναι στο πρόχειρο, κάνε paste εκεί που έπρεπε να πάει, προχώρα. Η σπανιότερη περίπτωση — «υπαγόρευσα κάτι την Τρίτη και το θέλω πίσω» — περνά από το Dictation History…, ένα παράθυρο με την πλήρη λίστα: με δυνατότητα αναζήτησης, με διαγραφή ανά εγγραφή και μια εκκαθάριση όλων για όταν θέλεις καθαρή πλάκα.

Η διατήρηση είναι 30 ημέρες, εφαρμοσμένη αυτόματα. Το κλάδεμα τρέχει όταν ανοίγει η βάση δεδομένων και ξανά μετά από κάθε εισαγωγή, οπότε το παράθυρο είναι πραγματικά 30 ημέρες, όχι «30 ημέρες, περίπου, όποτε προλάβουμε». Και αν θέλεις την παλιά εφήμερη συμπεριφορά — κάποιοι πρέπει να τη θέλουν, και θα φτάσω στο ποιοι — το ιστορικό είναι ρύθμιση (history_enabled), και το να την απενεργοποιήσεις σημαίνει ότι δεν γράφεται απολύτως τίποτα.

Μόνο κείμενο. Ποτέ ήχος.

Το κομμάτι που με νοιάζει περισσότερο είναι το τι δεν είναι το ιστορικό. Είναι μόνο κείμενο. Το σχήμα του ιστορικού του Keebye δεν έχει στήλη ήχου — όχι ρύθμιση διατήρησης ήχου με προεπιλογή απενεργοποιημένη, καμία στήλη. Οι ίδιες οι ηχογραφήσεις δεν αποθηκεύονται ποτέ. Αυτό είναι δομικό, εκ σχεδιασμού: μια μεταγραφή του «απάντησε στον Andrei ότι η μετάβαση καθυστερεί μια εβδομάδα» είναι ήδη αρκετά ευαίσθητη· ο ήχος της φωνής σου να το λέει, με χρονοσήμανση, είναι διαφορετικής τάξης τεκμήριο, και δεν ήθελα η εφαρμογή να είναι καν ικανή να το συσσωρεύει.

Μία ακόμη λεπτομέρεια που μετράει περισσότερο από τον αριθμό των λέξεών της: αν υπαγορεύσεις σε ασφαλές πεδίο — μια είσοδο τύπου κωδικού — το ιστορικό δεν το καταγράφει. Το ένα μέρος όπου ακόμη και ένα ίχνος κειμένου είναι λάθος είναι το ένα μέρος όπου δεν κρατάμε κανένα.

Αυτή είναι η ίδια στάση με την υπόλοιπη εφαρμογή — το speech-to-text τρέχει on-device, για το οποίο γράψαμε στο πλαίσιο του να υπαγορεύεις στη δική σου γλώσσα — αλλά το ιστορικό είναι εκεί όπου η στάση δοκιμάζεται, επειδή το ιστορικό είναι το μόνο σημείο όπου το Keebye διατηρεί καθόλου τα λόγια σου. Τοπικό, μόνο κειμένου, αυτοδιαγραφόμενο έμοιαζε με το σχήμα που κερδίζει την προεπιλογή του ενεργού.

Τα ειλικρινή όρια

Ενότητα ειλικρίνειας, ως συνήθως.

Δεν μπορείς να ξανακούσεις. Το μόνο κείμενο κόβει και από τις δύο μεριές. Αν η μεταγραφή ήταν λάθος — το μοντέλο παράκουσε ένα όνομα, παραμόρφωσε έναν αριθμό — το ιστορικό διατηρεί πιστά το λάθος κείμενο, και ο ήχος που θα μπορούσε να λύσει τη διαφωνία έχει χαθεί εκ σχεδιασμού. Για τις περισσότερες περιπτώσεις ανάκτησης αυτό δεν έχει σημασία· η αποτυχία ήταν η εισαγωγή, όχι η μεταγραφή. Αλλά αν ήθελες το ιστορικό υπαγόρευσης ως αρχείο φωνητικών σημειωμάτων, αυτό δεν είναι, επίτηδες.

Τριάντα ημέρες είναι τριάντα ημέρες. Το ιστορικό είναι δίχτυ ασφαλείας, όχι αρχείο. Αν μια υπαγόρευση έχει σημασία πέρα από έναν μήνα, το σπίτι της είναι το έγγραφο μέσα στο οποίο την υπαγόρευσες, όχι η βάση δεδομένων της εφαρμογής. Το κλάδεμα δεν ρωτάει.

Μόνο τοπικό σημαίνει μόνο τοπικό. Το ιστορικό σου δεν σε ακολουθεί ανάμεσα σε μηχανήματα. Η υπαγόρευση που έκανες στον σταθερό δεν ανακτάται από το laptop. Το παρουσιάζω ως λειτουργία απορρήτου, και είναι — τίποτα δεν συγχρονίζεται επειδή τίποτα δεν μεταδίδεται — αλλά δεν θα προσποιηθώ ότι δεν είναι και περιορισμός. Είναι και τα δύο. Πρέπει να ξέρεις ποιο από τα δύο είναι για σένα πριν βασιστείς σε αυτό.

Και η οριακή περίπτωση: αν είσαι ο άνθρωπος του οποίου το μοντέλο απειλών λέει κανένα ίχνος, απενεργοποίησε το ιστορικό. Είναι μία ρύθμιση, και η εφαρμογή τη σέβεται απόλυτα. Το ενεργό από προεπιλογή είναι η σωστή επιλογή για τους περισσότερους χρήστες, που θα προτιμούσαν να έχουν πίσω την παράγραφο της περασμένης Τρίτης· δεν πρέπει να είναι παγίδα για τους υπόλοιπους.

Η δουλειά δεν πρέπει να έχει μοναδικό σημείο αποτυχίας

Ο βαθύτερος λόγος που υπάρχει αυτή η λειτουργία: τρέχω τη μέρα μου ως παράλληλα lanes — agents να χτίζουν σε κάποια παράθυρα, άνθρωποι να περιμένουν σε άλλα — και η φωνή είναι το κανάλι που τα τροφοδοτεί όλα. Αυτό το workflow είναι όλη η προκείμενη του Οδηγώντας το Claude Code με τη φωνή σου. Ένα κανάλι που περιστασιακά καταστρέφει το ίδιο του το φορτίο δεν είναι κανάλι πάνω στο οποίο χτίζεις μια εργάσιμη μέρα. Οι developers περιμένουν διαδρομές ανάκτησης — undo, logs, reflogs, κάδο απορριμμάτων — κι όμως πολλές ροές υπαγόρευσης δεν εκθέτουν κανένα ισοδύναμο όταν μια εισαγωγή αποτυγχάνει.

Αν ζυγίζεις εργαλεία σε αυτή την κατηγορία, οι συγκρίσεις μας είναι ειλικρινείς για το πού λάμπουν και τα άλλα: Keebye vs Superwhisper και Keebye vs Wispr Flow. Και το κείμενο που εξαφανίζεται έχει ένα αδελφικό παράπονο — η πρώτη λέξη της υπαγόρευσής σου που τρώγεται πριν ξυπνήσει το μικρόφωνο — το οποίο γράψαμε στο Γιατί οι εφαρμογές υπαγόρευσης τρώνε την πρώτη σου λέξη.

Το Keebye είναι σε πρώιμη πρόσβαση για macOS. Ξεκίνα τη δωρεάν δοκιμή σου παρακάτω, υπαγόρευσε μια παράγραφο, αστόχησε σκόπιμα το παράθυρο-στόχο, και μετά χρησιμοποίησε το Copy Last Dictation για να ανακτήσεις το κείμενο. Το λάθος focus εξακολουθεί να κοστίζει ένα βήμα ανάκτησης· δεν χρειάζεται πια να κοστίζει τη σκέψη.

Κάνε την επόμενη μεγάλη υπαγόρευση ανακτήσιμη

Ξεκίνα τη δωρεάν δοκιμή σου και δοκίμασε το Copy Last Dictation πριν εμπιστευτείς στη φωνή μια μεγάλη περιγραφή PR.

Start free trial

Early access: we'll email you the moment the macOS build is ready — your 14 days start when you first sign in from the app.

Συνέχισε την ανάγνωση