Vì sao giọng đọc văn bản khác nhau theo thiết bị

Cùng đoạn văn nhưng nghe khác trên Mac, Windows, Android hay Chrome: giọng đọc từ đâu ra, giọng nào chạy trực tuyến, cách thêm tiếng Việt.

Trong bài này

Dán cùng một đoạn văn vào trang đọc văn bản trên hai máy tính, bạn có thể nhận được hai giọng khác nhau, hai danh sách ngôn ngữ khác nhau, và trên một máy có khi không có tiếng Việt. Đó không phải lỗi của trang. Các trang đọc văn bản trong trình duyệt dùng Web Speech API, và API này không kèm giọng đọc riêng: nó hỏi thiết bị. Bài này giải thích giọng đọc đến từ đâu, giọng "trực tuyến" ảnh hưởng thế nào tới quyền riêng tư, vì sao việc tô sáng từ và đọc văn bản dài khác nhau giữa các giọng, và cách thêm ngôn ngữ còn thiếu. Mọi điều ở đây áp dụng cho công cụ chuyển văn bản thành giọng nói trên trang này.

Trình duyệt cho trang mượn giọng đọc

Trong Web Speech API, trang gọi speechSynthesis.getVoices() và nhận danh sách giọng, mỗi giọng có tên, mã ngôn ngữ như vi-VN và vài cờ. Đặc tả cho biết danh sách này có thể rỗng khi "danh sách giọng chưa được biết", và trình duyệt phát sự kiện voiceschanged khi nó thay đổi. Chrome nói riêng thường điền danh sách một lúc sau khi trang tải xong, nên công cụ chỉ đọc danh sách một lần có thể không thấy giọng nào. Công cụ chuyển văn bản thành giọng nói lắng nghe sự kiện đó và điền menu khi giọng đọc xuất hiện.

Giọng đọc đến từ đâu?

  • macOS và iOS có danh sách giọng hệ thống dài, có cả tiếng Việt, và nhiều giọng chất lượng cao hơn cần tải về trước trong mục Nội dung được đọc của phần Trợ năng.
  • Windows có sẵn vài giọng và thêm giọng qua các gói giọng nói tùy chọn, trong Cài đặt, mục Thời gian và ngôn ngữ, rồi Giọng nói.
  • Chrome trên máy tính thêm bộ giọng riêng tên "Google …", được tổng hợp trực tuyến.
  • Edge thêm các giọng Microsoft tên "… Online (Natural)", cũng tổng hợp trực tuyến.
  • Android dùng bộ đọc văn bản đang cài cùng các ngôn ngữ đã tải.

Vậy "Linh" trên Mac, "Microsoft An" trên Windows và một giọng Google trong Chrome là ba bộ máy khác nhau tình cờ đọc cùng một câu.

Trên máy hay trực tuyến: cờ localService

Mỗi giọng có cờ localService. MDN mô tả cờ này là true khi giọng do bộ tổng hợp trên máy cung cấp và false khi đến từ dịch vụ từ xa, đồng thời lưu ý giọng từ xa có thể chậm hơn, tốn băng thông hoặc chi phí. Giọng từ xa nghĩa là văn bản được gửi tới dịch vụ đó để chuyển thành âm thanh. Đặc tả nói thêm rằng cờ này không hứa hẹn gì về chất lượng hay giá cả.

Công cụ hiển thị điều này trong danh sách giọng là trên máy hoặc trực tuyến. Với hợp đồng, ghi chú khám bệnh hay bất cứ gì riêng tư, hãy chọn giọng trên máy; văn bản khi đó không rời khỏi máy tính hay điện thoại.

Tô sáng từ đang đọc

Khi đọc, giọng có thể phát sự kiện boundary ở ranh giới từ và câu, mỗi sự kiện kèm charIndex: vị trí trong văn bản nơi từ bắt đầu. Đặc tả ghi rằng khi bộ đọc không cung cấp được vị trí thì giá trị là 0. MDN cũng đánh dấu sự kiện boundary là chưa được hỗ trợ rộng rãi. Thực tế, nhiều giọng trên máy báo từng từ, còn một số giọng trực tuyến không báo gì hữu ích, khi đó không thể tô sáng. Công cụ sẽ báo cho bạn thay vì tô sáng sai từ.

Có một chi tiết quan trọng với tiếng Việt. charIndex đếm theo đơn vị mã UTF-16, không theo chữ cái. Chữ "Việt" gõ bằng ký tự dựng sẵn dài 4 đơn vị, nhưng cùng chữ đó ở dạng tổ hợp (chữ e, rồi dấu nặng, rồi dấu mũ là các dấu kết hợp riêng) dài 6. Công cụ tìm cả từ quanh vị trí được báo, tính cả dấu kết hợp, nên tô sáng vẫn đúng chữ "Việt" ở cả hai dạng. Trong câu "Xin chào, Việt Nam!", ranh giới ở vị trí 10 sẽ tô sáng ký tự 10 đến 14: Việt.

Văn bản dài và giọng đọc tự dừng

Đặc tả cho phép bộ đọc giới hạn độ dài một lượt đọc và lấy ví dụ 32.767 ký tự. Bộ đọc thực tế có thể hỏng sớm hơn nhiều. Ghi chú tương thích của Chrome cho biết trên một số nền tảng việc đọc dừng sau khoảng 15 giây, và các lập trình viên đã lần ra hiện tượng khựng khi đọc văn bản dài là do giọng Google trực tuyến của Chrome: API vẫn báo đang đọc nhưng không nghe thấy gì.

Cách khắc phục phổ biến là đưa cho bộ đọc từng đoạn ngắn. Công cụ chia văn bản thành các phần tối đa 220 ký tự, ngắt ở cuối câu khi có thể. Một đoạn văn 396 ký tự gồm bốn câu dài 43, 56, 132 và 165 ký tự thành ba phần: hai câu đầu ghép lại (99 ký tự), rồi 132, rồi 165. Hai câu đầu vừa một phần; thêm câu thứ ba sẽ thành 231 ký tự, vượt giới hạn, nên câu đó sang phần mới. Mỗi phần giữ vị trí trong văn bản gốc, nên tô sáng vẫn chính xác.

Vì sao không tải âm thanh về được

Trình duyệt phát giọng đọc thẳng ra loa. Web Speech API không cho trang truy cập âm thanh đó, nên không trang nào dùng API này có thể trung thực cung cấp nút "lưu thành MP3". Các trang có nút tải về đều tổng hợp trên máy chủ của họ, nghĩa là văn bản của bạn bị gửi lên đó. Nếu cần tệp, hãy tự đọc và thu bằng máy ghi âm rồi cắt gọn bằng công cụ cắt âm thanh.

Những lỗi thường gặp

  1. Nghĩ rằng thiếu ngôn ngữ là do trang không hỗ trợ. Thực ra thiết bị chưa có giọng đó. Hãy cài trong cài đặt hệ thống rồi tải lại trang.
  2. Đọc văn bản riêng tư bằng giọng trực tuyến. Hãy chọn giọng ghi trên máy.
  3. Đọc tiếng Việt bằng giọng tiếng Anh. Số, ngày tháng và chữ viết tắt được đọc theo ngôn ngữ của giọng: "1.000" là một nghìn với tiếng Việt nhưng là một với tiếng Anh.
  4. Dán cả chương vào công cụ gửi đi một lượt. Một số giọng âm thầm dừng; chia nhỏ sẽ tránh được.
  5. Đọc danh sách giọng một lần khi tải trang. Lúc đó danh sách có thể còn rỗng; hãy chờ voiceschanged.

Thử ngay

Mở công cụ chuyển văn bản thành giọng nói, dán văn bản, chọn ngôn ngữ và giọng rồi bấm Đọc to. Để bỏ các ngắt dòng khiến giọng đọc ngừng ở chỗ lạ, hãy xử lý văn bản bằng bộ công cụ văn bản trước.

Công cụ được nhắc trong bài

Về trang blog