Xây app tốt hơn Elsa trong 1 tuần

Nếu đã từng cố gắng cải thiện phát âm ngoại ngữ của mình, bạn có lẽ đã quen thuộc với những ứng dụng như Duolingo hay ELSA Speak. Đây là những sản phẩm khá tốt được phát triển bởi các đội ngũ chuyên gia và kỹ sư hùng hậu. Bạn nói vào điện thoại, một giao diện trực quan hiện lên và bôi màu các lỗi sai để đưa ra phản hồi về phát âm.

Nhưng là một kỹ sư và là người học ngoại ngữ, mình vẫn chưa cảm thấy hài lòng. Phản hồi phát âm của Duolingo còn khá hời hợt: chỉ đơn thuần là bôi đỏ hoặc xanh lá mà không hề có giải thích về ngữ âm. ELSA Speak cung cấp phân tích chi tiết ở cấp độ âm tố (phoneme), nhưng tính năng này lại bị thu phí. Mình muốn một thứ khác biệt hơn: một công cụ mã nguồn mở, hiểu rõ đặc thù tiếng mẹ đẻ (L1-aware) mà tôi có thể tự chạy riêng tư, tự tìm hiểu sâu và tự do tùy biến.

Hơn thế nữa, ngay cả hơn 6.000 bài học của ELSA hay các cuộc hội thoại trả phí với AI trên Duolingo Max đều tuân theo các kịch bản định sẵn, nếu bạn muốn luyện tập chính bài nháp thuyết trình của mình hay một câu nói cụ thể phục vụ công việc, bạn hoàn toàn không có lựa chọn nào khác.

Mình cần một công cụ cho phép mình kiểm tra bất kỳ câu tùy chỉnh nào mình chọn, hiển thị phản hồi ngữ âm chính xác, trong khi vẫn chạy hoàn toàn dưới sự kiểm soát của mình.


Giao diện Gradio GUI của vienounce-core

Điều thú vị là trong dự án này là mình có thể xây dựng một công cụ nhận dạng giọng nói ngữ âm (phonetic ASR) tiệm cận cấp độ thương mại mà không cần thu thập một dữ liệu mẫu nào, và chỉ mất vỏn vẹn 2 giờ huấn luyện trên GPU T4 / 1 giờ trên GPU A10G không máy chủ (hoàn toàn nằm trong gói sử dụng thử miễn phí của Modal).

Mình không dám tuyên bố mô hình của mình đạt độ chính xác tuyệt đối như các tập dữ liệu độc quyền của ELSA, nhưng để tự học và luyện tập thực tế, nó hoạt động cực kỳ chính xác, trực quan và chi phí xây dựng gần như bằng không.

Đây là câu chuyện về cách mình xây dựng Lingue, một ứng dụng Web được vận hành bởi vienounce-core, vào thời gian rảnh ngoài giờ, trong 1 tuần.


Định kiến ẩn sâu trong các mô hình ASR

Mục tiêu của mình là xây dựng một công cụ có thể phát hiện các lỗi chuyển di ngôn ngữ (L1 transfer) — thói quen tự nhiên của người bản xứ nói tiếng Việt khi mang các quy tắc ngữ âm tiếng mẹ đẻ vào tiếng Anh (ví dụ như nuốt phụ âm chặn cuối /k, t, p/ hoặc bỏ quên các âm gió /s, z/).

Mình bắt đầu với một bộ công cụ gọn nhẹ, ưu tiên chạy offline:

  1. sea-g2p: Bộ chuyển đổi chữ viết sang âm vị song ngữ để ánh xạ văn bản tiếng Anh sang ký tự IPA.
  2. Wav2Vec2 Forced Aligner: Mô hình Wav2Vec2 đã huấn luyện sẵn (facebook/wav2vec2-xlsr-53-espeak-cv-ft) để căn khớp các khung âm thanh của người dùng với các âm vị mục tiêu và tính toán điểm chuẩn phát âm (GOP).

Hệ thống chạy rất nhanh trên CPU, nhưng khi chạy thử giọng của người bản xứ nói tiếng Anh qua pipeline cơ bản này, điểm số trung bình mà nó chấm cho họ chỉ đạt 84.3%. Lý do là mô hình đã phạt oan các phát âm chuẩn của người bản xứ do sự trùng lặp từ vựng ngữ âm (các va chạm chỉ số modulo-60 trên các âm vị như /ɹ/ và /ŋ/).

Nếu một người nói tiếng bản xứ còn không đạt nổi điểm A, hệ thống chấm điểm chắc chắn đã có lỗi. Tôi bắt buộc phải cải tiến.


Cải tiến 1: Hiệu chỉnh động GOP

Không cần một đội ngũ nhà ngôn ngữ học hay một kho ngữ liệu giọng nói độc quyền trong tay, mình chỉ tận dụng tập dữ liệu công khai của người Việt nói tiếng Anh L2-ARCTIC (vuihocrnd/l2-arctic-cleaned).

Mặc dù dự án này cần rất ít tài nguyên GPU để huấn luyện, mình vẫn chọn sử dụng Modal, một nền tảng GPU không máy chủ. Chỉ trong một phiên chạy kéo dài 2 giờ trên GPU T4 (chi phí gần như bằng không nhờ gói sử dụng thử miễn phí), mình đã thực hiện các tối ưu hóa tìm kiếm lưới (grid-search) để tính toán các tham số hồi quy đặc thù cho từng nhóm âm, nhằm ánh xạ xác suất thô sang các khung điểm đã được hiệu chỉnh.

Bằng việc áp dụng các mức bù trừ riêng cho từng nhóm âm và giới hạn các phân phối ngoại lai, tôi đã nâng điểm của người bản xứ lên mức thực tế là 95.7% và mở rộng biên độ phân tách giữa phát âm đúng và sai từ 1.07 lên 1.96.


Cải tiến 2: Nâng cao độ chính xác

Sau khi bộ chấm điểm thô được hiệu chỉnh, minhf vấp phải một giới hạn cấu trúc lớn khác: va chạm ngữ âm (phonetic collisions) ở lớp classification head của mô hình.

Trong những giai đoạn đầu prototype, mìnhuốn giữ cho mô hình gọn nhẹ nhất có thể. Để giảm thiểu độ phức tạp của mô hình, mình chọn số classification head là 60 lớp đầu ra chỉ để nhanh chóng chạy thử pipeline huấn luyện.

Để ánh xạ từ vựng espeak tiêu chuẩn của Wav2Vec2 (vốn có 392 token độc nhất) vào đầu ra 60 lớp này, mình đã chọn một đường tắt là chia lấy dư modulo-60 (token_id % 60).

Đường tắt này giúp bản thử nghiệm chạy được, nhưng nó lại là một quả bom nổ chậm. Cách bao gói này gây ra lỗi nghiêm trọng khi các âm tố hoàn toàn không liên quan (như nguyên âm /aʊ/ và phụ âm /d/) bị ánh xạ chung vào cùng một chỉ số phân loại. Kết quả là những phát âm chuẩn xác của người dùng liên tục bị phạt oan vì âm mục tiêu bị chồng chéo với âm tố khác. Mình đã thử code bù trừ thủ công (cộng điểm offset tĩnh +10.0 vào log-probabilities thô) để monkey-patch nó, nhưng rõ ràng, sự đơn giản ban đầu đã biến thành một technical debt nặng nề.

Mình quyết định thiết kế lại classification head của PhoneticASRModel, mở rộng nó từ 60 lớp lên toàn bộ 392 âm tố độc nhất của từ vựng espeak.

Thay đổi này loại bỏ hoàn toàn lỗi va chạm token. Lần đầu tiên, mô hình có thể phân biệt và căn biên một cách tự nhiên các âm tố nhạy cảm như /ɹ/ (chỉ số 27) và /ɫ/ (chỉ số 175) mà không bị chồng lấn. Việc mở rộng cấu trúc này đã mang lại một bước nhảy vọt về độ chính xác: trên tập kiểm thử L2-ARCTIC, độ phủ phát hiện lỗi thực tế (Recall) đã tăng từ 28.9% lên 40.3%, giúp hệ thống bắt trúng các lỗi nuốt phụ âm cuối hoặc phát âm sai âm lướt mà mô hình cơ bản trước đó hoàn toàn bỏ sót.

Mô hình hoạt động tốt hơn hẳn sau khi tinh chỉnh, với độ phủ (Khả năng phát hiện lỗi thực tế) khoảng 40.3%

Bài học

Việc xây dựng ứng dụng này cho chúng ta thấy rằng không còn cần đến ngân sách khổng lồ của các tập đoàn lớn để tạo ra những công cụ giáo dục tiên tiến nữa. Bằng cách đứng trên vai những người khổng lồ mã nguồn mở (Wav2Vec2, Kokoro, VieNeu-TTS) và tận dụng cơ sở hạ tầng đám mây không máy chủ, một nhà phát triển độc lập hoàn toàn có thể thiết kế một huấn luyện viên phát âm riêng tư, có khả năng tùy biến cao.

Trong một dự án cuối tuần, mình đã tạo ra một công cụ mang lại:

  1. Tự do nhập liệu: Khả năng nhập và kiểm tra bất kỳ câu nào bạn tự chọn.
  2. Trực quan hóa rõ ràng: Hiển thị nổi bật lỗi sai ở cấp độ âm tố theo thời gian thực.
  3. Tương phản âm học: Các âm thanh tham chiếu song song (Dual-track TTS) để bạn thực sự nghe và nhận biết sự khác biệt.

Khám phá công cụ mã nguồn mở này tạigithub.com/phuocnguyen90/vienounce-core và tự khởi chạy giao diện GUI cục bộ trên máy tính của bạn.


Giao diện web/mobile app Lingue, coming soon. Xem bản thử nghiệm open beta

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *