Tự động nhận diện cứ đoán sai: hãy ghim ngôn ngữ của bạn

Bản đọc chính tả cứ ra sai ngôn ngữ? Việc tự động nhận diện dao động trên lời nói song ngữ ngay từ bản chất. Hãy ghim ngôn ngữ một lần và nó ở nguyên đó.

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

Nếu bạn đọc chính tả bằng hơn một ngôn ngữ, hẳn bạn đã thấy kiểu hỏng này. Bạn nói một câu tiếng Rumani và bản chuyển văn bản trả về là tiếng Anh bị bóp méo theo âm — toàn từ có thật, mà chẳng từ nào là của bạn. Hoặc nó lật giữa câu: nửa đầu đúng ngôn ngữ, nửa sau bằng thứ tiếng mà model quyết định là bạn vừa chuyển sang. Hoặc, món tôi thích nhất, một nồi lẩu trộn bảng chữ cái — ký tự Latinh với vài ký tự Kirin rắc vào, như thể model chia đôi cửa cược theo từng chữ.

Đây không phải lời than về một sản phẩm cụ thể. Nó là kiểu hỏng có thể dự đoán được của việc tự động nhận diện ngôn ngữ, kể cả với engine mặc định tinh chỉnh cho tiếng Anh của Keebye. Nó đánh vào người nói tiếng Anh có accent và bất kỳ ai chuyển qua lại giữa các ngôn ngữ suốt cả ngày. Một lập trình viên song ngữ có Slack bằng tiếng Ba Lan và commit message bằng tiếng Anh đưa cho phần tự động nhận diện đúng thứ tín hiệu pha trộn mà nó xử lý tệ nhất.

Nửa sau của lời than thì thầm lặng hơn nhưng cũng có thật y như vậy: khi một cài đặt ngôn ngữ tồn tại, nó thường bị chôn sâu. Ba tầng menu, nằm sau một bộ chọn engine, đi qua một cái công tắc mà tên gọi thậm chí không nhắc tới ngôn ngữ. Nếu mỗi ngày bạn đổi ngôn ngữ hai chục lần, một cài đặt bị chôn sâu về mặt chức năng là không có cài đặt nào.

Tôi muốn giải thích vì sao xảy ra chuyện dao động đó — dùng chính câu chuyện chiến trường của sản phẩm mình, vì Keebye từng có vấn đề này trước khi có cách chữa — rồi mới cho thấy một giải pháp thật sự trông ra sao.

Vì sao tự động nhận diện dao động (và vì sao đó không hẳn là một lỗi)

Đây là cơ chế trung thực. Các model giọng nói hiện đại làm việc nhận diện ngôn ngữ một cách âm thầm, như một phần của quá trình giải mã. Model lắng nghe, hình thành một phỏng đoán nội bộ về ngôn ngữ nó đang nghe, và giải mã theo phỏng đoán đó. Khi âm thanh sạch, không có accent và chỉ một ngôn ngữ, cách này chạy tốt đến mức bạn chẳng bao giờ phải nghĩ tới.

Giờ hãy đưa cho nó lời nói thật. Một accent kéo các nguyên âm về phía âm vị của ngôn ngữ khác. Một câu chứa ba từ mượn tiếng Anh — cuộc trò chuyện kỹ thuật nào chẳng vậy. Có một đứa nhỏ ở đằng sau, hoặc bạn đang dùng micro của laptop. Mỗi thứ đó làm phỏng đoán ngôn ngữ nội bộ của model kém chắc chắn hơn, và một phỏng đoán ít chắc chắn có thể lật qua lật lại giữa các khung. Khi nó lật, phần giải mã lật theo, và bạn nhận được một bản chuyển văn bản đổi ngôn ngữ ngay giữa dòng suy nghĩ.

Điểm mấu chốt: ở phần lớn công cụ, chẳng có gì neo cái phỏng đoán đó lại. Model tự quyết, âm thầm, theo từng câu nói, và bạn không có quyền ghi đè. Đó không phải lỗi của riêng app nào — đó chính bản chất của việc tự động nhận diện âm thầm. Một model đưa ra phán đoán mà bạn không sửa được.

Tôi hiểu chuyện này rất tường tận vì engine mặc định của Keebye có đúng tính chất đó. Parakeet, mặc định tinh chỉnh cho tiếng Anh của chúng tôi, bỏ qua mọi gợi ý ngôn ngữ ở tầng giải mã — bạn không thể nói trước cho nó biết bạn sắp nói tiếng gì. Với tiếng Anh rõ ràng thì nó xuất sắc, và đó là lý do nó là mặc định. Với âm thanh không rõ, nó có thể dao động giữa các ngôn ngữ y như mọi thứ khác trong ngành. Tôi nói điều này về sản phẩm của chính mình trước, vì cách chữa chỉ có ý nghĩa khi bạn đã chấp nhận rằng vấn đề nằm trong kiến trúc, chứ không nằm ở sự cẩu thả của đối thủ nào đó.

Ghim một ngôn ngữ thật sự làm gì?

Cách chữa là thôi bắt model phải đoán. Keebye có kèm một engine thứ hai chạy trên máy — Canary 1B v2 của NVIDIA, lượng tử hóa xuống int8 — bao đúng 25 ngôn ngữ: tiếng Bungari, Croatia, Séc, Đan Mạch, Hà Lan, Anh, Estonia, Phần Lan, Pháp, Đức, Hy Lạp, Hungary, Ý, Latvia, Litva, Malta, Ba Lan, Bồ Đào Nha, Rumani, Slovakia, Slovenia, Tây Ban Nha, Thụy Điển, Nga và Ukraina. Khác với engine mặc định, Canary nhận một chỉ dẫn về ngôn ngữ và tuân theo nó.

Keebye đưa điều đó ra thành một cái ghim: một cài đặt ngôn ngữ tường minh được truyền cho engine Canary ở mỗi câu nói. Ghim tiếng Rumani và bộ giải mã sẽ dùng tiếng Rumani thay vì tự chọn ngôn ngữ. Việc nhận dạng vẫn có thể sai, nhất là quanh các từ mượn và âm thanh ồn, nhưng lựa chọn ngôn ngữ không còn là một phỏng đoán vô kiểm soát nữa.

Cài đặt này được đọc trực tiếp ở mỗi lượt đọc. Đổi nó và lần giữ-để-đọc kế tiếp đã dùng ngôn ngữ mới, không cần khởi động lại app. Chuyện đó quan trọng hơn vẻ ngoài của nó: một công cụ điều khiển ngôn ngữ hữu ích hơn nhiều khi việc chuyển đổi không làm gián đoạn công việc.

Và vì Canary chạy ngay trên máy như mọi thứ khác trong Keebye, cái ghim không lấy đi của bạn câu chuyện về quyền riêng tư. Model nặng khoảng 1,3 GB, tải một lần; sau đó tiếng Rumani, tiếng Ba Lan, tiếng Ukraina của bạn không bao giờ rời khỏi máy. (Vì sao chúng tôi cho rằng đọc chính tả đa ngôn ngữ chạy cục bộ là chuyện đáng quan tâm thì có bài riêng — đọc chính tả cho lập trình viên không nên chỉ có tiếng Anh. Bài này là phần tiếp nối thực dụng của nó: bài kia lập luận cho các ngôn ngữ, bài này nói về việc làm cho chúng thật sự dùng được.)

Hai cú nhấp, không phải ba tầng menu

Một cái ghim bạn với không tới là cái ghim bạn sẽ không dùng, nên công tắc nằm ngay trên menu bar. Biểu tượng trên menu bar của Keebye có một menu “Dictation Language” với danh sách rút gọn được tuyển chọn gồm 11 ngôn ngữ — tiếng Anh, Rumani, Pháp, Đức, Tây Ban Nha, Ý, Bồ Đào Nha, Hà Lan, Ba Lan, Nga, Ukraina. Hai cú nhấp từ bất kỳ app nào: nhấp vào biểu tượng, nhấp vào ngôn ngữ. Bạn không phải mở Settings, bạn không phải rời khỏi cửa sổ đang làm việc.

Danh sách đầy đủ 25 ngôn ngữ nằm trong Settings cho những thứ tiếng ngoài danh sách rút gọn. Nhưng danh sách rút gọn bao được thực tế hằng ngày của phần lớn công việc song ngữ: bạn viết cho team bằng một ngôn ngữ và viết cho khách hàng hay một agent AI bằng ngôn ngữ khác, và bạn cần cú lật đó chẳng tốn gì cả.

Còn một tùy chọn nữa đáng biết, vì nó thay đổi hẳn cách một số người dùng cái ghim: công tắc dịch sang tiếng Anh. Bạn nói ngôn ngữ của mình, tiếng Anh rơi xuống con trỏ — cùng một engine, cùng cách chạy ngay trên máy. Nếu dòng độc thoại nội tâm của bạn chạy bằng tiếng Rumani nhưng đầu ra cần là tiếng Anh (commit message, prompt gửi cho một agent lập trình, câu trả lời cho một team quốc tế), điều này gộp luôn bước dịch mà bạn vẫn tự làm trong đầu. Tôi dùng nó nhiều hơn mình tưởng.

Cái ghim lấy đi của bạn những gì

25 ngôn ngữ là 25 ngôn ngữ. Các công cụ đọc chính tả trên đám mây liệt kê nhiều hơn hẳn, vì gửi âm thanh lên một model lớn phía máy chủ là cách rẻ để thêm ngôn ngữ. Đó là đánh đổi thật của việc chạy trên máy: một model vừa với máy Mac của bạn bao được ít phần thế giới hơn một model chiếm cả trung tâm dữ liệu. Nếu ngôn ngữ của bạn không nằm trong danh sách 25, engine đa ngôn ngữ của Keebye hôm nay chưa bao được bạn, và tôi thà nói vậy còn hơn làm tròn lên.

Ghim nghĩa là ghim. Đây là mặt trái của tính tất định, và tôi muốn nói thẳng: nếu bạn ghim tiếng Rumani rồi nói tiếng Anh, Keebye sẽ trung thành giải mã sai tiếng Anh của bạn thành tiếng Rumani cho tới khi bạn đổi lại. Engine đang làm đúng những gì bạn bảo nó làm. Toàn bộ sức hấp dẫn của việc tự động nhận diện là bạn sẽ không bao giờ phải nghĩ về chuyện này — cái ghim đánh đổi sự tiện lợi đó lấy tính dự đoán được. Theo kinh nghiệm của tôi, đánh đổi đó đáng, vì một phỏng đoán sai bạn không kiểm soát được thì tệ hơn một cài đặt sai bạn sửa được trong hai cú nhấp. Nhưng đó vẫn là một đánh đổi, không phải bữa trưa miễn phí.

Danh sách rút gọn trên menu bar là 11 ngôn ngữ, không phải 25. Nếu cặp ngôn ngữ hằng ngày của bạn có, chẳng hạn, tiếng Phần Lan hay tiếng Hy Lạp, bạn sẽ phải vào Settings cho một bên của cặp đó. Tuyển chọn nghĩa là ngôn ngữ của ai đó không lọt vào menu nhanh.

Chuyện này đưa lời than về đâu

Lời than ở tầm cả nhóm sản phẩm — “bản đọc chính tả của tôi cứ ra sai ngôn ngữ” — thật ra là lời than về những quyết định âm thầm. Model đã đoán, phỏng đoán sai, và chẳng có cách nào bảo nó khác đi. Mọi cách chữa mà vẫn giữ việc đoán (nhận diện tốt hơn, cửa sổ âm thanh dài hơn, ngưỡng độ tin cậy) chỉ làm cho kiểu hỏng hiếm hơn và kỳ lạ hơn. Cách chữa thật sự chấm dứt lời than là trả quyết định lại cho người dùng.

Nếu bạn đang sống với chuyện này ở một công cụ khác, các trang so sánh của chúng tôi nói trung thực về chỗ đứng của từng công cụ — Keebye vs SuperwhisperKeebye vs Wispr Flow đều nói về câu hỏi ngôn ngữ bên cạnh những thứ khác. Để tự thử cái ghim, hãy bắt đầu bản dùng thử miễn phí bên dưới, đọc lại câu tiếng Rumani hay tiếng Ba Lan ở đầu bài này, và xem bao nhiêu phần của sự dao động đó đến từ một phỏng đoán vô kiểm soát chứ không phải từ accent của bạn.

Ghim đúng ngôn ngữ bạn thật sự dùng

Bắt đầu bản dùng thử miễn phí và đọc lại một câu trả lời bằng tiếng mẹ đẻ mà việc tự động nhận diện từng làm hỏng.

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