Máy nói theo văn bản - Text to speech (Phần1)

10:19, 12/10/2021

Được sự đồng ý của Tác giả, Toà soạn CN&DS xin đăng lại bài viết Chuyên gia về Text-To-Speed.

Hôm nay chúng ta đàm đạo về “máy nói”, nhưng chỉ giới hạn trong khuôn khổ là “máy nói theo văn bản” (text-to-speech: TTS). Nghĩa là chúng ta không đi quá xa về “máy nói” kiểu như: người đối thoại với máy, người hỏi – máy trả lời, “máy diễn thuyết”,… Chỉ đơn giản là cho một đoạn văn bản và xin mời “máy đọc đoạn văn bản đấy thành lời”. Tất nhiên, trước hết máy phải đọc đúng, đọc rõ, sau nữa đọc càng hay thì càng tốt.

ⓐ Quy trình

Một cách giản lược, chúng ta có thể hình dung quy trình biến đổi “văn bản-thành-giọng nói” như sau:

  • Giả thiết chúng ta có một đoạn văn bản. Đoạn văn bản này có thể chứa các con số hoặc từ viết tắt. Nếu có con số hoặc từ viết tắt thì trước hết chúng ta phải biến chúng thành “lời”. Ví dụ, “12” thành “mười hai”; “TW” thành “trung ương”. (Công đoạn này gọi là “chuẩn hóa văn bản” — text normalization)

  • Tiếp theo, người ta tách văn bản thành từng từ, phiên âm từng từ và phối các phiên âm thành các đoạn có ngữ điệu, ví dụ: cụm từ, mệnh đề, câu văn. Đến đây, đoạn văn bản được biến thành một dãy các đoạn mã phiên âm — phonetic transcription. (Công đoạn này gọi là “chuyển đổi văn bản thành phiên âm” — text-to-phoneme)

  • Căn cứ vào đoạn mã phiên âm, người ta cho phát ra thành âm thanh, ra loa. (Công đoạn này gọi là “bộ tổng hợp” — synthesizer)

🗎→🔈

ⓑ Giải pháp

Tiếp theo, chúng ta bàn chi tiết hơn các giải pháp cho “text-to-speech”. Khi nói đến các giải pháp TTS, người ta thường quan tâm đến 2 yêu cầu rất cơ bản về chất lượng. Đó là:

  • Dễ hiểu (intelligibility): chúng ta phải hiểu được “máy nói” một cách dễ dàng. “Dễ hiểu” ở đây không có ý về ngữ nghĩa câu văn mà là phát âm nghe dễ hiểu.

  • Tính tự nhiên (naturalness): “máy nói” giống như người nói.

Có rất nhiều cách để biến “văn bản-thành-giọng nói”. Dưới góc độ các giải pháp “kinh điển”, xin bàn về 2 cách tiếp cận: ghép âm và máy tự tạo giọng nói.

➡ Ghép âm (concatenation synthesis)
Phương thức tổng hợp này là ghép (xâu chuỗi) các đoạn “người nói” đã được ghi âm lại với nhau. Cách này rõ ràng là đạt được mức độ tự nhiên cao. Tuy nhiên sự biến thiên trong giọng nói của đoạn trước không dễ gì khớp với sự biến thiên trong đoạn tiếp theo ngay sau đó nên thường xảy ra hiện tượng “lệch sóng” giữa 2 đoạn liền nhau. Cùng chung cách ghép âm, có 3 cách tiếp cận.

1. Tuyển chọn đơn nguyên âm thanh
(Unit selection synthesis)

  • Theo cách này, đầu tiên người ta thiết lập một cơ sở dữ liệu (CSDL) về “lời nói” được ghi âm. Trong quá trình thiết lập CSDL, mỗi một câu nói được tách ra thành các “đơn nguyên” (đơn vị phát âm). Các “đơn nguyên” có thể là đơn âm (phone), cặp âm (diphone), bán âm (half-phone), âm tiết (syllable), hình vị (morpheme), từ (word), cụm từ (phrase), câu (sentence). Mỗi một bản ghi của CSDL còn có một số thuộc tính khác đi kèm như âm độ (pitch), thời lượng, vị trí của âm tiết, các âm vị trước, sau âm tiết. Ngoài phần ghi âm, người ta còn lưu sóng và phổ của phần ghi âm để có thể dễ dàng khảo sát đoạn ghi âm bằng đồ thị.

  • Làm thế nào để chuyển đổi văn bản thành giọng nói? Cách làm: bộ tổng hợp (synthesizer) chia đoạn văn bản thành các “đơn nguyên”. Mỗi một “đơn nguyên” phải tương ứng với một bản ghi trong CSDL nói trên. Sau khi thay các “đơn nguyên” bằng các đoạn ghi âm, kết quả là đoạn văn bản được chuyển thành một chuỗi các các đoạn ghi âm nối tiếp nhau được lấy ra từ CSDL. Việc của máy là cho “phát thanh” chuỗi các các đoạn ghi âm này.

  • Ở trên, tôi chưa đề cập đến thuật toán chuyển văn bản thành chuỗi “đơn nguyên”. Một văn bản có thể chuyển thành rất nhiều chuỗi “đơn nguyên” khác nhau. Nghĩa là có rất nhiều chuỗi “đơn nguyên” khác nhau cùng “nói” một đoạn văn bản. Vậy chuỗi nào là tối ưu? Để biết được chuỗi nào là tối ưu người ta căn cứ vào hàm đánh giá (cost function). Chuỗi nào có tổng “giá” thấp nhất, chuỗi đó là tối ưu.

  • Về mặt nguyên tắc, cách tiếp cận này đạt độ tự nhiên cao nhất, vì các đoạn ghi âm trong CSDL là ghi lời nói của người thật. Tuy nhiên, chúng ta vẫn phải tính đến vấn đề khớp nối giữa 2 đoạn ghi âm. Chú ý rằng, đây là khớp nối giữa 2 đoạn sóng phát âm. Trong thực tế, biên độ cuối của đoạn sóng đứng đằng trước (của “đơn nguyên” trước) thường sẽ không khớp với biên độ đầu của đoạn sóng tiếp theo (của “đơn nguyên” sau). Đây là hiện tượng xô lệch âm thanh. Vì vậy, vẫn phải cần có sự can thiệp của xử lý tín hiệu số (digital signal processing - DSP) nhằm làm mịn đoạn sóng ở chỗ khớp nối – tức là giảm thiểu mức xô lệch âm thanh. Chúng ta cũng lưu ý rằng càng có nhiều DSP thì mức độ tự nhiên càng giảm. Muốn DSP ít can thiệp thì CSDL cần có các đơn nguyên dài hơn, ghi âm bằng lời nói tự nhiên, để tránh hiện tượng xô lệch âm thanh. Khi thêm các đơn nguyên dài như vậy, CSDL phải rất lớn và hàm đánh giá (cost function) chạy chậm hơn. Tham khảo ở đây

2. Cặp âm
(Diphone synthesis)

  • Trước khi bàn đến cách tiếp cận này, chúng ta tìm hiểu qua khái niệm về cặp âm (diphone)? Trong ngữ âm, diphone là cặp đơn âm đi liên kề nhau khi phát âm. Ví dụ, từ diphone, trong tiếng Anh, khi phiên âm chúng ta được: [daɪfəʊn]. Dưới góc độ cặp âm, đoạn phiên âm [daɪfəʊn] gồm các cặp âm sau: [da], [aɪ], [ɪf], [fə], [əʊ], [ʊn].

  • Trở lại với phương pháp tiếp cận. Đối với một ngôn ngữ, người ta thiết lập một CSDL gồm tất cả các cặp âm (diphone) có thể có. Về mặt nguyên tắc, nếu ngôn ngữ đó có P đơn âm thì sẽ có P2 cặp âm. Tuy nhiên, trên thực tế không phải cặp đơn âm nào cũng đi liền với nhau được. Ví dụ, tiếng Tây Ban Nha có 800 cặp âm, còn tiếng Đức có 2.500 cặp âm.

  • Lại nói về việc phân tích văn bản thành phát âm. Chúng ta thấy, một từ bất kỳ trong ngôn ngữ, khi phiên âm, là một chuỗi ghép của các cặp âm (diphone). Người ta chia đoạn văn bản thành từng câu. Và câu là tổ hợp của các từ. Kết quả là, khi phiên âm, đoạn văn bản biến thành một chuỗi các cặp âm.

  • Chú ý rằng các cặp âm “chồng lên nhau” (overlap). Trong ví dụ về phiên âm từ diphone thì cặp [da] chồng lên cặp [aɪ], cặp [aɪ] lại chồng lên cặp [ɪf], … Vì vậy, để ghép các cặp âm, người ta cần đến các thuật toán xử lý tín hiệu số (DSP) như PSOLA (Pitch Synchronous Overlap and Add), MBROLA (Multi-Band Resynthesis OverLap Add). Trong thực tế, giải pháp diphone synthesis về mặt thương mại không hấp dẫn, chủ yếu chỉ để dùng trong nghiên cứu.

3. Theo lĩnh vực cụ thể
(Domain-specific synthesis)

  • Cách làm của phương pháp này là ghép các từ (hoặc cụm từ) được thu âm từ trước. Có vẻ như cách tiếp cận này giống với tuyển chọn đơn nguyên âm thanh (unit selection synthesis)? Đúng, về mặt nguyên tắc là giống nhau. Tuy nhiên, do số từ (cụm từ) rất ít (cỡ vài chục đơn nguyên) nên thuật toán ghép không cần hàm đánh giá mục tiêu và không cần thuật toán tìm chuỗi tối ưu.

  • Khác với 2 phương pháp 1. và 2., cách ghép này không bị hiện tượng xô lệch âm thanh hay hiện tượng chồng âm: có một khoảng lặng ngắn giữa 2 từ (cụm từ).

  • Dùng ở đâu? Ở các phòng đợi xếp hàng chờ đến lượt (ngân hàng, phòng khám), thông báo tàu, xe hay thông báo ở trong các thang máy,…

➡ Máy tự tạo giọng nói
(formant synthesis / parametric TTS)

  • Cách tiếp cận này không sử dụng tiếng người mà giọng nói được tạo ra từ máy (artificial speech). Căn cứ vào các tham số của phát âm (như tần số cơ bản, dao động tuần hoàn của ngữ âm, thời lượng,…) máy tự tạo ra sóng âm thanh với “âm tiếng nói bằng máy” tương ứng. Phương pháp này còn được gọi là bộ tổng hợp dựa trên quy tắc (rules-based synthesis).

  • Cách tiếp cận này tất nhiên cho kết quả “thiếu tự nhiên”. Bằng máy mà (tiếng nói được tạo ra từ các công thức toán học), chả tự nhiên tý nào! 😊 Bù lại, người ta đánh giá giải pháp này “nghe được”, ngay cả khi “máy nói” nhanh. Người ta có thể điều chỉnh tốc độ nói, âm thanh cao thấp bằng cách thay đổi tham số. Ngoài ra, phần mềm tương đối nhẹ, cần rất ít bộ nhớ và có thể dễ dàng “nhúng” vào các hệ thống tự động hóa. Chúng ta có thể lập trình được “máy nói” theo ý muốn: nhịp điệu, thanh sắc, … Tham khảo ở đây

🗎→🔈

ⓒ Đo chất lượng mô hình

  • Bây giờ chúng ta bàn đến cách đo chất lượng mô hình. Khi nghiên cứu một vấn đề nào đó, cộng đồng nghiên cứu thường đề xuất các thước đo chất lượng. Thước đo này giúp chúng ta đánh giá một giải pháp nào đó tốt đến mức độ nào. Lấy ví dụ. Trong dịch máy (Machine Translation), chúng ta có thước đo BLEU. Giải pháp nào đạt BLEU cao là giải pháp đó tốt. Trong nghiên cứu “speech-to-text”, chúng ta có thước đo WER. Giải pháp nào có WER nhỏ thì giải pháp đó tốt. Các thước đo BLEU và WER có một tính chất rất quan trọng: đây là các thước đo khách quan (objective). Nghĩa là không có một tổ chức hay cá nhân nào đứng ra đo, mà thước đo này có công thức, có cách tính tự động: máy đo.

  • Thế còn đối với vấn đề “text-to-speech” thì thế nào? Rất đáng tiếc là cho đến thời điểm hiện nay, chưa ai đề xuất ra được thước đo khách quan nào cả. Nghĩa là chưa có một công thức hay cách tính tự động bằng máy, máy “nghe thử” và cho kết quả đánh giá. Như vậy, chỉ còn cách duy nhất là cần đến con người để đánh giá chất lượng. Đây là thước đo chủ quan (subjective).

  • Vấn đề còn lại là tổ chức như thế nào để “thuê” được nhóm người đánh giá chất lượng kết quả nghiên cứu một cách “không thiên kiến”, “không bị tác động lẫn nhau”? “Không thiên kiến” nghĩa là người đánh giá không biết sản phẩm nghiên cứu đấy là của ai, của công ty nào. “Không bị tác động lẫn nhau” nghĩa là nhóm người đánh giá không biết nhau. Trả lời cho câu hỏi này, tôi thấy phần lớn các công ty công nghệ tổ chức thuê ngoài theo mô hình có tên gọi là Amazon Mechanical Turk (MTurk). Đây là một hình thức thuộc dòng crowdsource (nguồn cộng đồng), crowdworker (lao động cộng đồng). Mô hình này do Jeff Bezos, ông chủ của Amazon đề xướng. Đại ý là người ta thuê ngoài “lao động cộng đồng” thông qua một giao diện (Application Programming Interface - API) trên mạng Internet. Người “lao động cộng đồng” chỉ biết đến giao diện và không biết nhau.

  • Gốc của cụm từ Mechanical Turk: là máy cơ khí chơi cờ vua tự động – máy có thể chơi cờ vua với người (từ năm 1770 đến năm 1854). Thực tế đây chỉ là trò bịp, vì nấp đằng sau máy vẫn là một người thật. Có lẽ vì vậy mà Jeff Bezos đã lấy cụm từ này, vì đằng sau giao diện (tưởng như là tự động) vẫn là con người.

  • Trong trường hợp đo chất lượng synthesizer, người ta yêu cầu đánh giá chất lượng theo 5 mức: 5—Excellent; 4—Good; 3—Fair; 2—Poor; 1—Bad.

  • Giả thiết người ta thuê N người đánh giá, và có kết quả lần lượt là R1, R2, …, RN. Từ đó, người ta tính ra điểm số trải nghiệm bình quân (Mean Opinion Score) viết tắt là MOS: MOS = (R1 + R2 + … + RN)/N. Như vậy, MOS đạt tối đa là 5.0 và tối thiểu là 1.0. Thước đo MOS vẫn còn nhiều tranh luận, nhưng có lẽ chúng ta khỏi tốn thời gian vào các tranh luận này.

⚠ Khi đọc các bài báo về “text-to-speech”, chúng ta thường thấy người ta đánh giá mô hình thông qua điểm MOS. Nếu điểm MOS đạt trên 4.3 là rất tốt rồi đấy!

🗎→🔈

ⓓ Khái niệm vocoder

  • Vocoder là ghép của phần đầu từ voice với phần đuôi từ encoder – tạm dịch nghĩa là bộ mã hóa giọng nói. Đặt trong tổng thể của synthesizer thì vocoder chính là “phát thanh” của synthesizer. Quan trọng hơn, chất lượng của vocoder gần như quyết định của chất lượng của synthesizer.

  • Gốc của vocoder là mã hóa nguồn phát, truyền phần mã hóa đó qua đường truyền viễn thông và đầu nhận thông tin đường truyền có trách nhiệm giải mã tín hiệu nhận được và phát ra loa. (Vocoder được Homer Dudley tại Bell Labs phát minh vào năm 1938) Bạn nếu có ai tò mò về nguyên lý của vocoder thì tham khảo đường link tôi đã dẫn ở trên.

  • Bàn thêm về ngôn từ. Trong bài nhàn đàm này, chúng ta thống nhất coi vocoder là phát thanh của synthesizer. Và chúng ta dùng luôn từ vocoder, khỏi phải dịch sang tiếng Việt (Theo quan điểm của tôi, nhiều từ chúng ta nên chấp nhận để nguyên gốc tiếng Anh, chấp nhận “nhập khẩu” một số từ. Lý do: nếu chúng ta cứ cố ép phải dịch thì kết quả là, trong nhiều trường hợp, bản dịch thường khó hiểu và tệ hại hơn, thậm chí còn bị hiểu nhầm. Mà ngay như từ “vocoder” cũng không có trong từ điển Anh-Anh đâu).

🗎→🔈
(còn nữa)

ThS. Lê Văn Lợi