Professional Documents
Culture Documents
KLTS
KLTS
Hà Nội - 2024
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
Hà Nội - 2024
Lời cảm ơn
Để hoàn thành bài luận văn này, đầu tiên tôi xin gửi lời cảm ơn đến quý thầy,
cô đang giảng dạy tại Trường Đại học Khoa học Tự nhiên nói chung và Khoa Vật
lý nói riêng. Đặc biệt, nếu không có sự hướng dẫn, chỉ bảo tận tình, chu đáo của
thầy Phạm Tiến Lâm và thầy Phạm Văn Thành thì tôi khó có thể hoàn thành bài
luận văn này. Tôi xin gửi lời cảm ơn sâu sắc đến thầy, người đã dạy dỗ, chỉ bảo và
cung cấp cho tôi những tài liệu khoa học chuẩn xác nhất để em có những tri thức
đúng đắn.
Tôi xin chân thành cảm ơn Quỹ Phát triển khoa học và công nghệ Quốc gia
(NAFOSTED) đã tạo điều kiện và hỗ trợ cho tôi trong thời gian nghiên cứu, học
tập thạc sĩ thông qua đề tài mã số 103.99-2020.33
Nhân đây, tôi cũng xin gửi lời cảm ơn đến bạn bè, những người đã giúp đỡ, động
viên, cổ vũ giúp em vượt qua những khó khăn trong nghiên cứu.
Trong quá trình thực hiện luận văn, tôi đã cố gắng hết sức để tránh những sai
sót và thiếu sót. Tuy nhiên, do kiến thức còn hạn chế, luận văn có thể chưa đạt
được sự hoàn thiện như mong muốn. Tôi rất trân trọng những ý kiến đóng góp và
góp ý của quý thầy cô để hoàn thiện hơn nữa luận văn này.
Tôi xin chân thành cảm ơn!
MỞ ĐẦU 1
CHƯƠNG 1 - CƠ SỞ LÝ THUYẾT 4
1.1 Âm thanh . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.1 Định nghĩa . . . . . . . . . . . . . . . . . . . . 5
1.1.2 Tín hiệu âm thanh . . . . . . . . . . . . . . . . . 5
1.2 Trích chọn đặc trưng của âm thanh . . . . . . . . . . . . 6
1.2.1 Đặc trưng của âm thanh . . . . . . . . . . . . . . 6
1.2.2 Các đặc trưng âm thanh trong miền thời gian . . . . . 7
1.2.3 Các đặc trưng âm thanh trong miền tần số . . . . . . 8
1.2.4 Đặc trưng âm thanh MFCC . . . . . . . . . . . . . 11
1.3 Học sâu (Deep learning) . . . . . . . . . . . . . . . . . 17
1.3.1 Định nghĩa . . . . . . . . . . . . . . . . . . . . 17
1.3.2 Ưu điểm của phương pháp học sâu . . . . . . . . . . 18
1.3.3 Một số thuật toán nhân dạng và phân loại âm thanh . . 18
1.3.4 Mạng neural tích chập . . . . . . . . . . . . . . . 19
1.3.5 Mạng neural đệ quy . . . . . . . . . . . . . . . . 22
1.3.6 Mạng đệ quy LSTM . . . . . . . . . . . . . . . . 22
1.4 Các độ đo đánh giá mô hình . . . . . . . . . . . . . . . 23
1.4.1 Confusion Matrix . . . . . . . . . . . . . . . . . 24
1.4.2 Accuracy score (Độ chính xác) . . . . . . . . . . . . 24
1.4.3 Precision và Recall . . . . . . . . . . . . . . . . . 25
KẾT LUẬN 51
PHỤ LỤC A
PHỤ LỤC B
Danh sách hình vẽ
1.1 Âm thanh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Chuyển đổi âm thanh từ tín hiệu liên tục sang tín hiệu số . . . . . . . 6
1.3 Tín hiệu âm thanh “Lên” theo miền thời gian . . . . . . . . . . . . . 7
1.4 Tín hiệu âm thanh là sự kết hợp của các sóng hình sin và cosin . . . 8
1.5 Tín hiệu âm thanh “Lên” theo miền tần số . . . . . . . . . . . . . . . 9
1.6 Ảnh phổ của tín hiệu âm thanh “Lên” . . . . . . . . . . . . . . . . . . 11
1.7 Quy trình xử lý của phương pháp MFCC . . . . . . . . . . . . . . . . 11
1.8 Số hóa dữ liệu âm thanh với tần số lấy mẫu xác định . . . . . . . . . 12
1.9 Pre-emphasis một đoạn âm thanh . . . . . . . . . . . . . . . . . . . . 12
1.10 Các khung dữ liệu được xếp chồng lên nhau . . . . . . . . . . . . . . 13
1.11 Các loại cửa sổ phổ biến . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.12 Tín hiệu âm thanh khi chập với các loại cửa sổ khác nhau . . . . . . 13
1.13 Ảnh phổ của tín hiệu âm thanh lên . . . . . . . . . . . . . . . . . . . 14
1.14 Bộ lọc thông dải Mel . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.15 Ảnh phổ Mel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.16 Quy trình tính Cepstrum . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.17 Các kiểu dữ liệu phi cấu trúc phổ biến. . . . . . . . . . . . . . . . . . 18
1.18 Luồng xử lý của mạng CNN . . . . . . . . . . . . . . . . . . . . . . . 19
1.19 Dữ liệu đầu vào và đầu ra của một lớp tích chập . . . . . . . . . . . . 20
1.20 Lớp tích chập hoạt động với bước nhảy là 2 . . . . . . . . . . . . . . 20
1.21 Valid và Same Padding . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.22 Các hàm kích hoạt . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.23 Hàm ReLU6 và LeakyReLU . . . . . . . . . . . . . . . . . . . . . . . 22
1.24 Luồng xử lý của RNN . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.25 Luồng xử lý của LSTM . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.26 Confusion Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Lý do chọn đề tài
Trong thời đại hiện nay, sự tích hợp của các thiết bị điện tử vào cuộc sống hàng
ngày của con người đã trở nên vô cùng phổ biến. Để đảm bảo sự tiện lợi và khả
năng sử dụng dễ dàng cho người dùng, các thiết bị này được chế tạo với hệ thống
điều khiển đa dạng từ cơ bản đến phức tạp. Một loạt các phương pháp điều khiển
đã được áp dụng trong việc tương tác với các thiết bị điện tử, bao gồm:
Điều khiển bằng tay: Điều khiển thiết bị bằng cách sử dụng các cử chỉ hoặc
thiết bị tay như remote, bàn phím, hoặc chuột. Ưu điểm của phương pháp này
là quen thuộc và dễ sử dụng cho nhiều người, tuy nhiên có thể gây bất tiện
khi cần phải mang theo thiết bị điều khiển riêng, đặc biệt khi có nhiều thiết
bị cần điều khiển.
Điều khiển bằng giọng nói: Sử dụng giọng nói để điều khiển thiết bị hoặc hệ
thống. Tiện lợi và tự nhiên hơn trong việc tương tác với thiết bị, có khả năng
hỗ trợ người dùng có khuyết tật. Ngược lại đôi khi thiết bị có thể nhận diện
không chính xác các lệnh hoặc bị ảnh hưởng bởi tiếng ồn xung quanh.
Điều khiển bằng cảm biến: Sử dụng cảm biến để phát hiện và phản ứng với
các tín hiệu từ người dùng hoặc môi trường xung quanh. Ưu điểm: Tạo ra trải
nghiệm tương tác tự động, không cần sự can thiệp trực tiếp từ người dùng.
Nhược điểm: Có thể gây nhầm lẫn hoặc không chính xác trong việc nhận diện
tín hiệu, đặc biệt khi môi trường xung quanh thay đổi.
Điều khiển bằng hệ thống thông minh: Sử dụng trí tuệ nhân tạo và hệ thống
thông minh để tự động điều khiển thiết bị dựa trên dữ liệu và học máy. Ưu
điểm: Cung cấp trải nghiệm tùy chỉnh, học hỏi và tự động hóa cao,có khả
năng thích ứng và cải thiện theo thời gian. Nhược điểm: Đòi hỏi cơ sở hạ tầng
công nghệ tốt, có thể phức tạp và đắt đỏ để triển khai và duy trì, đôi khi có
thể gây lo ngại về quyền riêng tư.
Trong những năm gần đây, lĩnh vực học máy đã trải qua sự tăng trưởng theo
cấp số nhân, với các ứng dụng trong các lĩnh vực đa dạng như chăm sóc sức khỏe,
tài chính và tự động hóa. Bên cạnh đó, khi số lượng thiết bị IoT tăng vọt, nhu cầu
ra quyết định thông minh, cục bộ cũng tăng theo. Các cách tiếp cận dựa trên đám
mây truyền thống đối với AI có thể bị giới hạn bởi các yếu tố như độ trễ, băng
thông và mối quan tâm về quyền riêng tư. Ngược lại, TinyAI hỗ trợ trí thông minh
trên thiết bị, cho phép ra quyết định nhanh hơn, hiệu quả hơn mà không cần liên
lạc liên tục với đám mây.
1
Mở đầu
Sự tiến bộ của TinyAI không chỉ giảm kích thước của mô hình mà còn tăng
cường hiệu suất tính toán, giúp việc nhận dạng và xử lý giọng nói trở nên nhanh
chóng và hiệu quả hơn. Việc tích hợp TinyAI vào các thiết bị như điện thoại di
động, thiết bị gia đình thông minh hoặc các sản phẩm cá nhân đã mở ra cánh cửa
cho việc sử dụng giọng nói như một phương pháp điều khiển hàng đầu.
Điều này không chỉ mang lại trải nghiệm tương tác tự nhiên hơn cho người dùng
mà còn tạo ra môi trường linh hoạt cho việc sử dụng công nghệ trong nhiều ngữ
cảnh khác nhau, từ việc điều khiển thiết bị đơn giản đến tương tác phức tạp hơn với
hệ thống thông minh. Sự tiến bộ của TinyAI đã cung cấp nền tảng mạnh mẽ cho
việc triển khai các ứng dụng điều khiển bằng giọng nói, đánh dấu một bước nhảy
vọt trong sự hòa nhập giữa con người và công nghệ thông qua giao tiếp giọng nói
tự nhiên và hiệu quả.
Dữ liệu đầu vào: Các tệp âm thanh, tệp ghi âm trong khuôn dạng .wav được
thu thập từ giọng nói của nhiều người với môi trường bên ngoài khác nhau.
Kết quả đầu ra: Thực hiện phân tích các tín hiệu âm thanh bằng cách sử dụng
các kỹ thuật trích chọn đặc trưng, nhận dạng và phân loại để từ đó chuyển
đổi từ tín hiệu âm thanh sang văn bản, hỗ trợ điều khiển thiết bị điện tử.
Đầu tiên, chúng tôi thu thập dữ liệu tín hiệu âm thanh từ môi trường thực tế
bên ngoài. Dữ liệu này được tiền xử lý để loại bỏ nhiễu và chuẩn hóa trước khi đưa
vào mô hình học sâu. Sau đó, chúng tôi tiến hành trích chọn đặc trưng của các tín
hiệu âm thanh. Tiếp theo, chúng tôi huấn luyện mô hình sử dụng dữ liệu đã dược
trích chọn và gán nhãn để mô hình có thể học và nhận diện các mẫu âm thanh
tương ứng với các tình huống điều khiển cụ thể. Quá trình huấn luyện này cần sự
tinh chỉnh của các siêu tham số để tối ưu hóa hiệu suất của mô hình.
Sau khi hoàn thành quá trình huấn luyện, chúng tôi đánh giá hiệu suất của mô
hình thông qua các thước đo đánh giá như độ chính xác, độ nhạy, độ đặc hiệu. Đồng
2
Mở đầu
thời, chúng tôi cũng thực hiện việc áp dụng mô hình đã huấn luyện vào các tình
huống thực tế để kiểm tra và xác nhận tính khả dụng và hiệu quả của nó trong ứng
dụng thực tế.
Các đặc trưng của âm thanh theo miền thời gian và miền tần số.
Các kỹ thuật trích chọn đặc trưng của tín hiệu âm thanh, các thuật toán xây
dựng mạng neural học sâu để nhận dạng và phân loại tín hiệu âm thanh.
Chương 1: Trình bày các kiến thức cơ bản về tín hiệu âm thanh và học sâu.
Chương 2: Mô tả chi tiết quá trình xây dựng mô hình điều khiển xe robot,
bao gồm các bước thu thập dữ liệu, tiền xử lý dữ liệu, xây dựng và huấn luyện
mô hình học sâu, và kết nối mô hình với xe robot.
Phần kết luận tóm tắt các kết quả chính thu được và đề xuất các hướng nghiên
cứu mới có thể phát triển tiếp của đề tài.
3
Chương 1
Cơ sở lý thuyết
4
Chương 1: Cơ sở lý thuyết
1.1 Âm thanh
1.1.1 Định nghĩa
Âm thanh là các dao động cơ học của các phân tử, nguyên tử hay các hạt làm
nên vật chất và lan truyền trong vật chất như các sóng. Âm thanh, giống như nhiều
sóng, được đặc trưng bởi tần số, bước sóng, chu kỳ, biên độ và vận tốc lan truyền. [2]
1
Hình 1.1: Âm thanh
Đối với thính giác của người, âm thanh nghe được thường dao động trong dải
tần số từ khoảng 16 Hz đến khoảng 20 000 Hz. Tuy nhiên âm thanh cũng có thể
được định nghĩa rộng hơn, tuỳ vào ứng dụng, bao gồm các tần số cao hơn hay thấp
hơn tần số mà tai người có thể nghe thấy, không chỉ lan truyền trong không khí mà
còn truyền trong bất cứ vật liệu nào. Cả tiếng ồn và âm nhạc đều là các âm thanh.
Trong việc truyền tín hiệu bằng âm thanh, tiếng ồn là các dao động ngẫu nhiên
không mang tín hiệu.
5
Chương 1: Cơ sở lý thuyết
âm thanh, giúp thuận tiện trong việc lưu trữ, truyền tải và xử lý các thông tin âm
thanh.
2
Hình 1.2: Chuyển đổi âm thanh từ tín hiệu liên tục sang tín hiệu số
Quá trình chuyển đổi tín hiệu từ dạng liên tục sang dạng số được gọi là quá trình
Analog-to-Digital Conversion (ADC). Đây là quá trình chuyển đổi dữ liệu thường
được sử dụng trong nhiều thiết bị điện tử hiện đại.
Miền thời gian: Đây là những đặc trưng được trích xuất từ dạng sóng của
âm thanh gốc. Ví dụ: Năng lượng, năng lượng Root Mean Square(RMS) và tỷ
lệ vượt qua 0.
Miền tần số: Những đặc trưng này tập trung vào các thành phần tần số của
tín hiệu âm thanh. Tín hiệu thường được chuyển đổi từ miền thời gian sang
miền tần số bằng cách sử dụng biến đổi Fourier. Ví dụ: Tỷ lệ năng lượng dải
tần, trọng tâm phổ, và lưu lượng phổ.
2
https://dewesoft.com/blog/what-is-adc-converter
6
Chương 1: Cơ sở lý thuyết
Hình 1.3: Tín hiệu âm thanh “Lên” theo miền thời gian
a) Năng lượng
Năng lượng của một tín hiệu âm thanh là tổng cường độ của tín hiệu đó theo
miền thời gian [2]. Được cho bởi công thức:
X
E(x) = |x(N )|2
N
trong đó, E là năng lượng của đoạn âm thanh, x(N ) là giá trị biên độ của mẫu thứ
N.
7
Chương 1: Cơ sở lý thuyết
trong đó, sgn[x(N )] là dấu x(N ) và có giá trị là 1 nếu x(N ) nhận giá trị dương, giá
trị là -1 nếu x(N ) nhận giá trị âm.
3
Hình 1.4: Tín hiệu âm thanh là sự kết hợp của các sóng hình sin và cosin
Biểu diễn miền thời gian không chỉ ra được các thành phần tần số và phân bổ
tần số của tín hiệu âm thanh. Biểu diễn miền tần số được suy diễn từ biểu diễn miền
thời gian bằng biến đổi Fourier. Biến đổi Fourier tách tín hiệu thành cách thành
phần tần số riêng lẻ. Trong miền tần số, tín hiệu được biểu diễn bởi biến độ biến
đổi theo tần số, chỉ ra tổng năng lượng tại các tần số khác nhau. Biểu diễn miền
tần số của tín hiệu âm thanh được gọi là phổ của tín hiệu âm thanh.
Hình 1.5 là phổ của tín hiệu âm thanh. Xuất phát từ phổ tín hiệu, ta có thể dễ
dàng nhận ra ra phân bổ năng lượng theo dải tần số. Ta sử dụng biến đổi Fourier
rời rạc (Discrete Fourier Transform - DFT) để suy diễn ra phổ tín hiệu:
N
X −1
X(k) = x(n)ejn ωk
N =0
8
Chương 1: Cơ sở lý thuyết
Nếu x(n) có giới hạn thời gian là N thì nó có thể khôi phục hoàn toàn IDFT của
N mẫu tần số như sau:
N −1
1 X
x(n) = X(k)ejnωk
N k=0
Các giá trị DFT và IDFT được tính toán hiệu quả bằng thuật toán biến đổi
Fourier nhanh (Fast Fourier Transform - FFT).
Như đã nói ở trên, DFT làm việc với tín hiệu rời rạc có giới hạn độ dài N. Tuy
nhiên, trong thực tế, rất nhiều tín hiệu trong khoảng thời gian dài, rất khó để tính
toán với N lớn. Để giải quyết vấn đề này, người ta sử dụng STFT (Short-time Fourier
Transform). Trong đó, tín hiệu và độ dài lớn được chia thành các khối gọi là khung
dữ liệu (frame) và DFT áp dụng cho từng khung. Khung được hình thành bằng cách
nhân tín hiệu gốc với hàm cửa sổ (windowing). Thông thường độ dài khung khoảng
10 đến 20ms [8].
9
Chương 1: Cơ sở lý thuyết
Việc tính toán năng lượng dải tần số cao và tần số thấp là cần thiết. Ví dụ tần
số tín hiệu tiếng nói ít khi vượt qua 7kHz. Do vậy, ta có thể chia toàn bộ phổ theo
đường ngang 7kHz: nửa dưới thuộc tần số thấp và nửa trên thuộc tần số cao. Tổng
năng lượng của tệp âm thanh được tính bằng tổng năng lượng của mỗi mẫu trong
tệp đó.
d) Cao độ (Pitch)
Đặc trưng thứ tư của miền tần số trong dữ liệu âm thanh là cao độ. Cao độ của
âm thanh là thuộc tính mà người nghe cảm nhận các tần số của một âm thanh. Nó
liên quan đến cảm giác về sự “cao thấp” của âm thanh [1].
Cao độ thấp: Âm thanh có tần số thấp tạo ra cảm giác của một cao độ thấp,
thường được miêu tả như “âm thanh trầm” hoặc “âm thanh thấp”.
Cao độ cao: Âm thanh có tần số cao tạo ra cảm giác của một cao độ cao,
thường được miêu tả như “âm thanh bổng” hoặc “âm thanh cao”.
Tần số càng cao thì cao độ càng cao và bước sóng càng ngắn. Cao độ là đặc
trưng chủ quan, nó có quan hệ nhưng không tương đương với tần số cơ bản. Tuy
nhiên, trong thực tế, chúng ta sử dụng các tần số cơ bản để xấp xỉ cao độ.
Ảnh phổ của âm thanh là một biểu đồ hai chiều mà trên trục hoành thể hiện
thời gian và trục tung thể hiện tần số. Màu sắc hoặc cường độ của các điểm ảnh
trên biểu đồ đại diện cho mức năng lượng của âm thanh tại một thời điểm và tần
số cụ thể [1].
10
Chương 1: Cơ sở lý thuyết
Thông quả ảnh phổ, có thể hiểu được cách năng lượng của âm thanh được phân
phối trên các tần số và thay đổi theo thời gian. Điều này cho phép phân tích và biểu
đồ hóa các yếu tố âm thanh như cao độ, độ lớn và các tần số cơ bản.
Hình 1.6 chỉ ra ảnh phổ của một tín hiệu âm thanh. Ảnh phổ mô tả rõ ràng các
quan hệ giữa thời gian, tần số và biên độ.
4
Hình 1.7: Quy trình xử lý của phương pháp MFCC
11
Chương 1: Cơ sở lý thuyết
4
Hình 1.8: Số hóa dữ liệu âm thanh với tần số lấy mẫu xác định
Tai người nghe được âm thanh trong khoảng 16Hz → 20.000Hz. Theo định lý
lấy mẫu Nyquist–Shannon: Với một tín hiệu có các tần số thành phần ≤ fm , để đảm
bảo việc lấy mẫu không làm mất mát thông tin, tần số lấy mẫu fs phải đảm bảo fs
≥ 2fm .
Vậy để đảm bảo việc lấy mẫu không làm mất mát thông tin, tần số lấy mẫu fs
= 44100Hz. Tuy nhiên trong nhiều trường hợp, người ta chỉ cần lấy fs = 8000Hz
hoặc fs = 16000Hz.
Bước 2: Pre-emphasis
Do đặc điểm cấu tạo thanh quản và các bộ phận phát âm nên tiếng nói có đặc
điểm: các âm ở tần số thấp có mức năng lượng cao và các âm ở tần số cao lại có
mức năng lượng khá thấp. Trong khi đó, các tần số cao này vẫn chứa nhiều thông
tin về âm vị. Vì vậy chúng ta cần 1 bước pre-emphasis để kích thích các tín hiệu ở
tần số cao.
4
Hình 1.9: Pre-emphasis một đoạn âm thanh
12
Chương 1: Cơ sở lý thuyết
Fourier Transform - DFT) trên từng khung này. Tốc độ nói của con người trung
bình khoảng 3, 4 từ mỗi giây, mỗi từ khoảng 3-4 âm, mỗi âm chia thành 3-4 phần,
như vậy 1 giây âm thanh được chia thành 36 - 40 phần, ta chọn độ rộng mỗi khung
khoảng 20 - 25ms là đủ rộng để bao 1 phần âm thanh. Các khung được xếp chồng
lên nhau khoảng 10ms để có thể thu lại sự thay đổi về nội dung.
4
Hình 1.10: Các khung dữ liệu được xếp chồng lên nhau
Tuy nhiên, việc cắt khung sẽ làm các giá trị ở 2 biên của khung bị giảm đột
ngột về giá trị 0, điều đó sẽ dẫn tới hiện tượng: khi DFT sang miền tần số sẽ có rất
nhiều nhiễu ở tần số cao. Để khắc phục điều này, ta cần làm mượt bằng cách nhân
khung dữ liệu với một vài loại cửa sổ. Có một vài loại cửa sổ phổ biến là Hamming
window, Hanning window... có tác dụng làm giá trị biên khung giảm xuống từ từ.
4
Hình 1.11: Các loại cửa sổ phổ biến
Hình 1.12: Tín hiệu âm thanh khi chập
với các loại cửa sổ khác nhau 4
Hình 1.12 sẽ cho ta thấy rõ được tác dụng của các sửa sổ này. Trong các hình
nhỏ, hình 1 là khung được cắt ra từ âm thanh gốc, âm thanh gốc là sự kết hợp của
hai sóng của hình 2. Nếu cắt trực tiếp, tín hiệu miền tần số tương ứng là hình 3, ta
có thể thấy tín hiệu này chứa rất nhiều nhiễu. Nếu áp dụng các cửa sổ như Hanning,
Hamming, Blackman, tín hiệu miền tần số thu được mượt hơn và tương ứng sóng
gốc ở hình 2.
4
https://jonathan-hui.medium.com
13
Chương 1: Cơ sở lý thuyết
Mỗi khung ta thu được một danh sách các giá trị độ lớn tương ứng với từng tần
số từ 0 → N. Áp dụng trên tất cả các khung, ta đã thu được 1 ảnh phổ như hình
dưới đây. Trục x là trục thời gian, trục y thể hiện dải tần số từ 0 → 10000Hz, giá
trị biên độ tại từng tần số được thể hiện bằng màu sắc. Qua quan sát ảnh phổ này,
ta nhận thấy các tại các tần số thấp thường có biên độ cao và ngược lại.
Tuy nhiên trong nhiều bài toán, đặc biệt là trong bài toán nhận dạng giọng nói,
ảnh phổ không phải là sự lựa chọn hoàn hảo. Vì vậy ta cần thêm vài bước tính toán
để có thể thu được dạng MFCC, tốt hơn, phổ biến hơn, hiệu quả hơn ảnh phổ.
14
Chương 1: Cơ sở lý thuyết
4
Hình 1.14: Bộ lọc thông dải Mel
Sau đó, ta bình phương các giá trị trong ảnh phổ thu được DFT power spectrum.
Sau đó, ta áp dụng một tập các bộ lọc thông dải Mel trên từng khoảng tần số. Giá
trị đầu ra của từng bộ lọc là năng lượng dải tần số mà bộ lọc đó bao phủ được.
Ta thu được Mel-scale power spectrum. Ngoài ra, các bộ lọc dùng cho dải tần thấp
thường hẹp hơn các bộ lọc dùng cho dải tần cao.
Bước 6: Cepstrum
15
Chương 1: Cơ sở lý thuyết
4
Hình 1.16: Quy trình tính Cepstrum
Trong hình 1.15, tín hiệu chúng ta thu được là đồ thị 3, nhưng thông tin quan
trọng chúng ta cần là phần 2 và thông tin cần loại bỏ là phần 1. Để loại bỏ đi thông
tin về F0, ta áp dụng IDFT về miền thời gian, từ đó ta thu được Cepstrum. Khi
đó, với Cepstrum thu được, phần thông tin liên quan tới F0 và phần thông tin liên
quan tới F1, F2, F3 ... nằm tách biệt nhau như 2 phần khoanh tròn trong hình 4.
Ta chỉ cần lấy thông tin trong đoạn đầu của cepstrum (phần được khoanh tròn to
trong hình 4). Để tính MFCC, ta chỉ cần lấy 12 giá trị đầu tiên. Như vậy sau bước
này, ta thu được 12 đặc trưng Cepstral.
Trong nhận dạng tiếng nói, thông tin về bối cảnh và sự thay đổi rất quan trọng.
VD tại những điểm mở đầu hoặc kết thúc ở nhiều phụ âm, sự thay đổi này rất rõ
rệt, có thể nhận dạng các âm vị dựa vào sự thay đổi này. 13 hệ số tiếp theo chính
là đạo hàm bậc 1 (theo thời gian) của 13 đặc trưng đầu tiên. Nó chứa thông tin về
sự thay đổi từ khung thứ t đến khung t + 1, được tính bằng công thức:
c(t + 1) − c(t − 1)
d(t) =
2
trong đó d(t) là đặc trưng delta của khung t, c(t + 1) và c(t − 1) là các đặc trưng
phổ của khung ngay sau và trước khung t.
16
Chương 1: Cơ sở lý thuyết
Tương tự như vậy, 13 giá trị cuối của MFCC là sự thay đổi của d(t) theo thời
gian - đạo hàm của d(t), đồng thời là đạo bậc 2 của c(t), được tính bằng công thức:
d(t + 1) − d(t − 1)
b(t) =
2
Vậy, từ 12 đặc trưng cepstral và đặc trưng năng lượng thứ 13, ta đạo hàm 2
lần và thu được 39 đặc trưng. Đây chính là đặc trưng MFCC. Sự khác biệt chính
giữa 13 và 39 đặc trưng MFCC thường nằm ở mức độ chi tiết của thông tin biểu
diễn. Việc sử dụng 39 đặc trưng MFCC thường cung cấp thông tin đa dạng hơn về
tín hiệu âm thanh, trong khi 13 đặc trưng MFCC thường được sử dụng trong các
trường hợp cần giảm chiều dữ liệu hoặc tài nguyên tính toán.
Học sâu hoạt động bằng cách khám phá các cấu trúc phức tạp trong dữ liệu
mà chúng trải nghiệm. Cụ thể là xây dựng các mô hình tính toán bao gồm
nhiều lớp xử lý, mạng có thể tạo ra nhiều mức trừu tượng để biểu diễn dữ liệu.
Ví dụ, một mô hình học sâu được gọi là mạng neural phức hợp có thể được
đào tạo bằng cách sử dụng số lượng lớn (hàng triệu) hình ảnh, chẳng hạn như
những hình ảnh có chứa mèo. Mạng neural này sẽ học hỏi từ các điểm ảnh có
trong hình ảnh mà nó thu được. Nó có thể phân loại các nhóm điểm ảnh đại
diện cho các đặc điểm của mèo, với các nhóm đặc điểm như móng vuốt, tai và
mắt cho biết sự hiện diện của mèo trong hình ảnh.
17
Chương 1: Cơ sở lý thuyết
Đối với nhiều tác vụ, chẳng hạn như thị giác máy tính, nhận dạng giọng nói
hay xử lý ngôn ngữ tự nhiên, dịch máy và robot, hiệu suất của các hệ thống
học sâu vượt xa so với các hệ thống học máy truyền thống.
Cũng bởi những khả năng vượt trội, việc xây dựng các hệ thống học sâu yêu
cầu nhiều hơn so với các hệ thống học máy thông thường. Trong mô hình học
sâu có hàng nghìn siêu tham số (hyperparameter) cần được điều chỉnh để mô
hình có được hiệu quả cao và áp dụng vào những bài toán thực tế.
5
Hình 1.17: Các kiểu dữ liệu phi cấu trúc phổ biến.
Tự động hóa các tính năng: Một trong những lợi thế khi sử dụng học sâu là
khả năng tự động hóa các tính năng, các thuật toán học sâu có thể tự tạo ra các
tính năng mới từ một số lượng hạn chế ngay trong dữ liệu đào tạo mà không cần
con người can thiệp. Điều này đồng nghĩa với việc học sâu có thể thực hiện những
nhiệm vụ phức tạp đòi hỏi yêu cầu kỹ thuật cao với các tính năng mở rộng.
Khả năng tự học tốt hơn: Các lớp mạng neural trong học sâu cho phép mô
hình trở nên hiệu quả hơn, thực hiện được các tính năng phức tạp, tác vụ tính toán
chuyên sâu. Điều này cũng giúp cho mô hình có thể thực hiện đồng thời nhiều hoạt
động phức tạp. Học sâu thể hiện sự vượt trội hơn, đặc biệt trong các nhiệm vụ nhận
thức máy, còn được gọi là khả năng hiểu được các dữ liệu đầu vào như: hình ảnh,
âm thanh và video giống như con người, liên quan đến các bộ dữ liệu phi cấu trúc.
18
Chương 1: Cơ sở lý thuyết
áp dụng thành công trong xử lý âm thanh. CNN có khả năng trích xuất đặc
trưng từ tín hiệu âm thanh bằng cách sử dụng các lớp tích chập, giúp nhận
dạng mẫu âm thanh và phát hiện cạnh.
Deep Speech: Deep Speech là một kiến trúc học sâu đặc biệt được phát triển
để nhận dạng giọng nói. Nó sử dụng LSTM hoặc GRU để biểu diễn âm thanh
và thường cung cấp hiệu suất rất cao trong các nhiệm vụ nhận dạng giọng
nói.
Cơ chế Attention: Cơ chế attention đang được sử dụng rộng rãi trong các
kiến trúc xử lý âm thanh, đặc biệt là trong các mô hình dựa trên Transformers.
Nó giúp mô hình tập trung vào các phần quan trọng của tín hiệu âm thanh.
6
Hình 1.18: Luồng xử lý của mạng CNN
19
Chương 1: Cơ sở lý thuyết
7
Hình 1.19: Dữ liệu đầu vào và đầu ra của một lớp tích chập
c) Bước nhảy
Bước nhảy (Stride) là số phần tử thay đổi trên ma trận đầu vào. Khi bước nhảy
là 1 thì ta di chuyển các nhân 1 phần tử. Khi bước nhảy là 2 thì ta di chuyển các
bộ lọc nhân đi 2 phần tử và tiếp tục như vậy.
8
Hình 1.20: Lớp tích chập hoạt động với bước nhảy là 2
d) Đường viền
Đường viền (Padding) là một tham số quan trọng được sử dụng để kiểm soát
kích thước của đầu ra sau khi áp dụng lớp tích chập. Có hai loại đường viền chính:
Valid Padding: Không có đường viền được thêm vào xung quanh biểu diễn đầu
vào trước khi áp dụng phép tích chập. Trong trường hợp bộ lọc nhân không
phù hợp với dữ liệu đầu vào, phép tích chập sẽ loại bỏ một số phần tử ở sát
bên phải.
Same Padding: Same padding thêm các giá trị đường viền (thường là giá trị
0) vào xung quanh biểu diễn đầu vào trước khi tích hợp phép tích chập. Same
padding thường được sử dụng khi bạn muốn duy trì kích thước của đầu ra sao
cho nó giống với đầu vào.
7
https://towardsdatascience.com/beginners-guide-to-understanding-convolutional-neural-
networks-ae9ed58bb17d
8
https://medium.com/@RaghavPrabhu/understanding-of-convolutional-neural-network-cnn-
deep-learning-99760835f148
20
Chương 1: Cơ sở lý thuyết
Ưu điểm:
– Tính đơn giản của ReLU giúp tăng tốc quá trình huấn luyện.
– ReLU không bị chặn như hàm Sigmoid hay Tanh nên sẽ không có hiện
tượng vanishing gradient.
Nhược điểm:
– Nếu input nhỏ hơn 0 thì ouput của ReLU sẽ bằng 0 (dying relu) dẫn đến
hiện tượng mạng neural không hoạt động và không học được gì hoặc học
rất chậm.
– ReLu do không bị chặn trên nên có thể gây ra hiện tượng exploding
gradient, gradient của mạng neural trở nên quá lớn, đôi khi đạt đến giá
trị vô cùng, làm cho quá trình đào tạo mạng trở nên không ổn định và
thậm chí không thể thực hiện được.
Vì những nhược điểm trên, người ta đã phát triển thêm những hàm khác dựa
trên ReLU:
9
https://medium.com/@shrutijadon/survey-on-activation-functions-for-deep-learning-
9689331ba092
21
Chương 1: Cơ sở lý thuyết
Hàm ReLU6: ReLu6 đã giới hạn bên trên của hàm ReLU là 6 đối với input
lớn hơn 6. Công thức hàm ReLu6 như sau:
Hàm LeakyReLU: LeakyReLU khăc phục nhược điểm dying relu bằng cách sử
dụng một siêu tham số α. Công thức hàm LeakyReLU như sau:
f (x) = max(αx, x)
10
Hình 1.24: Luồng xử lý của RNN
22
Chương 1: Cơ sở lý thuyết
11
Hình 1.25: Luồng xử lý của LSTM
Input gate i: Cổng vào giúp quyết định bao nhiêu lượng thông tin đầu vào sẽ
ảnh hưởng đến trạng thái mới. Quyết định bằng cách nào, thông qua đặc điểm
của hàm sigmoid (đầu ra nằm trong khoảng [0, 1]), như vậy khi một vector
thông tin đi qua đây, nếu nhân với 0, vector sẽ bị triệt tiêu hoàn toàn. Nếu
nhân với 1, hầu hết thông tin sẽ được giữ lại.
Forget gate f : Cổng quên là cổng quyết định sẽ bỏ đi bao nhiêu lượng thông
tin đến từ trạng thái trước đó.
Output gate o: Cổng ra là cổng điều chỉnh lượng thông tin có thể ra ngoài
yt và lượng thông tin truyền tới trạng thái tiếp theo.
Tiếp theo, g thực chất cũng chỉ là một trạng thái ẩn được tính dựa trên đầu
vào hiện tại xt và trạng thái trước ht−1 . Tính hoàn toàn tương tự như input
gate, chỉ thay vì dùng sigmoid, ta dùng tanh. Kết hợp hai điều này lại để cập
nhật trạng thái mới.
Cuối cùng, ta có ct là bộ nhớ trong của LSTM. Nhìn vào công thức, có thể
thấy nó là tổng hợp của bộ nhớ trước ct−1 đã được lọc qua cổng quên f , cộng
với trạng thái ẩn g đã được lọc bởi cổng vào i. Cell state sẽ mang thông tin
nào quan trọng truyền đi xa hơn và sẽ được dùng khi cần. Đây chính là long
term memory.
Sau khi có ct , ta sẽ đưa nó qua cổng ra để lọc thông tin một lần nữa, thu được
trạng thái mới ht .
23
Chương 1: Cơ sở lý thuyết
Có rất nhiều cách đánh giá một mô hình phân lớp. Tuỳ vào những bài toán khác
nhau mà chúng ta sử dụng các phương pháp khác nhau. Các phương pháp thường
được sử dụng là: Accuracy score, Precision, Recall, ROC curve và Area Under the
Curve, F1 score,...
True Positive (TP): Số lượng các trường hợp được dự đoán đúng là positive.
True Negative (TN): Số lượng các trường hợp được dự đoán đúng là negative.
False Positive (FP): Số lượng các trường hợp được dự đoán là positive nhưng
thực tế là negative.
False Negative (FN): Số lượng các trường hợp được dự đoán là negative nhưng
thực tế là positive.
12
Hình 1.26: Confusion Matrix
trong đó, n là số mẫu nhận dạng đúng và N là tổng số mẫu cần nhận dạng. Từ đó,
ta có thể thấy, mô hình có Accuracy score càng cao thì càng tốt vì sẽ nhận dạng
chính xác nhiều nhất.
12
https://medium.com/@cngnguyn_82011/deep-learning-với-tensorflow-2-0-992e42a84049
24
Chương 1: Cơ sở lý thuyết
TP TP
P recision = Recall =
TP + FP TP + FN
Precision cao đồng nghĩa với việc độ chính xác của các điểm tìm được là cao.
Recall cao đồng nghĩa với việc True Positive Rate cao, tức tỉ lệ bỏ sót các điểm thực
sự positive là thấp.
25
Chương 2
26
Chương 2: Nghiên cứu thực nghiệm
Khối 1: Máy tính hoặc thiết bị điều khiển của người dùng. Người dùng ra lệnh
bằng giọng nói, câu lệnh sẽ được thiết bị thu âm và xử lý. Kết quả đầu ra là
chuỗi văn bản tương ứng với câu lệnh.
Khối 2: Raspberry nhận tín hiệu thông qua giao tiếp socket và mạng internet
để thực hiện các thao tác điều khiển.
27
Chương 2: Nghiên cứu thực nghiệm
Sau các bước thu thập, tiền xử lý, trích xuất đặc trưng của dữ liệu cũng như
chọn được mô hình học sâu phù hợp với nghiên cứu, hệ thống sẽ hoạt động với 7
bước sau:
Bước 1: Khởi động hệ thống bao gồm: Máy tính hoặc thiết bị điều khiển của
người dùng và xe robot.
Bước 2: Thực hiện việc kết nối giữa thiết bị điều khiển và xe thông qua giao
tiếp socket và mạng internet.
Bước 3: Người dùng ra lệnh bằng giọng nói thông qua giao diện người dùng
GUI của thiết bị điều khiển.
Bước 4: Máy tính hoặc thiết bị điều khiển xử lý giọng nói và chuyển đổi thành
văn bản.
Bước 5: Máy tính hoặc thiết bị điều khiển gửi chuỗi văn bản đến xe robot
thông qua giao tiếp socket và mạng internet.
Bước 6: Chương trình trên xe robot điều khiển động cơ tương ứng với câu lệnh
được gửi đến.
Bo mạch đơn Raspberry Pi: Đóng vai trò như một máy tính để nhận tín hiệu
điều khiển xe robot.
Module điều khiển motor L298N: Sử dụng để điều khiển các động cơ của xe
robot thực hiện việc di chuyển (tiến, lùi, rẽ trái, rẽ phải).
2.2.1 Raspberry Pi
a) Giới thiệu
Raspberry Pi là một dòng vi xử lý mạnh mẽ và thiết bị máy tính nhỏ gọn có kích
thước gần bằng một thẻ tín dụng. Nó được phát triển bởi Raspberry Pi Foundation
với mục đích giúp người dùng tiếp cận công nghệ và học tập về lập trình, điện tử
ngay từ những giai đoạn ban đầu.
Raspberry Pi chủ yếu là một bo mạch tích hợp CPU, RAM, cổng kết nối và các
cổng I/O, cung cấp môi trường phát triển linh hoạt để người dùng có thể thực hiện
nhiều dự án khác nhau.
28
Chương 2: Nghiên cứu thực nghiệm
13
Hình 2.3: Bo mạch đơn Raspberry Pi
– Kích thước nhỏ gọn: Raspberry Pi có kích thước gần bằng một thẻ tín
dụng, dễ dàng để lắp đặt và tích hợp vào nhiều dự án.
– Giá cả phải chăng: Raspberry Pi là một lựa chọn phổ biến cho người
dùng muốn tiếp cận công nghệ với chi phí thấp.
– Hỗ trợ đa hệ điều hành: Raspberry Pi có thể chạy nhiều hệ điều hành
khác nhau, từ các phiên bản tùy chỉnh của Linux đến Windows 10 IoT.
– Cộng đồng lớn và hỗ trợ mạnh mẽ: Cộng đồng người dùng năng động và
diễn đàn để hỗ trợ người dùng mới.
Nhược điểm:
Nhờ những ưu điểm tuyệt vời, Raspberry Pi vẫn là một công cụ rất mạnh mẽ và
linh hoạt cho nhiều ứng dụng. Đặc biệt là trong việc học tập, thử nghiệm và phát
triển các dự án điện tử và IoT.
13
https://fptshop.com.vn/tin-tuc/danh-gia/raspberry-pi-172935
29
Chương 2: Nghiên cứu thực nghiệm
14
Hình 2.4: Module L298N
Cầu H là một kiến trúc điều khiển cho phép đảo ngược hướng chuyển động của
động cơ DC bằng cách điều chỉnh dòng điện thông qua nó. Module L298N thường
đi kèm với hai cầu H độc lập, cho phép điều khiển độc lập hai động cơ DC hoặc một
động cơ có hai cực (ví dụ như động cơ servo).
– Điều khiển động cơ hai chiều: L298N cho phép điều khiển động cơ DC
theo cả hai hướng, cho phép chuyển động tiến và lùi.
– Cấp dòng lớn: Nó có khả năng cấp dòng lên đến 2A cho mỗi đường điều
khiển, giúp điều khiển đa dạng loại động cơ DC.
– Dễ sử dụng: L298N có giao diện điều khiển đơn giản, dễ lắp đặt.
Nhược điểm:
– Mất năng lượng: Do cấu trúc của cầu H, L298N có thể tiêu tốn một lượng
năng lượng khá lớn, gây ra sự lãng phí năng lượng trong quá trình điều
khiển.
– Kích thước và trọng lượng: So với các phương pháp điều khiển động cơ
khác như driver đa chức năng, L298N có thể lớn và nặng hơn, không phù
hợp cho các ứng dụng yêu cầu kích thước nhỏ gọn.
Bỏ qua một số nhược điểm, L298N là một giải pháp điều khiển động cơ DC phổ
biến và được sử dụng rộng rãi trong nhiều ứng dụng điện tử, đặc biệt là trong các
dự án mà không yêu cầu hiệu suất cao.
14
https://hshop.vn/products/mach-dieu-khien-dong-co-dc-l298
30
Chương 2: Nghiên cứu thực nghiệm
2.2.3 Motor DC
a) Giới thiệu
Motor DC là một loại động cơ hoạt động từ nguồn điện xoay chiều. Đây thường
là một loại động cơ nhỏ, thường được sử dụng trong các dự án điện tử như robot
nhỏ, mô hình, hoặc các thiết bị cần động cơ để thực hiện các chuyển động cơ bản.
Loại động cơ sử dụng trong nghiên cứu này có có điện áp hoạt động từ 3V đến
6V. Điều này làm cho nó trở nên phù hợp với nhiều ứng dụng cần động cơ nhỏ, yếu
và tiết kiệm năng lượng.
15
Hình 2.5: Động cơ motor DC 3-6V
– Đơn giản và dễ sử dụng: Motor DC 3-6V thường có cấu trúc đơn giản,
dễ lắp đặt và sử dụng.
– Điều chỉnh tốc độ dễ dàng: Có thể điều chỉnh tốc độ quay của motor DC
thông qua việc thay đổi điện áp đưa vào.
– Kích thước nhỏ gọn: Loại motor này thường nhỏ gọn, phù hợp với các
ứng dụng yêu cầu không gian nhỏ.
– Hiệu suất tốt ở mức điện áp thấp: Motor này có khả năng hoạt động tốt
ở mức điện áp thấp, từ 3-6V, giúp tiết kiệm năng lượng.
Nhược điểm:
– Không có hệ thống điều khiển tích hợp: Motor DC 3-6V thường cần sử
dụng thêm các linh kiện khác để điều khiển tốc độ, hướng di chuyển hoặc
các chức năng khác.
– Không giữ tốc độ ổn định: Tốc độ quay của motor có thể bị ảnh hưởng
bởi nhiều yếu tố như tải trọng, điện áp đưa vào, và ma sát.
Mặc dù có một vài nhược điểm, tuy nhiên motor DC 3-6V vẫn là lựa chọn phổ
biến và hữu ích trong nhiều ứng dụng. Điều này đặc biệt đúng khi cần một giải
pháp linh hoạt, dễ sử dụng và không yêu cầu quá nhiều công suất. Nhưng ưu điểm
của motor này giúp nó phù hợp cho nhiều dự án điện tử, robo, và các ứng dụng nhỏ
khác.
15
https://www.amazon.com/Electric-Magnetic-Gearbox-Plastic-Yeeco/dp/B07DQGX369
31
Chương 2: Nghiên cứu thực nghiệm
Tần số lấy mẫu (sample_rate): Đảm bảo rằng tất cả các tệp WAV đều sử
dụng cùng một tần số lấy mẫu là 16 kHz.
Kênh âm thanh: Các tệp âm thanh phải là đơn kênh (mono), và đảm bảo rằng
tất cả các tệp WAV có cùng số lượng kênh.
Độ dài: Mỗi tệp có độ dài 1 giây, ta có thể thêm khoảng lặng để đảm bảo độ
dài của tất cả các tệp âm thanh là như nhau.
Hình 2.6: Các tệp âm thanh xử lý được chia vào các thư mục riêng
32
Chương 2: Nghiên cứu thực nghiệm
Ta khởi tạo một hàm với đầu vào là đường dẫn tới nơi chứa dữ liệu âm thanh
và kết quả đầu ra là các đặc trưng được trích chọn lưu vào một tệp đuôi json (Xem
phụ lục A) như trên hình 2.7. Sau khi đã trích chọn được các đặc trưng từ tập dữ
liệu ban đầu, phần tiếp theo ta sẽ tiến hành thử nghiệm với các mô hình học sâu
khác nhau để có thể tìm ra mô hình hiệu quả nhất cho bài toán.
33
Chương 2: Nghiên cứu thực nghiệm
34
Chương 2: Nghiên cứu thực nghiệm
35
Chương 2: Nghiên cứu thực nghiệm
36
Chương 2: Nghiên cứu thực nghiệm
Hàm split_audio: Hàm này có nhiệm vụ chia một tệp âm thanh thành các
đoạn nhỏ dựa trên yếu tố khoảng lặng giữa các đoạn âm thanh.
Hàm edit_chunk: Không thể đảm bảo rằng các đoạn âm thanh được cắt ra
sẽ có độ dài chính xác là 1 giây, đủ để trích xuất các đặc trưng. Do đó, ta sử
dụng hàm này để tự động thêm một khoảng thời gian im lặng vào cuối của
mỗi đoạn âm thanh. Điều này đảm bảo rằng mỗi đoạn âm thanh có độ dài
chính xác 1 giây mà không ảnh hưởng đến kết quả dự đoán của mô hình trong
quá trình trích xuất đặc trưng.
Hàm process_input: Hàm này được dùng để trích xuất các đặc trưng MFCC
của các tệp âm thanh vừa được xử lý trước đó.
Hàm speech_to_text: Sau khi tiến hành xử lý tín hiệu âm thanh đầu
vào, ta sử dụng hàm này để thực hiện quá trình chuyển đổi âm thanh thành
văn bản. Biến length, là kết quả trả về từ hàm split_audio, được sử dụng
để xác định số lượng đoạn âm thanh cần được xử lý. Điều này giúp hàm
speech_to_text biết được tổng số đoạn âm thanh mà nó cần xử lý. Kết quả
trả về là chuỗi văn bản sau khi đã xử lý tất cả các đoạn âm thanh.
Tải mô hình phân loại: Sử dụng thư viện Keras để tải một mô hình đã được
lưu trữ từ đường dẫn đã chỉ định và gán nó cho biến reconstructed_model.
Thu âm, xử lý và kết nối socket: Ta cũng cần tạo ra một giao diện người
dùng (GUI), cho phép người dùng thu âm câu lệnh. Sau khi thu âm thành
công, chương trình sẽ gọi các hàm đã được khởi tạo từ trước, chuyển đổi âm
thanh thành văn bản và truyền đến bộ xử lý của xe robot thông qua kết nối
socket.
37
Chương 2: Nghiên cứu thực nghiệm
16
Hình 2.11: Mô hình kết nối Socket
Trước tiên ta tạo ra một máy chủ (server) bằng cách mở một socket - Socket()
Sau đó ta sẽ liên kết nó với một máy khách (client) và một cổng (port) - Bind()
Tiếp theo server sẽ bắt đầu kết nối đến port đó - Listen()
Yêu cầu kết nối từ client được gửi tới server - Connect()
Bây giờ cả hai đều có thể gửi và nhận tin tại thời điểm đó - Read()/Write()
Cuối cùng khi hoàn thành server và client tiến hành ngắt kết nối - Close()
Trong nghiên cứu này, ta sử dụng kết nối socket để truyền câu lệnh đã được xử
lý từ thiết bị máy tính đến bo điều khiển Raspberry.
Chương trình 1: Sử dụng các chân GPIO trên Raspberry Pi để điều khiển
động cơ của xe robot.
Chương trình 2: Nhận dữ liệu thông qua kết nối socket để điều khiển hướng
di chuyển của xe robot.
16
https://topdev.vn/blog/socket-la-gi-websocket-la-gi/
38
Chương 2: Nghiên cứu thực nghiệm
17
Hình 2.12: Kết nối động cơ
Ta cần khai báo 6 chân GPIO được sử dụng để điều khiển xe robot, trong đó:
Bốn chân GPIO để điều khiển các mức điện áp để bánh xe xoay thuận chiều
hoặc ngược chiều kim đồng hồ. Điều này giúp xe robot có thể di chuyển tiến
lên hoặc lùi xuống.
Hai chân GPIO để điều khiển tốc độ của các bánh xe, giúp xe có thể di chuyển
trái phải.
17
https://pivietnam.com.vn/huong-dan-cach-dieu-khien-xe-mo-hinh-co-ban-voi-raspberry-pi-
pivietnam-com-vn.html
39
Chương 3
40
Chương 3: Kết quả và nhận xét
41
Chương 3: Kết quả và nhận xét
42
Chương 3: Kết quả và nhận xét
43
Chương 3: Kết quả và nhận xét
44
Chương 3: Kết quả và nhận xét
45
Chương 3: Kết quả và nhận xét
Mô hình Hybrid
Mô hình Hybrid
46
Chương 3: Kết quả và nhận xét
Nhận xét
– Mô hình Hybrid có độ chính xác (Accuracy) cao nhất (0.9475), theo sau
là mô hình LSTM (0.925550), và cuối cùng là mô hình CNN (0.8250).
– Tính đến chỉ số Loss, mô hình Hybrid có giá trị thấp nhất (0.2478), theo
sau là mô hình LSTM (0.2591), và mô hình CNN có giá trị cao nhất
(0.2823).
– Tính đến độ chính xác, thứ tự vẫn giữ nguyên: Hybird (0.9625), LSTM
(0.9375) và CNN (0.8750).
– Tính đến chỉ số Loss, mô hình Hybird vẫn có giá trị thấp nhất (0.2053),
theo sau là LSTM (0.2328), và mô hình CNN có giá trị cao nhất (0.2647).
Có thể thấy rằng giảm LR từ 0.001 xuống 0.0001 đã cải thiện độ chính xác và
giảm giá trị Loss của tất cả các mô hình.
Mô hình Hybird thường có hiệu suất tốt hơn so với mô hình đơn lẻ (CNN hoặc
LSTM) ở cả hai giá trị LR.
Bảng 3.2: Precision và Recall của các mô Bảng 3.3: Precision và Recall của các mô
hình với LR = 0.001 hình với LR = 0.0001
Nhận xét
Đối với Precision (độ chính xác), mô hình Hybrid có kết quả tốt nhất với giá
trị lần lượt là 0.9475 và 0.9625. Tiếp theo là LSTM với giá trị 0.9283 và 0.9458.
CNN có giá trị Precision thấp nhất là 0.8250 và 0.8750. Điều này cho thấy mô
hình Hybrid có khả năng phân loại chính xác cao hơn so với hai mô hình khác.
Về Recall (độ nhớ), mô hình Hybrid cũng đạt được kết quả tốt nhất với giá
trị là 0.9375 và 09625. Tiếp theo là LSTM với giá trị 0.9250 và 0.9375. CNN
có giá trị Recall là 0.8250 và 0.8750 tương ứng. Kết quả này cho thấy mô hình
Hybrid không chỉ có khả năng phân loại chính xác mà còn có khả năng bao
quát, nhớ lại các mẫu dữ liệu tốt hơn so với các mô hình còn lại.
47
Chương 3: Kết quả và nhận xét
Tổng quan, mô hình Hybrid có hiệu suất cao nhất cả về độ chính xác và độ nhớ
trong việc phân loại dữ liệu. LSTM đứng ở vị trí thứ hai trong cả hai chỉ số, trong
khi CNN có hiệu suất thấp nhất trong bảng. Tuy nhiên, đối với các bài toán thực
tế, để có thể hiểu rõ hơn về hiệu suất của mỗi mô hình, chúng ta cần xem xét kết
quả từ nhiều góc độ khác nhau và kết hợp với các chỉ số khác để có cái nhìn toàn
diện về hiệu suất của mô hình.
48
Chương 3: Kết quả và nhận xét
Thành phần 1: Nguồn 12V - 2A được sử dụng để cấp nguồn cho 4 motor DC
3-6V và module L298N.
Thành phần 2: Module L298N được sử dụng để thay đổi tốc độ và chiều quay
của bánh xe.
Thành phần 7: Bo mạch Raspberry được kết nối với module L298N để điều
khiển các động cơ.
https://drive.google.com/file/d/11b4lwMeoq329lyWYXWpnNy1ROzNczhhh/
view?usp=sharing
49
Chương 3: Kết quả và nhận xét
– Tốc độ huấn luyện: Do bộ dữ liệu hiện tại có kích thước nhỏ và số lượng
nhãn cần phân biệt không đặc biệt lớn, mô hình được huấn luyện một
cách nhanh chóng, phù hợp cho mục đích nghiên cứu.
– Chất lượng mô hình: Mô hình Hybrid thể hiện độ chính xác cao, đáp ứng
tốt yêu cầu của bài toán là phân loại các câu lệnh điều khiển khác nhau.
– Tuy nhiên, trong những bài toán cần phân loại nhiều nhãn hơn, đòi hỏi
sự cần thiết của một bộ dữ liệu lớn hơn và sự áp dụng các phương pháp
tăng cường dữ liệu để cải thiện hiệu suất của mô hình.
– Độ trễ gửi tin: Hệ thống gần như không trải qua độ trễ đáng kể do dung
lượng thông tin truyền đi nhỏ.
– Bo mạch Raspberry xử lý tốt các câu lệnh được gửi xuống để điều khiển
xe. Tuy nhiên, trong trường hợp bài toán yêu cầu cần tích hợp mô hình
vào bo mạch, ta cần sử dụng nhưng bo mạch có cấu hình cao hơn.
– Xe robot di chuyển đúng hướng theo các câu lệnh khác nhau. Tuy nhiên
do động cơ không có sẵn chức năng xoay bánh nên việc rẽ trái rẽ phải
còn gặp nhiều khó khăn. Trong những bài toán thực tế cần độ chính xác
cao trong việc di chuyển, ta có thể cân nhắc sử dụng các motor khác có
nhiều chứ năng hơn
50
Kết luận
Thông qua nghiên cứu này, tôi đã thành công trong việc phát triển một hệ thống
điều khiển xe robot thông qua giọng nói. Trong đó, hệ thống bao gồm những thành
phần quan trọng sau:
Mô hình học sâu: Được áp dụng để phân loại các câu lệnh khác nhau dựa
trên giọng điều khiển của người sử dụng. Mô hình ổn định, tốc độ xử lý nhanh,
và đạt được độ chính xác cao.
Phương thức truyền tin: Hệ thống được thiết kế để sử dụng giao tiếp socket,
nhằm truyền các chuỗi văn bản đến bộ xử lý trên xe robot với độ trễ thấp.
Trong tương lai, hệ thống trên hoàn toàn có thể xây dựng thêm những cải tiến
khác như:
Xử lý hiệu năng: Tối ưu hóa thuật toán và cấu trúc mô hình để giảm độ trễ
và tăng hiệu suất, đồng thời đảm bảo tính ổn định trong môi trường thời gian
thực.
Hỗ trợ nhiều ngôn ngữ: Mở rộng hệ thống để hỗ trợ nhiều ngôn ngữ khác
nhau, tạo ra một giao diện đa ngôn ngữ cho người sử dụng để điều khiển xe
robot.
Điều chỉnh tương thích nguồn âm thanh: Cải thiện khả năng xử lý và
chuyển đổi giọng từ các nguồn âm thanh khác nhau, bao gồm cả âm thanh
trong điều kiện nhiễu loạn hoặc môi trường ồn ào.
Xử lý lệnh phức tạp: Mở rộng khả năng của mô hình để hiểu và xử lý các
lệnh phức tạp, ví dụ như chuỗi lệnh hoặc chỉ đạo chi tiết.
Học từ dữ liệu thực tế: Sử dụng dữ liệu thực tế từ môi trường thực tế của
xe robot để huấn luyện mô hình, giúp cải thiện khả năng đối mặt với các tình
huống thực tế.
Bảo mật và riêng tư: Tăng cường các biện pháp bảo mật và quyền riêng tư
để đảm bảo an toàn và sự yên tâm khi sử dụng hệ thống.
51
Tài liệu tham khảo
[3] Paulo Hubert, Rebecca Killick, Alexandra Chung and Linilson R Padovese
(2019), “A Bayesian binary algorithm for root mean squared-based acoustic
signal segmentation”, The Journal of the Acoustical Society of America, 146(3),
1799 - 1807.
[4] F. Gouyon, F. Pachet and O. Delerue (2000), “On the Use of Zero-Crossing
Rate for an Application of Classification of Percussive Sounds”, Proceedings of
the COST G-6 Conference on Digital Audio Effects (DAFX-00), Vol 5.
[5] Wei Han; Cheong-Fat Chan; Chiu-Sing Choy; Kong-Pang Pun (2006), “An effi-
cient MFCC extraction method in speech recognition”, 2006 IEEE International
Symposium on Circuits and Systems (ISCAS).
[6] Shikha Gupta, Jafreezal Jaafar, Wan Fatimah wan Ahmad and Arpit Bansal
(2013), “Feature Extraction Using MFCC”, Signal & Image Processing : An
International Journal (SIPIJ), 4(4), pp. 101 - 108.
[9] F. Demir, D. A. Abdullah, A. Sengur (2020), “A New Deep CNN Model for
Environmental Sound Classification”, IEEE Access, 8, pp. 66529-66537.
[10] C. Thomae, A. Dominik (2016) “Using deep gated RNN with a convolutio-
nal front end for end-to-end classification of heart sound”, 2016 Computing in
Cardiology Conference (CinC 2016), Vancouver, BC, Canada, pp. 625-628.
25 if len(mfcc) == num_mfcc_vectors_per_segment:
26 data["mfcc"].append(mfcc.tolist())
27 data["labels"].append(i-1)
28 print("{}".format(file_path))
29
30 with open(json_path, "w") as fp:
31 json.dump(data, fp, indent=4)
1 save_mfcc(DATASET_PATH, JSON_PATH)
1 DATA_PATH = "model_robot/data_sound.json"
2
3 def load_data(data_path):
4 with open(data_path, "r") as f:
5 data = json.load(f)
6
7 X = np.array(data["mfcc"])
8 y = np.array(data["labels"])
9
10 print("Data succesfully loaded!")
11 return X, y
1 X, y = load_data(DATA_PATH)
2
3 # create train, validation and test split
4 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size
=0.2)
5 X_train, X_validation, y_train, y_validation = train_test_split(
X_train, y_train, test_size=0.2)
6
7 # add an axis to input sets
8 X_train = X_train[..., np.newaxis]
9 X_validation = X_validation[..., np.newaxis]
10 X_test = X_test[..., np.newaxis]
Phụ lục A
1 model_cnn = keras.Sequential()
2 model_cnn.add(keras.layers.Conv2D(8,(2,2),activation=’relu’,
input_shape=input_shape))
3 model_cnn.add(keras.layers.Conv2D(16,(3,3),activation=’relu’))
4 model_cnn.add(keras.layers.Flatten())
5 model_cnn.add(keras.layers.Dense(64,activation=’relu’))
6 model_cnn.add(keras.layers.Dropout(0.3))
7 model_cnn.add(keras.layers.Dense(4,activation=’softmax’))
Lưu ý: Đoạn lệnh tham khảo, chỉnh sửa tham số để phù hợp với mô hình.
Mô hình LSTM
1 model_cnn = keras.Sequential()
2
3 model_cnn.add(keras.layers.LSTM(128, input_shape=input_shape,
return_sequences=True))
4 model_cnn.add(keras.layers.LSTM(64))
5 model_cnn.add(keras.layers.Dense(16, activation=’relu’))
6 model_cnn.add(keras.layers.Dropout(0.3))
7 model_cnn.add(keras.layers.Dense(4, activation=’softmax’))
Lưu ý: Đoạn lệnh tham khảo, chỉnh sửa tham số để phù hợp với mô hình.
Mô hình Hybrid
15
16 model_lstm = TimeDistributed(Flatten())(FC2)
17 model_lstm = LSTM(64, return_sequences=True)(model_lstm)
18 att_out=attention()(model_lstm)
19
20 output = Dense(4, activation= ’softmax’)(att_out)
21
22 model_cnn = Model(inputs= [input_shape], outputs= output)
Lưu ý: Đoạn lệnh tham khảo, chỉnh sửa tham số để phù hợp với mô hình.
Phụ lục B
1 def split_audio(wav_file):
2 file_path= r’G:\Python\Lenh_dieu_khien\Audio_Mic\Audio_Split’
3
4 sound_file = AudioSegment.from_wav(file_path + wav_file)
5 audio_chunks = split_on_silence(sound_file, min_silence_len=100,
silence_thresh=-70)
6 length = 0
7
8 for i, chunk in enumerate(audio_chunks):
9 out_file = file_path + "\chunk{0}.wav".format(i)
10 chunk.export(out_file, format="wav")
11 length += 1
12
13 return int(length)
Hàm edit_chunk
1 def edit_chunk(length):
2 start_time = 0
3 end_time = 1000
4
5 one_sec_segment = AudioSegment.silent(duration=1000)
6 for i in range(0, length):
7 song = AudioSegment.from_wav(’Audio_Split’ + ’/’ + ’chunk’ + str(i)
+ ’.wav’)
8 final_song = song + one_sec_segment
9 final_song = final_song[start_time:end_time]
10 final_song.export(’Audio_Split’ + ’/’ + ’edit_chunk’ + str(i) + ’.
wav’)
Hàm process_input
1 def process_input(audio_file):
2 SAMPLE_RATE = 16000
3 NUM_MFCC = 13
Phụ lục B
4 N_FTT=2048
5 HOP_LENGTH=512
6 TRACK_DURATION = 1 # measured in seconds
7 SAMPLES_PER_TRACK = SAMPLE_RATE * TRACK_DURATION
8
9 samples_per_segment = int(SAMPLES_PER_TRACK)
10 signal, sample_rate = librosa.load(audio_file, sr=SAMPLE_RATE)
11 mfcc = librosa.feature.mfcc(signal, sample_rate, n_mfcc=NUM_MFCC,
n_fft=N_FTT, hop_length=HOP_LENGTH)
12 mfcc = mfcc.T
13
14 return mfcc
Hàm speech_to_text
1 def speech_to_text(length):
2
3 stt = ’’
4
5 for i in range(0, length):
6 new_input_mfcc = process_input(r’G:\Python\Lenh_dieu_khien\
Audio_Mic\Audio_Split\edit_chunk’ + str(i) + ’.wav’)
7
8 X_to_predict = new_input_mfcc[np.newaxis, ..., np.newaxis]
9 X_to_predict.shape
10
11 prediction = reconstructed_model.predict(X_to_predict)
12 predicted_index = np.argmax(prediction, axis=1)
13
14 stt += word_dict[int(predicted_index)] + ’ ’
15 return stt
Hàm delete_files_in_directory
1 def delete_files_in_directory(directory_path):
2 try:
3 files = os.listdir(directory_path)
4 for file in files:
5 file_path = os.path.join(directory_path, file)
6 if os.path.isfile(file_path):
7 os.remove(file_path)
8 print("All files deleted successfully.")
9 except OSError:
10 print("Error occurred while deleting files.")
1 path = r’G:\Python\Lenh_dieu_khien\model_robot’
Phụ lục B
1 import tkinter as tk
2 import threading
3 from denoise import AudioDeNoise
4 from socket import socket, AF_INET, SOCK_DGRAM
5
6 file_path = r’G:\Python\Lenh_dieu_khien\Audio_Mic\Audio_Split’
7 SERVER_IP = ’192.168.1.2’
8 PORT_NUMBER = 5000
9 SIZE = 1024
10 print ("Test client sending packets to IP {0}, via port {1}\n".format(
SERVER_IP, PORT_NUMBER))
11 mySocket = socket( AF_INET, SOCK_DGRAM )
12
13 class VoiceRecorder:
14 def __init__(self):
15 self.root = tk.Tk()
16 self.root.resizable(False, False)
17 self.button = tk.Button(text = " ", font = ("Arial", 120, "bold"),
command = self.click_handler)
18 self.button.pack()
19 self.output = tk.Text(self.root, height = 5, width = 41,)
20 self.output.pack()
21 self.recording = False
22 self.root.mainloop()
23
24 def click_handler(self):
25 if self.recording:
26 self.recording = False
27 self.button.config(fg = "black")
28 else:
29 self.recording = True
30 self.button.config(fg = "red")
31 threading.Thread(target = self.record).start()
32
33 def record(self):
34 recorder = PvRecorder(device_index=0, frame_length=512)
35 audio = []
36 recorder.start()
37
38 while self.recording:
39 frame = recorder.read()
40 audio.extend(frame)
41
42 recorder.stop()
43 with wave.open(file_path + ’\sound.wav’, ’w’) as f:
Phụ lục B
24 speed *=100
25 turn *=70
26 leftSpeed = speed-turn
27 rightSpeed = speed+turn
28
29 if leftSpeed>100: leftSpeed =100
30 elif leftSpeed<-100: leftSpeed = -100
31 if rightSpeed>100: rightSpeed =100
32 elif rightSpeed<-100: rightSpeed = -100
33 #print(leftSpeed,rightSpeed)
34 self.pwmA.ChangeDutyCycle(abs(leftSpeed))
35 self.pwmB.ChangeDutyCycle(abs(rightSpeed))
36 if leftSpeed>0:GPIO.output(self.In1A,GPIO.HIGH);GPIO.output(self.
In2A,GPIO.LOW)
37 else:GPIO.output(self.In1A,GPIO.LOW);GPIO.output(self.In2A,GPIO.
HIGH)
38 if rightSpeed>0:GPIO.output(self.In1B,GPIO.HIGH);GPIO.output(self.
In2B,GPIO.LOW)
39 else:GPIO.output(self.In1B,GPIO.LOW);GPIO.output(self.In2B,GPIO.
HIGH)
40 sleep(t)
41
42 def stop(self,t=0):
43 self.pwmA.ChangeDutyCycle(0);
44 self.pwmB.ChangeDutyCycle(0);
45 self.mySpeed=0
46 sleep(t)
Lưu ý: Đoạn lệnh tham khảo, cần chỉnh sửa tham số để phù hợp với thực tế.