Nhận dạng giọng nói hoặc Nhận dạng giọng nói tự động ASR là trungtâm của sự chú ý đối với các dự án AI như robot.. Bộ tài liệu do AILAB, phòngmáy tính ĐHQG TP.HCM - ĐHKHTN biên soạn, với
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP HCM KHOA CÔNG NGHỆ THÔNG TIN
Trang 2TP Hồ Chí Minh, 18 tháng 5 năm 2022
I Mô tả đề tài
Lời nói là phương tiện giao tiếp cơ bản nhất của con người khi trưởng thành.Mục tiêu cơ bản của xử lý giọng nói là cung cấp sự tương tác giữa con người vàmáy móc Nhận dạng giọng nói hoặc Nhận dạng giọng nói tự động (ASR) là trungtâm của sự chú ý đối với các dự án AI như robot Nếu không có ASR, không thểtưởng tượng một robot nhận thức tương tác với con người
II Collect and label data
Link data:Data Trên Drive
VIVOS là kho ngữ liệu tiếng Việt miễn phí bao gồm 15 giờ ghi âm giọng nói đượcchuẩn bị cho nhiệm vụ Nhận dạng giọng nói tự động Bộ tài liệu do AILAB, phòngmáy tính ĐHQG TP.HCM - ĐHKHTN biên soạn, với GS Vũ Hải Quân là chủ nhiệm.Được xuất bản kho tài liệu này với hy vọng sẽ thu hút được nhiều nhà khoa họchơn nữa để giải quyết vấn đề nhận dạng giọng nói của người Việt Ngữ liệu chỉ nênđược sử dụng cho mục đích học thuật.Link Dataset
Trang 3III Feature engineering
Trong bài toán speech recognize hay các bài toán liên quan tới giọng nói thườngbiến đổi tín hiệu giọng nói thành dạng MFCC (Mel frequenᴄу ᴄepѕtral ᴄoeffiᴄientѕ)
1 1 A/D Conᴠerѕion and Pre-emphaѕiѕ
1.1 A/D Conᴠerѕion
Âm thanh là dạng tín hiệu liên tục, mà máy tính làm việc với các con sốrời rạc Ta lấy mẫu tại các khoảng thời gian Vì dữ liệu âm thanh của tập VIVOS cósample rate = 16000 lấy 1s lấy 16000 sample Và channel = 1 ta thu được
audio.shape = (16000*sec,)
Trang 41.2 Pre-emphaѕiѕ
Do đặᴄ điểm ᴄấu tạo thanh quản ᴠà ᴄáᴄ bộ phận phát âm nên tiếng nói ᴄủaᴄhúng ta ᴄó đặᴄ điểm: ᴄáᴄ âm ở tần ѕố thấp ᴄó mứᴄ năng lượng ᴄao, ᴄáᴄ âm ởtần ѕố ᴄao lại ᴄó mứᴄ năng lượng khá thấp Trong khi đó, ᴄáᴄ tần ѕố ᴄao nàу ᴠẫnᴄhứa nhiều thông tin ᴠề âm ᴠị Vì ᴠậу ᴄhúng ta ᴄần 1 bướᴄ pre-emphaѕiѕ
để kíᴄh ᴄáᴄ tín hiệu ở tần ѕố ᴄao nàу lên
2 2 Speᴄtrogram
2.1 Windoᴡing
Thaу ᴠì biến đổi Fourier trên ᴄả đoạn âm thanh dài, ta trượt 1 ᴄửa ѕổ dọᴄ theotín hiệu để lấу ra ᴄáᴄ frame rồi mới áp dụng DFT trên từng frame nàу ( DFT -Diѕᴄrete Fourier Tranѕform) Tốᴄ độ nói ᴄủa ᴄon người trung bình khoảng 3, 4 từmỗi giâу, mỗi từ khoảng 3-4 âm, mỗi âm ᴄhia thành 3-4 phần, như ᴠậу 1 giâу âmthanh đượᴄ ᴄhia thành 36 - 40 phần, ta ᴄhọn độ rộng mỗi frame khoảng 20 - 25mѕ
là ᴠừa đủ rộng để bao 1 phần âm thanh Cáᴄ frame đượᴄ oᴠerlap lên nhau khoảng10mѕ để ᴄó thể ᴄapture lại ѕự thaу đổi ᴄonteхt
Trang 5Sử dụng Hamming ᴡindoᴡ để làm giát trị biên giảm xuống từ từ.
2.2 DFT
Trên từng frame, ta áp dụng DFT - Diѕᴄrete Fourier Tranѕform theo ᴄông thứᴄ:
Áp dụng trên tất ᴄả ᴄáᴄ frame, ta đã thu đượᴄ 1 Speᴄtrogram như hình dướiđâу Mỗi frame ta thu đượᴄ 1 liѕt ᴄáᴄ giá trị độ lớn (magnitude) tương ứng ᴠới
Trang 6từng tần ѕố từ 0→N0 \to N0→N Áp dụng trên tất ᴄả ᴄáᴄ frame, ta đã thu đượᴄ
1 Speᴄtrogram như hình dưới đâу Trụᴄ ххх là trụᴄ thời gian (tương ứng ᴠới thứ tựᴄáᴄ frame), trụᴄ ууу thể hiện dải tần ѕố từ 0→100000 \to 100000→10000 Hᴢ, giátrị magnitude tại từng tần ѕố đượᴄ thể hiện bằng màu ѕắᴄ Qua quan ѕátѕpeᴄtrogram nàу, ta nhận thấу ᴄáᴄ tại ᴄáᴄ tần ѕố thấp thường ᴄó magnitude ᴄao,tần ѕố ᴄao thường ᴄó magnitude thấp
IV Tổng quan cấu trúc mạng sử dụng trong model
1 CNN (Convolutional Neural Network)[1]là gì ?
Mạng CNN là một tập hợp các lớp Convolution chồng lên nhau và sử dụng cáchàm nonlinear activation như ReLU và tanh để kích hoạt các trọng số trong cácnode Mỗi một lớp sau khi thông qua các hàm kích hoạt sẽ tạo ra các thông tin trừutượng hơn cho các lớp tiếp theo Từ đó giảm số lượng weight cho mô hình
Ví dụ cách hoạt động của một lớp tích chập:
Trang 72 GRU (Gated recurrent unit)[2]là gì ?
GRU là một phiên bản của LSTM với nguyên tắc hoạt động tương tự như LSTMnhưng có cấu tạo đơn giản hơn GRU kết hợp Cell state và Hidden state thành 1, do
đó nó chỉ có 2 input và 1 output Ngoài ra, trong GRU chúng ta sử dụng 2 gate làReset gate và Update gate để quyết định việc lưu trữ và loại bỏ thông tin
Trang 8Ngoài ra, một đặc điểm chung của 3 loại RNN (Vanilla RNN, LSTM, GRU) là chúngđều hoạt động theo một chiều nhất định (forward direction) Hay nói một cáchkhác, các mạng này chỉ mang thông tin tính tới thời điểm hiện tại Tuy nhiên, trongnhiều bài toán NLP thì việc biết thông tin của các timesteps tiếp theo giúp cải thiệnrất nhiều kết quả output (Translation, Speech recognition, Handwrittenrecognition, ) Trong trường hợp này chúng ta có thể sử dụng Bi-directional RNNvới việc xử lý thông tin theo cả hai chiều (forward và backward) Mô hình hoạt độngcủa Bi-directional RNN có thể được mô tả như hình dưới đây:
Ở đây,chúng ta có thể sử dụng Vanilla RNN, LSTM hoặc GRU làm các Cell choBi-directional RNN và kết quả output được tính bằng cách kết hợp cả hai Hiddenstate từ forward và backward direction
Ngoài ra, chúng ta cũng có thể kết hợp nhiều mạng RNN để tạo thành mộtMulti-layer RNN network với output của layer này trở thành input của layer tiếptheo như sau:
Trang 93 Giới thiệu về Connectionist Temporal Classification
Trong nhận diện giọng nói hay nhận diện chữ viết tay, đầu ra sẽ là một câu,nhưng chưa hoàn chỉnh vì có các ký tự lặp lại như "heelllo", "toooo", hay các chữ
có những khoảng trống (blank) như "he l l oo", "t o o", Nguyên nhân dẫn tớinhững hiện tượng này là giọng nói dài (các đoạn ngân nga trong các bài hát, ),giọng bị ngắt quãng, kích thước chữ viết tay lớn, nhỏ,
Do đó, để cho ra được một câu hoàn chỉnh thì ta cần phải căn chỉnh lại đầu ra
ấy, loại bỏ các ký tự lặp lại và khoảng trống Vấn đề này được gọi là alignmentproblem và nó được giải quyết bằng CTC
Temporal Classification
Gọi S là tập huấn luyện gồm các mẫu từ một phân phối cố định DX×Z ,trong đó:
• X = (Rm)* là một tập gồm tất cả các chuỗi (sequence) của các vectors
số thực có độ dài là m
• Z = L* là một tập gồm tất cả các chuỗi chỉ có các ký tự alphabet cóhạn L của các labels Các phần tử của L* còn được gọi là labelsequences hay labellings
Trang 10Mỗi mẫu trong S bao gồm một cặp chuỗi (x,z) Chuỗi mục tiêu (targetsequence) z=(z1 ,z2 , ,zU ) có độ dài gần như chuỗi đầu vào (input sequence)x=(x1 ,x2, ,xT ), tức là U ≤ T.
Mục tiêu của ta là dùng S để huấn luyện bộ temporal classifier h:X↦Z đểphân loại các chuỗi đầu vào chưa thấy trước đó (previously unseen inputsequences) sao cho tối thiểu hóa một lượng mất mát (error measure) nàođó
Một trong các error measure là label error rate (LER) được tính bằng trungbình của edit distance của đầu ra dự đoán h(x) và nhãn z trong tập S′ lấy từ S:
Vậy, temporal classifier h là một mô hình phân loại nào đó mang tính thờigian (temporal) Và cũng vì thế, ở đây ta sẽ lấy RNN làm một temporalclassifier cho gần gũi (thật ra ta có thể lấy bất kỳ model nào cho ra outputtheo thời gian)
Đầu ra của CTC Network: RNN
Đầu ra của một CTC Network là kết quả của lớp softmax có số unit bằng số
ký tự trong L cộng thêm một ký tự trống (blank), nghĩa là xác suất phân loạicủa các ký tự trong |L| + 1∣L∣+1 tại một thời điểm nhất định
Như vậy, tổ hợp của tất cả các đầu ra theo thời gian là ZZ Dưới đây là hìnhminh họa.
Trang 11Xác suất của một labelling
Xác suất của một labelling là tổng xác suất của tất cả các alignment cho
ra labelling đó.
Xây dựng bộ phân loại
đầu ra của bộ phân loại sẽ là labelling có vẻ đúng nhất
Vậy làm sao để tìm h(x)?
• Best path decoding là sự kết hợp củacác unit có xác suất cao nhất của mỗi time-step, do đó không đảm bảo sẽtìm thấy labelling đúng nhất
• Prefix search decoding (PSD): phương pháp này dựa trênforward-backward algorithm, nếu có đủ thời gian, PSD sẽ luôn tìm thấylabelling phù hợp nhất, nhưng số lượng prefix tối đa sẽ tăng theo hàm
mũ, phức tạp nên phải áp dụng heuristic
Trang 12Xây dựng hàm mất mát (CTC Loss function)
Ta sẽ xây dựng hàm mất mát để có thể train bằng gradientdescent Hàm mất mát được lấy theo maximum likelihood Nghĩa là khi tốithiểu hóa nó thì sẽ cực đại hóa log likelihood
Như vậy hàm mất mát (hàm mục tiêu) sẽ là negative log likelihood:
Như vậy, một CTC Network chẳng qua là một network phân loại thông thường
có output theo thời gian (temporal classifier), ta tính toán xác suất củacác alignments bằng cách connect các xác suất của output của các thời điểm lại vớinhau và chọn alignment phù hợp nhất, tính sai số của nó và cho network học lại Vìthế họ gọi là Connectionist Temporal Classification
4 Model deepspeech2
Trang 13Phần tiền xử lý lấy một tín hiệu dạng sóng âm thanh thô và chuyển đổi nó thànhmột biểu đồ phổ log có kích thước ( N_timesteps , N_frequency_features ).N_timesteps phụ thuộc vào thời lượng của tệp âm thanhgốc, N_frequency_features có thể được gán trong tệp cấu hình của mô hình dướidạng tham số.
Phần Deep Neural Network (DNN) tạo ra phân phối xác suất P_t (c) trên các ký tự
từ vựng c cho mỗi bước thời gian t
DeepSpeech2 được đào tạo với mất CTC
mô hình đã đào tạo, người ta cần sử dụng bộ giải mã Bộ giải mã chuyển đổi phânphối xác suất qua các ký tự thành văn bản Có hai loại bộ giải mã thường được sửdụng với các mô hình dựa trên CTC: bộ giải mã tham lam và bộ giải mã tìm kiếmchùm với tính điểm lại mô hình ngôn ngữ Một bộ giải mã tham lam xuất ra ký tự cóthể xảy ra nhất tại mỗi bước thời gian Nó rất nhanh và nó có thể tạo ra bảng điểmrất gần với cách phát âm gốc Nhưng nó có thể mắc nhiều lỗi chính tả nhỏ Nhưng
do bản chất của chỉ số WER, ngay cả một lỗi ký tự cũng làm cho cả một từ khôngchính xác Bộ giải mã tìm kiếm chùm với tính năng ghi lại mô hình ngôn ngữ chophép kiểm tra nhiều giải mã có thể (chùm) cùng một lúc với việc ấn định điểm caohơn cho nhiều N-gam có thể xảy ra hơn theo một mô hình ngôn ngữ nhất định Môhình ngôn ngữ giúp sửa lỗi chính tả Nhược điểm là nó chậm hơn đáng kể so vớimột bộ giải mã tham lam
V Quá trình xây dựng và huấn luyện mô hình
1 Import thư viện cần thiết:
2 Đọc file csv được chuyển từ file txt sang và chuyển hết thành chữ
thường
Trang 143 Chia dữ liệu train và validation.
Trang 154 Tạo bộ từ vựng decode chữ thành số và encode số thành chữ dựa
theo layer của tensorflow là
The vocabulary is: ['', 'a', 'ă', 'â', 'b', 'c', 'd', 'đ', 'e', 'ê', 'g', 'h', 'i', 'k', 'l', 'm', 'n', 'o', 'ô', 'ơ', 'p', 'q', 'r', 's', 't', 'u', 'ư', 'v', 'x', 'y', 'á', 'à', 'ả', 'ã', 'ạ', 'ắ', 'ằ', 'ẳ', 'ẵ', 'ặ', 'ấ', 'ầ', 'ẩ', 'ẫ', 'ậ', 'é', 'è', 'ẻ', 'ẽ', 'ẹ', 'ế', 'ề', 'ể', 'ễ', 'ệ', 'í', 'ì', 'ỉ', 'ĩ', 'ị', 'ó', 'ò', 'ỏ', 'õ', 'ọ', 'ố', 'ồ', 'ổ', 'ỗ', 'ộ', 'ớ', 'ờ', 'ở', 'ỡ', 'ợ', 'ú', 'ù', 'ủ', 'ũ', 'ụ', 'ứ', 'ừ', 'ử', 'ữ', 'ự', 'ý', 'ỳ', 'ỷ', 'ỹ', 'ỵ',
"'", '?', '!', ' '] (size =94)
5 Set thông số của các hàm trong STFT của tensorflow
6 Trích xuất đặc trưng bằng STFT sau đó decode chữ thành số rồi trả
về spectrogram và chữ đã được decode
Trang 167 Spectrogram sẽ có dạng như thế này:
Trang 178 Label sẽ có dạng như thế này:
9 Với mỗi tên trong dataframe đưa thành file audio tương ứng với từ
được chuẩn hóa sẽ được gộp lại thành một và map() lại trong một file dataset
Trang 1810.Model sử dụng 2D CNN, RNN và CTC loss, hàm mặc định của CTC loss
là:
Trang 2313.Tạo checkpoint sau mỗi epoch
Trang 2414.Loss khá là cao mặc dù wer ở tầm trung 12% - 23%
Độ chính xác:
Trang 2515.Audio được dự đoán với chuẩn đầu vào là single-channel, 16 bit,
đuôi wave, và sample rate = 16000: Text đúng là: nên đưa chuẩn tiết kiệm và chuẩn đề bạt cán bộ
16.Audio được dự đoán với đầu vào có bị rè, double-channel, 32 bit,
đuôi wave, và không phải 16000Hz: Text đúng là : tận như thế ô chưa bây giờ mình sẽ đến với một ví dụ nữa đi
Trang 2617.Em vẫn đang thử train thêm dữ liệu mới với đầu vào bị rè và âm
thanh không phải ở dạng chuẩn single-channel, 16 bit, đuôi wave, và 16000Hz của tensorflow Nhưng mà sau mỗi lần train thì wer cao hơn
1 và loss quá cao nên em đang xem lại model để train tiếp ạ:
1 Ưu điểm
- Tìm hiểu thêm được về các hàm xử lý âm thanh của tensorflow
- Trải nghiệm được thêm một đề tài mới về xử lý âm thanh
- Hoàn thành chuẩn chu được một model về xử lý âm thanh
Trang 27- Data còn ít vì giới hạn bộ nhớ và giới hạn GPU để train model
- Phần lớn thời gian chỉ là tìm hiểu và học hỏi chứ chưa thực sự làm đề tài trọnvẹn
Trang 28VII Tài liệu tham khảo
George E Dahl, Dong Yu, Li Deng, and Alex Acero 2012 Context-dependent pre-trained deep neural networks for large-vocabulary speech recognition IEEE Transactions on Audio, Speech, and Language Processing, 20(1):30–42.
Tổng quan cấu trúc mạng sử dụng trong model
CNN (Convolutional Neural Network)[1] là gì ?
GRU (Gated recurrent unit)[2] là gì ?
Giới thiệu về Connectionist Temporal Classification
Temporal Classification
Đầu ra của CTC Network: RNN
Xác suất của một labelling
Xây dựng bộ phân loại
Trang 29Xây dựng hàm mất mát (CTC Loss function)
Model deepspeech2
Quá trình xây dựng và huấn luyện mô hình
Import thư viện cần thiết:
Đọc file csv được chuyển từ file txt sang và chuyển hết thành chữ thường
Chia dữ liệu train và validation
Tạo bộ từ vựng decode chữ thành số và encode số thành chữ dựa theo layer củatensorflow là
Set thông số của các hàm trong STFT của tensorflow
Trích xuất đặc trưng bằng STFT sau đó decode chữ thành số rồi trả về spectrogram vàchữ đã được decode
Spectrogram sẽ có dạng như thế này:
Label sẽ có dạng như thế này:
Với mỗi tên trong dataframe đưa thành file audio tương ứng với từ được chuẩn hóa sẽđược gộp lại thành một và map() lại trong một file dataset
Model sử dụng 2D CNN, RNN và CTC loss, hàm mặc định của CTC loss là:
Summary
Hàm decode với mỗi file âm thành được dự đoán trong hàm callback
Tạo checkpoint sau mỗi epoch
Loss khá là cao mặc dù wer ở tầm trung 12% - 23%
Audio được dự đoán với chuẩn đầu vào là single-channel, 16 bit, đuôi wave, và samplerate = 16000: Text đúng là: nên đưa chuẩn tiết kiệm và chuẩn đề bạt cán bộ
Audio được dự đoán với đầu vào có bị rè, double-channel, 32 bit, đuôi wave, và khôngphải 16000Hz: Text đúng là : tận như thế ô chưa bây giờ mình sẽ đến với một ví dụ nữađi
Em vẫn đang thử train thêm dữ liệu mới với đầu vào bị rè và âm thanh không phải ởdạng chuẩn single-channel, 16 bit, đuôi wave, và 16000Hz của tensorflow Nhưng màsau mỗi lần train thì wer cao hơn 1 và loss quá cao nên em đang xem lại model để traintiếp ạ: