Nói đúng lời tôi: đọc chính tả không bị AI viết lại

AI viết lại lời đọc: bỏ từ ràng buộc, đảo nghĩa. Vì sao khâu trau chuốt bằng LLM diễn giải lại lời bạn và Keebye giữ nguyên nghĩa đen?

Teodor Deleanu10 tháng 7, 202611 phút đọc

Có một lời than về đọc chính tả có AI tăng cường nghe như nghịch lý cho tới khi bạn sống với nó: phần chuyển văn bản thì ổn — chính cái xảy ra sau khi chuyển văn bản mới phá hỏng mọi thứ. Bạn nói một điều, và công cụ giao ra một điều bóng bẩy, tự tin, và hơi khác. Một từ ràng buộc lặng lẽ biến mất. Một cách nói dè dặt bị gỡ bỏ. Một câu bị tái cấu trúc thành thứ bạn không bao giờ nói. Và trong phiên bản tệ nhất của kiểu hỏng này — cái khiến người ta bỏ công cụ ngay lập tức — ý nghĩa bị đảo ngược. “Đừng deploy cho đến khi test pass” ra đầu bên kia thành một chỉ dẫn về việc deploy, mất chữ đừng.

Với việc đọc chính tả thông thường thì đây là chuyện phiền toái. Với cách tôi thật sự dùng đọc chính tả — nạp prompt cho Claude Code, quy trình trong bài điều khiển Claude Code bằng giọng nói — thì nó là thuốc độc. Một agent lập trình coi lời bạn là bản đặc tả. Nó không biết công cụ đọc chính tả của bạn đã diễn giải lại bạn. Nếu cái từ ràng buộc khiến chỉ dẫn trở nên an toàn bị bào mòn đâu đó giữa miệng bạn và terminal, agent sẽ vui vẻ thi hành phiên bản đã bị bào mòn. Sự chính xác là toàn bộ mục đích của một prompt, còn một lớp AI viết lại là một cỗ máy chuyên loại bỏ sự chính xác trong khi làm cho kết quả trông có vẻ chỉn chu hơn.

Vì sao các công cụ đọc chính tả dùng AI lại viết lại lời bạn nói?

Câu trả lời ở tầm cả nhóm sản phẩm không phải là có ai đó chủ ý bóp méo lời nói. Mà là “dọn dẹp bản chuyển văn bản này” là một tính năng thật sự hấp dẫn, và cách hiển nhiên để làm nó là đẩy bản chuyển văn bản thô qua một model ngôn ngữ.

Lời nói thô thì lộn xộn — từ đệm, những lần bắt đầu hụt, từ lặp, thiếu dấu câu. Một LLM được yêu cầu dọn dẹp chỗ đó sẽ cho ra đầu ra đẹp đẽ. Rắc rối là một model ngôn ngữ không biên tập theo cách một biên tập viên con người xóa chữ “um” biên tập. Nó tái tạo. Đầu ra là một văn bản mới mà model cho là phiên bản tốt của đầu vào của bạn, và “tốt” chính là chỗ ý định của bạn rò rỉ ra ngoài. Những model được huấn luyện theo hướng hữu ích và trôi chảy thì có quan điểm riêng: sự dè dặt trông như nhiễu, từ ràng buộc trông như thừa thãi, một cách diễn đạt vụng-nhưng-chính-xác trông như thứ cần cải thiện. Phần lớn thời gian, việc viết lại là vô hại. Nhưng nó mang tính xác suất, và nhìn đầu ra bạn không thể biết câu nào là được chuyển văn bản còn câu nào là được sáng tác. Độ bóng bẩy thì đồng đều; độ trung thành thì không.

Đó là vấn đề sâu xa của các đường trau chuốt bằng LLM: chúng hỏng một cách âm thầm và đầy tự tin. Một bộ nhận dạng giọng nói nghe nhầm bạn thường cho ra thứ sai một cách thấy được. Một lớp viết lại phản bội bạn lại cho ra thứ trông đúng một cách thấy được — đúng ngữ pháp, hợp lý, khoác giọng của bạn — và đó chính xác là lý do câu “đừng deploy” bị đảo ngược lại được gửi đi thay vì bị bắt lại.

Nguyên văn theo mặc định

Lập trường của Keebye rất đơn giản: điều model chuyển giọng nói thành văn bản nghe được chính là điều rơi xuống con trỏ của bạn. Theo mặc định, không có model ngôn ngữ nào ngồi giữa bản chuyển văn bản và terminal của bạn để soạn ra một phiên bản khá hơn của bạn — bước trau chuốt mặc định là một danh sách ngắn các quy tắc tất định, chỉ vậy thôi.

Đó là một lựa chọn có chủ ý, và nó đến từ trường hợp dùng vibecoding. Khi việc đọc chính tả của bạn là kênh điều khiển cho các agent lập trình, việc của công cụ là vận chuyển, không phải sáng tác. Bạn là người viết; agent là người đọc; lớp đọc chính tả không nên có quan điểm gì. Quy trình đó — nói trọn cả prompt thay vì gõ chúng — được trình bày trong bài gõ bằng giọng nói cho prompt AI.

Trong Keebye một bước trau chuốt bằng LLM — tôi sẽ nói tới — nhưng nó là tùy chọn phải tự bật, nó chạy hoàn toàn trên máy bạn, và nó hoạt động dưới một lớp bảo vệ được thiết kế để loại bỏ những dạng trôi nghĩa, phình nở và lặp lại phổ biến. Nếu đầu ra không qua được phép kiểm tra đó, Keebye lùi về các quy tắc. Mặc định vẫn là quy tắc.

Vậy khâu dọn dẹp thật sự làm gì?

Nguyên văn không nhất thiết là thô. Keebye có kèm một lượt dọn dẹp tùy chọn — phần tăng cường, bật sẵn theo mặc định, và có thể ghi đè theo từng app — nhưng nó dựa trên quy tắc, không phải một model, và danh sách đầy đủ những gì nó làm gọn trong một đoạn văn:

Nó lược bỏ những từ đệm đứng riêng (um, uh, erm, you know). Nó gộp những từ lặp ngay liền nhau — “the the” thành “the”. Nó gộp khoảng trắng. Nó viết hoa chữ cái đầu, và thêm một dấu chấm cuối câu nếu bạn không kết thúc bằng dấu nào. Danh sách chỉ có vậy. Các quy tắc là tất định và có phạm vi hẹp; chúng không chủ ý sắp xếp lại mệnh đề, không xóa từ phủ định, và không thay từ đồng nghĩa.

Trước khi khâu dọn dẹp chạy, các phép thay thế trong từ điển của bạn sẽ được áp dụng — những phép thay thế do người dùng định nghĩa cho thuật ngữ và danh từ riêng mà các model giọng nói hay làm hỏng, để “pnpm” và tên các module của bạn đến nơi được viết đúng như cách codebase của bạn viết chúng.

Và nếu ngay cả lượt dọn dẹp theo quy tắc cũng đã là can thiệp nhiều hơn bạn muốn, hãy tắt phần tăng cường và Keebye sẽ chèn bản chuyển văn bản thô từ model giọng nói: đủ cả từ đệm, từ lặp và mọi thứ. Với một số ngữ cảnh — trích lời ai đó, đọc vào một ô mà dấu chấm cuối câu làm hỏng chuyện — bản thô mới là lựa chọn tốt hơn, và tùy chọn ghi đè theo từng app cho phép bạn chọn nó.

Bước trau chuốt tùy chọn, và lớp bảo vệ độ trung thành quanh nó

Giờ tới cái LLM tôi đã hứa sẽ nói. Với những người thật sự muốn dọn dẹp thông minh hơn, Keebye có một chế độ trau chuốt tùy chọn (polish_mode đặt thành local_llm): một model Qwen3 nhỏ chạy ngay trên máy qua llama.cpp, tăng tốc bằng Metal, không gửi gì đi đâu cả. Chỉ dẫn của nó là phiên bản hẹp của việc trau chuốt — sửa dấu câu và viết hoa, bỏ từ đệm, giữ nguyên đúng từ ngữ, ngôn ngữ và ý nghĩa của người dùng, giữ nguyên văn code và tên tệp. Việc sinh văn bản là tất định (greedy sampling, cùng đầu vào → cùng đầu ra) và có giới hạn; nếu model treo quá hạn hai giây, đầu ra của nó bị bỏ đi.

Nhưng chỉ dẫn chỉ là hy vọng, và bài viết này tồn tại vì hy vọng không phải bảo đảm. Nên mọi kết quả đã được LLM trau chuốt đều đi qua một lớp bảo vệ độ trung thành trước khi được phép chạm vào con trỏ của bạn. Đầu ra phải giữ lại ít nhất 50% số token của bản chuyển văn bản gốc. Nó không được phình lên — bất cứ thứ gì vượt quá khoảng gấp đôi độ dài gốc (cộng bốn token) đều bị đánh trượt. Việc lặp lại mất kiểm soát cũng bị phát hiện. Nếu kết quả đã trau chuốt trượt một trong các phép kiểm tra đó, Keebye vứt nó đi và lùi về khâu dọn dẹp theo quy tắc.

Lớp bảo vệ đó bắt được tình trạng mất token nghiêm trọng, phình nở mất kiểm soát và lặp lại, trước khi đầu ra của model kịp thay thế bản chuyển văn bản đã dọn theo quy tắc. Nó là một phép suy đoán, không phải một chứng minh về ngữ nghĩa: một bản viết lại ngắn hay một chỗ phủ định bị đổi vẫn có thể lọt qua các ngưỡng của nó. Nếu một từ ràng buộc không được phép trôi nghĩa, hãy tắt phần trau chuốt bằng AI và xem lại văn bản đã chèn trước khi gửi đi.

Những giới hạn trung thực

Nguyên văn nghĩa là nguyên văn. Nếu bạn nói lan man, phần lan man của bạn sẽ rơi xuống — ngay cả bước trau chuốt tùy chọn cũng được chỉ dẫn và canh giữ theo hướng dọn dẹp, không phải sáng tác, nên Keebye sẽ không biến một dòng suy nghĩ lòng vòng thành một chỉ dẫn gọn ghẽ. Kỷ luật nói đúng điều mình muốn nói vẫn thuộc về bạn.

Khâu dọn dẹp theo quy tắc cố tình ngờ nghệch. Nó bỏ chữ “um”; nó sẽ không sửa ngữ pháp cho bạn, không tái cấu trúc một câu dài lê thê, và không nhận ra rằng bạn vừa tự mâu thuẫn với chính mình. Bất cứ thứ gì thông minh hơn sẽ đưa trở lại đúng những phán đoán chủ quan mà thiết kế này tồn tại để tránh.

Và độ trung thành bảo vệ bạn khỏi việc bị viết lại, chứ không phải khỏi việc bị nghe nhầm. Nếu model giọng nói nghe “cache” thành “cash”, lỗi đó được giữ lại một cách trung thành — lớp bảo vệ chẳng biết gì về điều bạn định nói, nó chỉ biết cái đã được chuyển thành văn bản. Đọc chính tả nguyên văn dời ranh giới tin cậy sang model chuyển giọng nói thành văn bản; nó không xóa bỏ ranh giới đó. (Liên quan: nếu vấn đề của bạn là model chuyển văn bản sai hẳn ngôn ngữ, đó là một kiểu hỏng khác với cách chữa khác — ghim ngôn ngữ đọc chính tả của bạn.)

Cuối cùng là cách đặt vấn đề ở tầm cả nhóm sản phẩm: trau chuốt bằng AI không phải trò lừa, và rất nhiều người dùng thật sự thích đầu ra đọc mượt hơn cách họ nói. Nếu đó là bạn, những công cụ khác làm chuyện này rất tốt, và các bài so sánh của chúng tôi nói điều đó một cách trung thực — Keebye vs Wispr FlowKeebye vs Superwhisper đều có một phần thật sự nói về “khi nào công cụ kia hợp hơn”.

Vận chuyển, không phải sáng tác

Thỏa thuận mà Keebye đưa ra hẹp một cách có chủ ý: bạn nói, và một bản chuyển văn bản được dọn nhẹ rơi xuống đúng chỗ con trỏ của bạn. Khi những lời đó là prompt gửi tới một agent sẽ hành động theo đúng nghĩa đen, thì hẹp chính là một tính năng. Điều đắt giá nhất mà một công cụ đọc chính tả có thể gây ra cho một lập trình viên không phải một lỗi chính tả. Đó là một câu trôi chảy mà bạn chưa từng nói.

Keebye đang trong giai đoạn truy cập sớm cho macOS. Hãy bắt đầu bản dùng thử miễn phí bên dưới, đọc câu “Đừng deploy cho đến khi test pass”, và kiểm tra xem đúng cái ràng buộc đó có sống sót qua khâu dọn dẹp không. Phép thử đó chính là toàn bộ sản phẩm.

Thử đúng chỉ dẫn không được phép trôi nghĩa

Bắt đầu bản dùng thử miễn phí và đọc một prompt có một từ ràng buộc sống còn—nhất là một chữ 'đừng'—rồi soi kỹ thứ đến nơi.

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.

Đọc tiếp