Đồ án tốt nghiệp nhận dạng tiếng nói tiếng việt (speech to text) cho người có khuyết tật về giọng nói sử dụng mạng nơron (neural network) mô hình học sâu (deep learning).Đồ án này nhằm mục đích áp dụng các phương pháp học sâu thử nghiệm xâydựng hệ nhận dạng tiếng nói tiếng Việt hỗ trợ người khuyết tật giọng nói, giúpgiải quyết các vấn đề khuyết điểm của người khuyết tật giọng nói ở Việt Nam.
MỘT SỐ KIẾN THỨC LIÊN QUAN
Một số vấn đề xử lý dữ liệu âm thanh
Đọc dữ liệu từ file âm thanh
Âm thanh mà chúng ta nghe trên máy tính và điện thoại thường được lưu trữ dưới các định dạng như mp3 hoặc m4a, nhưng những định dạng này chỉ là cách biểu diễn âm thanh chứ không phải là âm thanh thực tế Âm thanh được thể hiện dưới dạng sóng với hai trục: trục 𝑥 biểu diễn thời gian và trục 𝑦 biểu diễn biên độ Tại mỗi thời điểm 𝑡, có một giá trị biên độ xác định, như được minh họa trong hình ảnh biểu diễn âm thanh của phát âm “mười sáu”.
Hình 2.1 Một sóng âm thanh của phát âm “mười sáu”
Để đọc các file âm thanh định dạng wav trong Python, chúng ta có thể sử dụng thư viện Librosa Sau khi đọc file wav, chúng ta nhận được một mảng số liệu, ví dụ như khi đọc một file âm thanh dài 1 giây với tỷ lệ lấy mẫu 16000 Hz cho phát âm "mười sáu", kết quả là: array([ 0.06896514, 0.1007529 , 0.08946026, , -0.09958471, -0.10146017, -0.11512566], dtype=float32).
Các giá trị này biểu diễn cho trục 𝑦 của sóng, tức là biên độ Còn trục 𝑥 chính là chiều dài của mảng Trong trường hợp này sẽ là 16000
Tỷ lệ lấy mẫu (Sampling rate)
Tỷ lệ lấy mẫu là số lượng mẫu thu thập trong một giây, được biểu diễn dưới dạng số liệu số Ví dụ, tỷ lệ lấy mẫu 16000 Hz có nghĩa là 16000 mẫu được thu thập mỗi giây Tỷ lệ lấy mẫu cao giúp giảm thiểu mất mát thông tin, tuy nhiên, điều này cũng đồng nghĩa với việc tăng yêu cầu về lưu trữ dữ liệu âm thanh.
Một đoạn sóng âm thanh có độ dài 1 giây ở dạng analog có các giá trị biên độ cho mọi thời điểm, với mỗi giá trị tương ứng với mỗi pico giây, dẫn đến tổng cộng 1 triệu giá trị Để lưu trữ các giá trị này trong máy tính, kiểu dữ liệu float cần 4 bytes cho mỗi giá trị.
Để lưu trữ một âm thanh dài 1 giây, cần khoảng 4 𝑒 + 12 * 4 bytes, tương đương hơn 3.5 terabytes Do đó, việc chuyển đổi sóng âm thanh sang dạng số hóa là cần thiết Hình 2.2 minh họa sự khác biệt giữa sóng âm thanh ở hai dạng Analog và Digital.
Hình 2.2 Minh họa sóng dưới dạng Analog và Digital Nguồn [14]
Tỷ lệ lấy mẫu mặc định thường là 22050 Hz, vì con người có khả năng nghe tần số từ 20 Hz đến 20 kHz Tuy nhiên, trong nhận dạng giọng nói, tỷ lệ lấy mẫu 16000 Hz là đủ để đảm bảo chất lượng âm thanh.
Mạng nơ-ron (Neural Network)
Neural network, hay mạng nơ-ron, là một hệ thống tính toán được phát triển dựa trên cách hoạt động của các nơ-ron trong hệ thần kinh Các nơ-ron, là thành phần chính của bộ não, có vai trò quan trọng trong việc nhận thức và nhận biết thông tin Mạng nơ-ron sử dụng cấu trúc đồ thị để mô phỏng khả năng kết nối và xử lý dữ liệu giống như cách mà các tế bào thần kinh tương tác với nhau.
Kiến trúc của mạng nơ-ron bao gồm nhiều nơ-ron, hay còn gọi là node, được kết nối với nhau Mạng nơ-ron chủ yếu được chia thành ba lớp: lớp đầu vào (input layer), các lớp ẩn (hidden layer) ở giữa và lớp đầu ra (output layer) cuối cùng Hình 2.3 minh họa một mạng nơ-ron cơ bản với hai lớp ẩn.
Hình 2.3 Ví dụ về mạng neural network, 2 hidden layer Nguồn [15]
Mạng nơ-ron có thể bao gồm một lớp đầu vào, một lớp đầu ra và nhiều lớp ẩn Mỗi node trong mạng nơ-ron đại diện cho một nơ-ron với hàm kích hoạt khác nhau Tuy nhiên, để giảm thiểu độ phức tạp tính toán, người ta thường sử dụng chung một hàm kích hoạt cho toàn bộ mạng.
Mô hình mạng CNN (Convolutional Neural Network)
Hình 2.4 Mô hình CNN Nguồn [16]
A Convolutional Neural Network (CNN) is fundamentally a feedforward neural network characterized by an architecture that integrates various components, including Convolutional layers, Pooling layers, ReLU activation functions, and Fully Connected layers.
2.2.2.1 Lớp tích chập (Convolutional Layer)
Phép tích chập được thực hiện bằng phép toán giữa hai hàm đã có (𝑓 và 𝑔) Công thức phép toán tích chập như sau:
Trong mạng nơ-ron tích chập (CNN), lớp tích chập được gọi là lớp ẩn, bao gồm nhiều bản đồ đặc trưng (feature map) đại diện cho các góc nhìn khác nhau của dữ liệu đầu vào Quá trình này phụ thuộc vào bộ lọc (filter) và nhân (kernel), quét ma trận dữ liệu từ trái sang phải và từ trên xuống dưới, nhân từng giá trị của ma trận đầu vào với ma trận kernel và cộng tổng lại Kết quả sau đó được đưa qua hàm kích hoạt (activation function) như sigmoid hoặc ReLU, tạo ra một con số cụ thể Cuối cùng, ma trận thu được chính là bản đồ đặc trưng (feature map).
Hình 2.5 minh họa một ma trận đầu vào kích thước 5 × 5 và một filter có kích thước 3 × 3
Hình 2.5 Ma trận đầu vào và kernel
Sau khi quét kernel qua từng phần tử của input và thực hiện các phép toán, chúng ta thu được giá trị tại feature map Hình 2.6 minh họa ma trận 𝐼𝑛𝑝𝑢𝑡 × 𝐹𝑖𝑙𝑡𝑒𝑟 cùng với giá trị tại 𝐹𝑒𝑎𝑡𝑢𝑟𝑒 𝑚𝑎𝑝.
Hình 2.6 Ma trận Input × Kernel và Feature map
Bộ lọc, hay còn gọi là bộ phát hiện đặc trưng, là nơ-ron trong lớp tích chập của mạng nơ-ron Đầu vào của bộ lọc là các trọng số từ dữ liệu đầu vào, trong khi đầu ra giống như một nơ-ron Khi có lớp tích chập, đầu vào sẽ là các giá trị ban đầu, và trong các kiến trúc mạng sâu hơn, lớp tích chập sẽ nhận đầu vào từ feature map của lớp trước đó.
Tổng quát hóa, khi ta nhân tích chập ma trận input kích thước 𝑛 × 𝑛 vào bộ lọc kích thước 𝑓 × 𝑓, ta thu được một ma trận kích thước:
Trong lớp tích chập còn có hai tham số quan trọng khác đó là Stride và Padding
Stride là khoảng cách giữa hai kernel trong quá trình quét, với stride=1, kernel sẽ quét từng ô liên tiếp, ví dụ từ ô số 1 đến ô số 2 Ngược lại, khi stride=2, kernel sẽ quét từ ô số 1 đến ô số 3, bỏ qua ô số 2 Hình 2.7 minh họa rõ ràng ví dụ này với stride=1.
Hình 2.7 Ví dụ với stride=1
Tổng quát hóa, kích thước ma trận đầu ra lúc này với stride=𝑠 được tính bởi:
Khi 𝑛 − 𝑓 không chia hết cho 𝑠, chúng ta có thể thực hiện việc lấy chặn dưới Mỗi lần sử dụng phép tích chập sẽ làm giảm kích thước của feature map Để giữ nguyên kích thước feature map so với ban đầu, chúng ta có thể sử dụng padding Khi điều chỉnh padding=𝑝, tức là thêm 𝑝 ô bao bọc xung quanh các cạnh của ma trận input, như minh họa trong Hình 2.8 với padding=1.
Hình 2.8 Ví dụ với stride=1 và padding=1
Padding giúp bảo vệ thông tin tại các vùng gần cạnh của ma trận input, vì khu vực trung tâm được bao phủ bởi nhiều vùng kích thước bộ lọc, trong khi các góc hoặc cạnh chỉ được bao phủ một hoặc hai lần.
Tổng quát hóa, ma trận feature map khi sử dụng với padding=𝑝, stride=𝑠 được tính bởi:
Lớp Fully-connected là lớp trong mạng nơ-ron, nơi các nơ-ron liên kết đầy đủ với nhau, tương tự như trong mạng nơ-ron nhân tạo Trong kiến trúc mô hình của tôi, tôi sử dụng từ 1 đến 2 lớp fully-connected với hàm kích hoạt ReLU hoặc Softmax Lớp đầu ra có số unit tương ứng với số ký tự đầu ra mong muốn.
Mạng nơ-ron hồi tiếp (RNN) được thiết kế để xử lý chuỗi thông tin, khác với các mạng nơ-ron truyền thống mà các đầu vào và đầu ra hoàn toàn độc lập Điều này khiến RNN trở nên phù hợp cho các bài toán tuần tự, chẳng hạn như dự đoán từ tiếp theo trong một câu, vì nó có khả năng nhớ và sử dụng thông tin từ các từ trước đó RNN ra đời nhằm khắc phục những hạn chế của các mô hình truyền thống trong việc xử lý dữ liệu có tính tuần tự.
Mạng nơ-ron hồi tiếp (RNN) xử lý dữ liệu đầu vào dưới dạng chuỗi liên tục theo thứ tự thời gian, như một đoạn văn bản được cấu thành từ các từ hoặc ký tự Tại thời điểm 𝑡, dữ liệu đầu vào 𝑥 𝑡 tạo ra kết quả đầu ra 𝑦 𝑡, và khác với mạng lan truyền thẳng, 𝑦 𝑡 được sử dụng làm đầu vào cho thời điểm tiếp theo (𝑡 + 1) Điều này cho phép RNN lưu trữ và truyền thông tin qua các thời điểm khác nhau Hình 2.9 minh họa mô hình RNN một cách trực quan.
Hình 2.9 Mô hình mạng Recurrent Neural Network Nguồn [27]
Việc tính toán bên trong mạng RNN được thực thi như sau:
𝑥 𝑡 là đầu vào tại thời điểm 𝑡
Trạng thái ẩn tại thời điểm 𝑡, ký hiệu là ℎ 𝑡, là bộ nhớ của mạng, được tính toán dựa trên các trạng thái ẩn trước đó và đầu vào tại bước 𝑡.
ℎ 𝑡 = 𝑓(𝑈𝑥 𝑡 + 𝑉ℎ 𝑡−1 ) Hàm 𝑓 thường là một hàm phi tuyến chẳng hạng như tanh, ReLU, …
𝑜 𝑡 là đầu ra tại thời điểm 𝑡 Công thức tính: 𝑜 𝑡 = 𝑔(𝑊ℎ 𝑡 )
Mặc dù lý thuyết cho rằng RNN có khả năng xử lý chuỗi dữ liệu với độ dài bất kỳ, nhưng trên thực tế, hiệu suất của RNN chỉ tốt khi chuỗi dữ liệu ngắn Vấn đề này chủ yếu xuất phát từ hiện tượng triệt tiêu gradient (vanishing gradient) Để khắc phục những hạn chế này, các nhà nghiên cứu đã phát triển những phương pháp mới.
NHẬN DẠNG TIẾNG NÓI TIẾNG VIỆT CHO NGƯỜI KHUYẾT TẬT GIỌNG NÓI
Dữ liệu cho bài toán
Bộ dữ liệu huấn luyện của tôi bao gồm 1,600 từ vựng thông dụng nhất trong tiếng Việt, được thu thập từ Wikipedia Mục tiêu là tạo ra một bộ dữ liệu nhỏ để thử nghiệm, bao gồm toàn bộ âm vị và chữ cái, cùng với các thanh điệu trong tiếng Việt Bộ dữ liệu này chủ yếu chứa từ vựng đơn với 134 âm vị và 89 chữ cái, bao gồm cả các thanh điệu Tiếng Việt có 6 thanh điệu: thanh ngang (-), thanh huyền (`), thanh ngã (~), thanh hỏi (ˀ), thanh sắc (′) và thanh nặng (.) Bảng chữ cái tiếng Việt có tổng cộng 29 chữ cái.
Trong đó có 12 chữ cái có thanh điệu bao gồm:
Bảng 3.1 minh họa phân tích âm vị của các biến thể thanh điệu khi phát âm “a” và “đa”
Phát âm âm vị trong tiếng Việt bao gồm các âm như "a", "á", "à", "ã", "ả", và "ạ", mỗi âm có cách phát âm và ký hiệu riêng Ví dụ, âm "a" được phát âm là "ab", âm "á" là "as", âm "à" là "af", âm "ã" là "ax", âm "ả" là "ar", và âm "ạ" là "aj" Tương tự, âm "đ" cũng có các ký hiệu phát âm như "dd" cho "đa", "dd" cho "đá", "dd" cho "đà", "dd" cho "đã", "dd" cho "đả", và "dd" cho "dạ".
Bảng 3.1 Phân tích âm vị của các biến thể thanh điệu của phát âm “a” và “đa”
Tổng quan về phân bố âm vị trong tiếng Việt được thể hiện qua tập dữ liệu huấn luyện, như mô tả trong hình 3.1 Hình 3.2 và hình 3.3 chỉ ra 10 âm vị xuất hiện nhiều nhất và ít nhất trong tập dữ liệu này.
Hình 3.1 Tổng quan phân bố âm vị trong tiếng Việt có trong tập dữ liệu huấn luyện
Hình 3.2 Mười âm vị xuất hiện nhiều nhất trong tập dữ liệu huấn luyện
Hình 3.3 Mười âm vị xuất hiện ít nhất trong tập dữ liệu huấn luyện
Dữ liệu huấn luyện được ghi âm bởi ba người nói: bố tôi (DTM1), tôi (DTM2) và anh trai (DTM3) Mỗi từ vựng được ghi âm tại bốn thời điểm khác nhau, sử dụng trình ghi âm của điện thoại smartphone và lưu trữ dưới định dạng mp3 hoặc m4a.
Bộ dữ liệu được xây dựng với nhãn cho mỗi ghi âm, có thời gian trung bình khoảng 1.8 giây cho mỗi bản ghi Nó bao gồm 1546 từ vựng đơn, 48 từ vựng đôi và 6 từ vựng ba Do hạn chế trong việc thu thập dữ liệu, tôi chỉ tiến hành thử nghiệm trên tập dữ liệu nhỏ chủ yếu tập trung vào từ vựng đơn.
Bảng 3.2 mô tả thông số của bộ dữ liệu và phân chia tập dữ liệu huấn luyện vào kiểm thử
Người phát âm Tập huấn luyện Tập kiểm thử DTM1
Bảng 3.2 Mô tả dữ liệu cho tập huấn luyện và tập kiểm.
Cân bằng dữ liệu
Theo phân tích phân bố âm vị, dữ liệu huấn luyện hiện tại thiếu cân bằng giữa các âm vị, điều này ảnh hưởng đến hiệu suất và tính tổng quát của mô hình Để khắc phục, cần cân bằng dữ liệu trước khi huấn luyện Ý tưởng là tăng cường các âm vị ít xuất hiện Chúng ta xác định ngưỡng xuất hiện cân bằng là 100 Các âm vị dưới ngưỡng này sẽ được phân vào cụm xuất hiện ít (A), trong khi các âm vị trên ngưỡng sẽ vào cụm xuất hiện nhiều (B) Đối với các âm vị trong cụm A, chúng ta sẽ tăng cường số lần xuất hiện bằng cách tìm kiếm từ chứa âm vị đó, đảm bảo các âm vị được phân tích từ từ đó có nhiều nhất trong cụm A và ít nhất trong cụm B, từ đó giúp bộ dữ liệu huấn luyện trở nên cân bằng hơn.
Hình 3.4 mô tả phân bố tổng quan các âm vị sau khi thực hiện việc cân bằng dữ liệu trong bộ huấn luyện
Hình 3.4 Phân bố âm vị trong tập huấn luyện sau khi được cân bằng
Thực hiện nhận dạng giọng nói
Nhận dạng tiếng nói là quá trình chuyển đổi âm thanh thành văn bản Mô hình này cho phép khi người dùng cung cấp một đoạn ghi âm, hệ thống sẽ trả về bản dịch chính xác của đoạn phát âm đó Ví dụ, khi tín hiệu tiếng nói "phúc" được đưa vào mô hình, kết quả đầu ra sẽ là văn bản "phúc".
Hệ thống nhận dạng tiếng nói bắt đầu bằng việc trích xuất đặc trưng từ dữ liệu âm thanh, tạo ra vector đặc trưng cho tín hiệu tiếng nói Các vector này sau đó được đưa vào mô hình âm học, cụ thể là mô hình mạng rơ-ron sâu (DNN) Đầu ra của DNN cung cấp phân phối xác suất cho bộ ký tự 𝐶 tại mỗi thời điểm 𝑡 Cuối cùng, quá trình giải mã được thực hiện để thu được phiên âm của tín hiệu tiếng nói.
Hình 3.6 minh họa các bước trong quá trình nhận dạng tiếng nói
Hình 3.6 Các bước trong quá trình thực hiện nhận dạng tiếng nói
Tiền xử lý dữ liệu âm thanh / tiếng nói
Để xử lý dữ liệu âm thanh ghi âm từ điện thoại ở định dạng mp3 hoặc m4a, bước đầu tiên là chuyển đổi chúng sang định dạng wav với chế độ mono và tỷ lệ lấy mẫu 16k Hz.
Sử dụng mã lệnh thực hiện việc chuyển đổi (trên termial Linux):
``` for f in *.m4a; do ffmpeg -i "$f" -acodec pcm_s16le -ac 1 -ar
Dữ liệu sau khi chuyển đổi được tổ chức thành các thư mục, trong đó lưu trữ tập huấn luyện và tập kiểm thử, theo các thử nghiệm đã mô tả trong phần 3.4.
Trích xuất đặc trưng âm thanh và tiếng nói của chúng ta phụ thuộc vào hình dạng của đường âm thanh, bao gồm miệng, lưỡi, phổi và thanh quản Việc xác định chính xác hình dạng này giúp nhận diện âm vị, ký tự và từ được phát âm MFCCs (Mel Frequency Cepstral Coefficients) là phương pháp hiệu quả để biểu diễn năng lượng phổ ngắn hạn của âm thanh, phản ánh hình dạng của đường âm thanh.
Trong đồ án này, tôi áp dụng phương pháp trích xuất đặc trưng MFCCs để phân tích hiệu quả dựa trên thang đo Mel Phương pháp này dựa trên cách mà tai người cảm nhận các dải tần số khác nhau, với độ cảm nhận tuyến tính ở tần số thấp (