You are on page 1of 49

Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Ngay khi phát minh ra máy tính, con người đã mơ ước máy tính có thể nói
chuyện với mình. Yêu cầu đơn giản nhất là máy có thể xác định được từ ngữ mà
chúng ta nói với máy. Đó là mục tiêu của ngành nhận dạng tiếng nói.
Đối với con người, việc nghe, nhất là nghe tiếng mẹ đẻ là một vấn đề khá
đơn giản. Còn đối với máy tính, xác định một chuỗi tín hiệu âm thanh là sự phát
âm của một từ nào hoàn toàn không đơn giản, khó khăn cũng như việc học nghe
ngoại ngữ của chúng ta.
Lĩnh vực nhận dạng tiếng nói đã được nghiên cứu hơn 4 thập kỉ và hiện nay
mới chỉ có một số thành công. Có thể kể đến hệ thống nhận dạng tiếng Anh (ví
dụ: phần mềm Via Voice của IBM, hệ thống nhận dạng tiếng nói tích hợp của
OfficeXP…). Các hệ thống này hoạt động khá tốt (cho độ chính xác khoảng 90 -
95%) nhưng còn xa mới đạt đến mức mơ ước của chúng ta: có một hệ thống có
thể nghe chính xác và hiểu hoàn toàn những điều ta nói.
Riêng với tiếng Việt, lĩnh vực nhận dạng tiếng nói còn khá mới mẻ. Chưa
hề thấy xuất hiện một phần mềm nhận dạng tiếng Việt hoàn chỉnh trên thị trường.
Số công trình nghiên cứu về nhận dạng tiếng nói tiếng Việt được công bố rất
hiếm hoi, và kết quả còn hạn chế về bộ từ vựng, độ chính xác…. Tiếng Việt có
nhiều đặc tính khác với các ngôn ngữ đã được nghiên cứu nhận dạng nhiều như
tiếng Anh, tiếng Pháp. Do đó việc nghiên cứu nhận dạng tiếng Việt là rất cần
thiết.
Vì những lí do trên, tôi chọn đề tài “Tìm hiểu một số phương pháp nhận
dạng tiếng nói và xây dựng hệ nhận dạng tiếng nói các chữ số tiếng Việt bằng
mạng nơron trên môi trường Matlab”, nhằm nghiên cứu các phương pháp nhận
dạng tiếng nói đối với tiếng Việt và thử nghiệm xây dựng một hệ thống nhận
dạng cỡ nhỏ.
Khoá luận gồm có 5 chương:
1. Chương 1 trình bày tổng quan về nhận dạng tiếng nói, nhận dạng tiếng
nói tiếng Việt và một số phương pháp nhận dạng phổ biến.
2. Chương 2 trình bày về môi trường Matlab.
3. Chương 3 trình bày về trích chọn đặc trưng cho nhận dạng.
4. Chương 4 trình bày sơ lược về mạng nơron và toolbox NetLab cho
mạng nơron trên môi trường Matlab.

KHOÁ LUẬN TỐT NGHIỆP TRANG 1


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

5. Chương 5 trình bày quá trình tiến hành và một số kết quả nghiên cứu
xây dựng hệ nhận dạng tiếng nói các chữ số tiếng Việt trên môi trường
Matlab.
Mặc dù hết sức cố gắng nhưng do khả năng còn hạn chế cộng với những
vấn đề về thời gian, phương tiện, công cụ... nên kết quả nghiên cứu còn khá
khiêm tốn. Hy vọng rằng trong tương lai tôi sẽ có điều kiện hơn để tiếp tục
nghiên cứu đề tài này.
Em xin chân thành cảm ơn thầy Đặng Văn Chuyết (khoa CNTT ĐHBK Hà
Nội), cô Hồ Cẩm Hà, thầy Nguyễn Tân Ân, thầy Lê Minh Hoàng, thầy Ðào Việt
Cường, thầy Trần Đăng Hưng cùng các thầy cô giáo khoa CNTT ĐHSP Hà Nội
đã tận tình chỉ bảo, góp ý và giúp đỡ, tạo điều kiện cho em trong quá trình nghiên
cứu.
Cảm ơn anh Nguyễn Tiến Dũng (Viện CNTT), em Đinh Ngọc Thắng và các
bạn ở trung tâm FYT, các bạn cùng lớp, cùng khoa đã động viên và giúp đỡ tài
liệu, phương tiện để tôi hoàn thành nghiên cứu này.

KHOÁ LUẬN TỐT NGHIỆP TRANG 2


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

KHOÁ LUẬN TỐT NGHIỆP TRANG 3


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Hiểu một cách đơn giản, nhận dạng tiếng nói (speech recognition by
machine) là dùng máy tính chuyển đổi tín hiệu ngôn ngữ từ dạng âm thanh thành
dạng văn bản. Nói một cách chính xác hơn: nhận dạng tiếng nói là phân chia
(segmentation) và đính nhãn ngôn ngữ (labeling) cho tín hiệu tiếng nói.
Nhận dạng tiếng nói có nhiều ứng dụng:
• . Là ứng dụng được sử dụng nhiều nhất trong các hệ nhận dạng. Thay
vì nhập liệu bằng tay thông qua bàn phím, người sử dụng nói với máy
qua micro và máy xác định các từ được nói trong đó.
• . Chẳng hạn hệ thống cho phép máy tính nhận lệnh điều khiển bằng
giọng nói của con người như: “chạy chương trình”, “tắt máy”… Một
số ưu điểm của việc sử dụng tiếng nói thay cho các thiết bị vào chuẩn
như bàn phím, con chuột là: thuận tiện, tốc độ cao, không bị ảnh
hưởng của cáp, khoảng cách, không đòi hỏi huấn luyện sử dụng...
• . Một số hệ thống (chẳng hạn ở máy điện thoại di động) cho phép
người sử dụng đọc tên người trong danh sách thay vì bấm số. Một số
hệ thống khác (ở ngân hàng, trung tâm chứng khoán…) thực hiện việc
trả lời tự động đối với các các cuộc gọi hỏi về tài khoản…
• …
Tuy nhiên vấn đề nhận dạng tiếng nói gặp rất nhiều khó khăn. Một số khó
khăn chủ yếu là:
• Tiếng nói là tín hiệu thay đổi theo thời gian. Mỗi người có một giọng
nói, cách phát âm khác nhau... Thậm chí một người phát âm cùng một
từ mà mỗi lần khác nhau cũng không giống nhau (chẳng hạn về tốc
độ, âm lượng...)
• Các phương pháp nhận dạng hiện tại của máy tính khá “máy móc”,
còn xa mới đạt đến mức độ tư duy của con người.
• Nhiễu là thành phần luôn gặp trong môi trường hoạt động của các hệ
thống nhận dạng và ảnh hưởng rất nhiều đến kết quả nhận dạng.
Do những khó khăn đó, nhận dạng tiếng nói cần tri thức từ rất nhiều từ
ngành khoa học liên quan:
• : tìm hiểu các phương pháp tách các thông tin đặc trưng, ổn định từ tín
hiệu tiếng nói, giảm ảnh hưởng của nhiễu và sự thay đổi theo thời gian
của tiếng nói.

KHOÁ LUẬN TỐT NGHIỆP TRANG 4


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

• : tìm hiểu mối quan hệ giữa tín hiệu tiếng nói vật lí với các cơ chế sinh
lí học của việc phát âm và việc nghe của con người.
• : nghiên cứu các thuật toán để phân lớp, huấn luyện và so sánh các
mẫu dữ liệu...
• : nghiên cứu các mô hình thống kê, xác suất; các thuật toán tìm kiếm,
mã hoá, giải mã, ước lượng các tham số của mô hình…
• : tìm hiểu mối quan hệ giữa ngữ âm và ngữ nghĩa, ngữ pháp, ngữ cảnh
của tiếng nói.
• : tìm hiểu các cơ chế bậc cao của hệ thống nơron của bộ não người
trong các hoạt động nghe và nói.
• : nghiên cứu các thuật toán, các phương pháp cài đặt và sử dụng hiệu
quả các hệ thống nhận dạng trong thực tế.

Phương pháp ngữ âm - âm vị học dựa trên lý thuyết âm vị: lí thuyết này khẳng
định sự tồn tại hữu hạn và duy nhất các đơn vị ngữ âm cơ bản trong ngôn ngữ nói
gọi là âm vị, được phân chia thành: nguyên âm - phụ âm, vô thanh-hữu thanh, âm
vang -âm bẹt… Các âm vị có thể xác định bởi tập các đặc trưng trong phổ của
tín hiệu tiếng nói theo thời gian (độc giả có thể tham khảo thêm ở [10]).
Đặc trưng quan trọng nhất của âm vị là formant. Đó là các vùng tần số có
cộng hưởng cao nhất của tín hiệu. Ngoài ra còn một số đặc trưng khác như âm
vực (cao độ - pitch), âm lượng…
Hệ thống nhận dạng dựa trên phương pháp này sẽ tách các đặc trưng từ tín
hiệu tiếng nói và xác định chúng tương ứng với âm vị nào. Sau đó, dựa vào một
từ điển phiên âm, máy sẽ xác định chuỗi các âm vị đó có khả năng là phát âm của
từ nào nhất.
Xét khía cạnh nguyên lí, phương pháp có vẻ rất đơn giản. Tuy nhiên các thử
nghiệm trong thực tế cho thấy phương pháp cho kết quả nhận dạng không cao.
Nguyên nhân từ những vấn đề sau:
• Phương pháp cần rất nhiều tri thức về ngữ âm học, nhất là các tri thức
liên quan đến đặc tính âm học của các âm vị. Mà những tri thức này
nhìn chung còn chưa được nghiên cứu đầy đủ.
• formant chỉ ổn định đối với các nguyên âm, với phụ âm formant rất
khó xác định và không ổn định. Hơn nữa việc xác định các formant
cho độ chính xác không cao. Đặc biệt khi chịu ảnh hưởng của nhiễu
(là vấn đề thường xảy trong thực tế).

KHOÁ LUẬN TỐT NGHIỆP TRANG 5


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

• Rất khó phân biệt các âm vị dựa trên phổ, nhất là các phụ âm vô
thanh. Có một số phụ âm rất giống nhiễu (ví dụ: /s/, /h/).

Phương pháp nhận dạng mẫu dựa vào lý thuyết xác suất - thống kê để nhận dạng
dựa trên ý tưởng: so sánh đối tượng cần nhận dạng với các mẫu được thu thập
trước đó để tìm mẫu "giống" đối tượng nhất.
Như vậy hệ thống nhận dạng sẽ trải qua 2 giai đoạn:
1) thực hiện các nhiệm vụ: thu thập mẫu, phân lớp và huấn luyện hệ thống
ghi nhớ các mẫu đó.

Thu thập, tiền xử Huấn luyện cơ


Nguồn vào Cơ cấu nhận dạng
lý cấu nhận dạng
Dữ liệu huấn luyện

Đặc trưng
Trích chọn đặc
Phân lớp Mẫu dữ liệu huấn luyện
trưng

Minh hoạ: Sơ đồ giai đoạn huấn luyện của phương pháp đối sánh mẫu

2) : nhận vào đối tượng cần nhận dạng, so sánh với các mẫu và đưa ra kết
quả là mẫu giống đối tượng nhất.

Thu thập, tiền xử Lựa chọn lớp,


Nguồn vào Kết quả
lý hậu xử lý
Đối tượng cần nhận dạng

Thông tin phân lớp

Trích chọn đặc Cơ cấu nhận


Đặc trưng
trưng dạng

Minh hoạ: Sơ đồ giai đoạn nhận dạng của phương pháp đối sánh mẫu

Phần lớn các hệ nhận dạng thành công trên thế giới là sử dụng phương pháp
này. Phương pháp có những ưu điểm sau:

KHOÁ LUẬN TỐT NGHIỆP TRANG 6


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

1. Sử dụng đơn giản, dễ hiểu, mang tính toán học cao (lý thuyết xác suất
thống kê, lý thuyết máy học, …)
2. Ít bị ảnh hưởng của những biến thể về bộ từ vựng, tập đặc trưng, đơn vị
nhận dạng, môi trường xung quanh…
3. Cho kết quả cao. Điều này đã được kiểm chứng trong thực tế.

Phương pháp trí tuệ nhân tạo nghiên cứu cách học nói và học nghe của con
người, tìm hiểu các quy luật ngữ âm, ngữ pháp, ngữ nghĩa, ngữ cảnh… và tích
hợp chúng bổ sung cho các phương pháp khác để nâng cao kết quả nhận dạng.
Chẳng hạn có thể thêm các hệ chuyên gia (expert system), các luật logic mờ
(fuzzy logic) về ngữ âm, âm vị… vào các hệ nhận dạng tiếng nói dựa trên
phương pháp ngữ âm-âm vị học để tăng độ chính xác cho việc xác định các âm vị
(vấn đề đã được đề cập là rất khó nếu chỉ sử dụng các thông tin về âm phổ ).
Hay đối với các hệ nhận dạng mẫu, người ta cải tiến bằng cách với mỗi đối
tượng cần nhận dạng, hệ thống sẽ chọn ra một số mẫu “giống” đối tượng nhất,
sau đó sẽ kiểm chứng tiếp các kết quả đó bằng các luật ngữ pháp, ngữ nghĩa, ngữ
cảnh… để xác định mẫu phù hợp nhất.
Hiện nay đang có một phương pháp trí tuệ nhân tạo trong nhận dạng tiếng
nói được nghiên cứu rộng rãi là mạng nơron. Tuỳ vào cách sử dụng, mạng nơron
có thể coi là mở rộng của phương pháp nhận dạng mẫu hoặc phương pháp ngữ
âm-âm vị học. Do những đặc tính của mình (được trình bày kĩ ở phần 2), mạng
nơron được hi vọng sẽ tăng cường hiệu quả của các hệ nhận dạng tiếng nói.
Mạng nơron là phương pháp được chúng tôi nghiên cứu xây dựng hệ nhận
dạng trình bày trong khoá luận này.

Một đặc điểm dễ thấy là tiếng Việt là ngôn ngữ đơn âm (monosyllable - mỗi
từ đơn chỉ có một âm tiết), không biến hình (cách đọc, cách ghi âm không thay
đổi trong bất cứ tình huống ngữ pháp nào). Tiếng Việt hoàn toàn khác với các
ngôn ngữ Ấn-Âu như tiếng Anh, tiếng Pháp là các ngôn ngữ đa âm, biến hình.
Theo thống kê trong tiếng Việt có khoảng 6000 âm tiết. Nhìn về mặt ghi
âm: âm tiết tiếng Việt có cấu tạo chung là: phụ âm-vần. Ví dụ âm tin có phụ âm t,
vần in. Phụ âm là một âm vị và âm vị này liên kết rất lỏng lẻo với phần còn lại
của âm tiết (hiện tượng nói lái).
Vần trong tiếng Việt lại được cấu tạo từ các âm vị nhỏ hơn, trong đó có một
âm vị chính là nguyên âm.

KHOÁ LUẬN TỐT NGHIỆP TRANG 7


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Hình sau là phổ tín hiệu của âm tiết “ba”. Chúng ta có thể quan sát và phân
biệt rõ miền nhiễu nền, miền phổ của phụ âm b và nguyên âm a (miền đậm hơn
là có mật độ năng lượng lớn hơn).

Minh hoạ: Phổ tín hiệu của âm tiết “ba”, có miền nhiễu nền (silence), miền tín hiệu của
phụ âm /b/ và nguyên âm /a/ (miền đậm hơn là có mật độ năng lượng lớn hơn).

Quan sát phổ các âm tiết tương tự chúng ta có thể rút ra kết luận: các phụ
âm và nguyên âm đều phân biệt với nhau rất rõ qua sự phân bố năng lượng tại
các miền tần số, ví dụ: phụ âm ở tần số thấp, năng lượng nhỏ, nguyên âm có năng
lượng lớn ở cả vùng tần số cao. Vùng không có tín hiệu tiếng nói (nhiễu nền và
khoảng lặng) có năng lượng thấp và chỉ tập trung ở các tần số rất thấp.
Các nguyên âm có tần phổ (spectrum) khác nhau khá rõ. Hình sau minh hoạ
sự khác nhau về phổ của 5 nguyên âm cơ bản. Miền đậm là miền có mật độ năng
lượng cao.

Minh hoạ: Sự khác nhau về phổ của 5 nguyên âm cơ bản. Miền đậm là miền có mật độ

KHOÁ LUẬN TỐT NGHIỆP TRANG 8


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

năng lượng cao (vùng có formant).

Theo tác giả Đoàn Thiện Thuật ([3]), xét về mặt ngữ âm-âm vị học âm tiết
tiếng Việt có lược đồ như sau:
Thanh điệu
Âm đầu Vần
Âm đệm Âm chính Âm cuối
Lược đồ cho thấy âm tiết tiếng Việt có cấu trúc rõ ràng, ổn định. Lược đồ
còn cho thấy tiếng Việt là ngôn ngữ có thanh điệu. Hệ thống thanh điệu gồm 6
thanh: bằng, huyền, sắc, hỏi, ngã, nặng.
Thanh điệu trong âm tiết là âm vị siêu đoạn tính (thể hiển trên toàn bộ âm
tiết). Do đó đặc trưng về thanh điệu thể hiện trong tín hiệu tiếng nói không rõ nét
như các thành phần khác của âm tiết.
Sự khác biệt về cách phát âm tiếng Việt rất rõ rệt theo giới, lứa tuổi và đặc
biệt là theo vị trí địa lí (giọng miền Bắc, miền Trung và miền Nam khác nhau rất
nhiều).

Những đặc điểm ngữ âm tiếng Việt cho thấy nhận dạng tiếng nói tiếng Việt
có một số thuận lợi sau:
• Tiếng Việt là ngôn ngữ đơn âm, số lượng âm tiết không quá lớn. Điều
này sẽ giúp hệ nhận dạng xác định ranh giới các âm tiết dễ dàng hơn
nhiều. Đối với hệ nhận dạng các ngôn ngữ Ấn-Âu (tiếng Anh, tiếng
Pháp...) xác định ranh giới âm tiết (endpoint detection) là vấn đề rất
khó và ảnh hưởng lớn đến kết quả nhận dạng.
• Tiếng Việt là ngôn ngữ không biến hình từ. Âm tiết tiếng Việt ổn định,
có cấu trúc rõ ràng. Đặc biệt không có 2 âm tiết nào đọc giống nhau
mà viết khác nhau. Điều này sẽ dễ dàng cho việc xây dựng các mô
hình âm tiết trong nhận dạng; đồng thời việc chuyển từ phiên âm sang
từ vựng (lexical decoding) sẽ đơn giản hơn so với các ngôn ngữ Ấn-
Âu. Theo [10], việc chuyển từ phiên âm sang từ vựng cũng là một vấn
đề khó khăn trong nhận dạng các ngôn ngữ Ấn-Âu.

Ngoài những thuận lợi trên, nhận dạng tiếng nói tiếng Việt cũng gặp rất
nhiều khó khăn như sau:
• Tiếng Việt là ngôn ngữ có thanh điệu (6 thanh). Thanh điệu là âm vị
siêu đoạn tính, đặc trưng về thanh điệu thể hiện trong tín hiệu tiếng
nói không rõ nét như các thành phần khác của âm tiết.

KHOÁ LUẬN TỐT NGHIỆP TRANG 9


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

• Cách phát âm tiếng Việt thay đổi nhiều theo vị trí địa lí. Giọng địa
phương trong tiếng Việt rất đa dạng (mỗi miền có một giọng đặc
trưng).
• Hệ thống ngữ pháp, ngữ nghĩa tiếng Việt rất phức tạp, rất khó để áp
dụng vào hệ nhận dạng với mục đích tăng hiệu năng nhận dạng. Hệ
thống phiên âm cũng chưa thống nhất.
• Các nghiên cứu về nhận dạng tiếng Việt cũng chưa nhiều và ít phổ
biến.

KHOÁ LUẬN TỐT NGHIỆP TRANG 10


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Matlab (Matrix Laboratory) là một môi trường trợ giúp tính toán và hiển thị
rất mạnh được hãng MathWorks phát triển. Mức phát triển của Matlab ngày nay
đã chứng tỏ Matlab là một phần mềm có giao diện cực mạnh cùng nhiều lợi thế
trong kĩ thuật lập trình để giải quyết những vấn đề đa dạng trong nghiên cứu
KHKT.
Phần tử tính toán cơ bản của Matlab là các ma trận. Giao diện cơ sở của
Matlab là các dòng lệnh. Ngoài thư viện các hàm tính toán, vào-ra, đồ hoạ… cơ
bản, Matlab còn có các toolbox là các thư viện cho từng lĩnh vực cụ thể. Ví dụ có
toolbox cho xử lí tín hiệu (Signal Processing), mô phỏng mô hình (SimulLink),
logic mờ (Fuzzy Logic), mạng nơron (NNet), … thậm chí cho cả thiết kế máy
bay (Aerospace) hay giải phương trình vi phân (PDE)…
Matlab cũng hỗ trợ lập trình và cho phép tích hợp thư viện do người dùng
xây dựng. Câu lệnh của Matlab được viết rất sát các mô tả kĩ thuật nên lập trình
trên Matlab nhanh và đơn giản hơn so với các ngôn ngữ thông dụng như Pascal,
Fortran… Cú pháp lập trình của Matlab giống C nên không quá khó học. Đặc
biệt Matlab còn có các giao thức để liên kết với các môi trường lập trình khác,
nhất là VC++, chẳng hạn cho phép dịch các hàm trong Matlab thành các chương
trình nguồn C/C++ hoặc hỗ trợ các thư viện DLL từ bên ngoài.
Do những điểm mạnh như vậy của Matlab, chúng tôi quyết định sẽ dùng
Matlab để phát triển hệ nhận dạng của mình.

KHOÁ LUẬN TỐT NGHIỆP TRANG 11


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Giao diện làm việc thường gặp của Matlab như sau:

Giống như các môi trường khác như AutoCAD, để thao tác với Matlab, ta
gõ lệnh trên cửa sổ lệnh hoặc sử dụng menu. Phần tiếp theo của chương sẽ trình
bày về cách sử dụng lệnh trong Matlab.

Lệnh trong Matlab có thể phân loại theo chức năng như sau:
• Lệnh thực hiện chức năng cơ bản của Matlab. Ví dụ: lệnh để gọi trợ
giúp, để gọi trình biên dịch của Matlab…
• Lệnh gọi hàm và gọi script.
• Lệnh thao tác biến (hiển thị, gán trị…).
Sau đây là ví dụ một số lệnh trong Matlab. Đoạn lệnh sau thực hiện việc
tính toán khoảng cách 2 điểm:
>>p1 = [1 2];
>>p2 = [3 4];
>>v = p2 - p1;
>>d = norm(vt)

Sau khi Matlab thực hiện xong đoạn lệnh (xem hình minh hoạ), ta rút ra
một số nhận xét:

KHOÁ LUẬN TỐT NGHIỆP TRANG 12


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

• . Dấu nhắc này do Matlab sinh ra, ta không cần phải gõ vào. Sau này
để đơn giản trong các phần sau câu lệnh Matlab chúng tôi sẽ thêm
không phần dấu nhắc nữa.
• . Nếu không có dấu thì Matlab hiển thị kết quả tính toán (đôi khi rất
dài và làm chậm hệ thống), còn nếu có dấu thì Matlab không hiển thị.
• . Ma trận được mô tả từng dòng một, giữa các dòng cách nhau bởi dấu
giữa các phần tử trên cùng một dòng cách nhau bởi dấu phân tách như
dấu cách, tab... Ví dụ mô tả ma trân [1 2; 3 4]. (Chú ý mỗi dòng phải
có số phần tử bằng nhau). Trong đoạn trình này p1, p2 là 2 ma trận
1x2 mô tả toạ độ 2 điểm. v=p2-p1 là vector tạo bởi 2 điểm p1, p2.
• Câu lệnh d = norm(vt) là câu lệnh gán trị, đồng thời là câu lệnh gọi
hàm: là hàm lấy chuẩn của vector.
Bảng sau liệt kê một số lệnh cơ bản của Matlab:
clc Xoá cửa sổ lệnh.
Clf Xoá cửa sổ đồ hoạ.
exit, quit Thoát khởi Matlab.
help <tên lệnh, Trợ giúp về tên lệnh, hàm.
hàm...>
pause Tạm dừng, ấn phím bất kì để tiếp tục
disp Hiển thị biến hoặc xâu
Ctrl+C Thoát khỏi lệnh đang thực thi (trong trường hợp
chạy quá lâu hoặc lập trình sai nên không thoát
được).
Gọi lại các lệnh ở phía trên.

Phần tử không thể thiếu trong Matlab, cũng như trong các ngôn ngữ lập
trinh là
: chỉ gồm chữ cái, chữ số, dấu gạch dưới, dài không quá 19 kí tự, phân biệt
chữ hoa, chữ thường.
Để khai báo và khởi tạo biến, ta dùng lệnh gán. Khi gán biến cho một ma
trận, nếu biến chưa tồn tại, Matlab sẽ tạo ra biến mới có kích thước bằng ma trận
đó và gán giá trị của ma trận cho biến. Thường ta hay dùng các lệnh x=[]; hay
x=zeros(m,n) để khởi tạo biến (Xem thêm phần 2.3.2.về các ma trận đặc biệt
để hiểu tác dụng của mỗi lệnh).
Ta có thể nhập giá trị trực tiếp cho biến thông qua lệnh gán và hàm input. , .

KHOÁ LUẬN TỐT NGHIỆP TRANG 13


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Toàn bộ các biến đang sử dụng được gọi là không gian làm việc
(workspace) của Matlab. Sau khi thoát khỏi Matlab thì chúng bị xoá. Để làm việc
với dữ liệu được nhiều lần ta phải ghi (save) và nạp (load) các biến đó. Ngoài ra
ta còn có nhu cầu chia xẻ dữ liệu giữa Matlab và các môi trường khác. Matlab
cung cấp chức năng Save và Load để thực hiện các yêu cầu này.
Matlab ghi các biến (không nhất thiết là toàn bộ không gian làm việc) ra các
file có cấu trúc khác nhau: file text ASCII và file nhị phân MAT. Thường chúng
ta ghi dưới dạng file nhị phân, trong trường hợp cần trao đổi dữ liệu chúng ta sẽ
ghi dưới dạng text.
Matlab có khả năng nạp dữ liệu từ nhiều khuôn dạng, ngoài kiểu file text và
file MAT, Matlab còn có thể đọc các file ảnh, file âm thanh, file CSDL, file Excel
để lấy ra các thông tin cần thiết.
Ghi và đọc dữ liệu qua file trong Matlab có thể thực hiện qua 2 lệnh save và
load, cũng có thể thực thi bằng chọn menu. Trong trường hợp ta chắc chắn được
cấu trúc của file dữ liệu thì nên dùng lệnh cho nhanh, trong trường hợp không rõ
(thường xảy ra khi nhập từ file của các môi trường khác) ta nên dùng menu vì
máy cần chúng ta cung cấp và xác định cấu trúc file.
Cú pháp của lệnh save, load:
Save <filename> Ghi toàn bộ không gian làm việc vào file
.MAT có tên là <filename>
Save <filename> x Ghi biến x vào file .MAT có tên là <filename>
Save <filename> x y z Ghi các biến x,y,z vào file .MAT có tên là
<filename>
Load <filename> Đọc các biến trong file .MAT có tên là
<filename> vào không gian làm việc.
Load <filename> x Đọc giá trị của biến x từ file .MAT có tên là
<filename>
Load <filename> x y z Đọc giá trị các biến x,y,z từ file .MAT có tên
là <filename>
Nếu lệnh Load, Save có tham số -ASCII thì Matlab đọc/ghi file theo cấu trúc
text.

KHOÁ LUẬN TỐT NGHIỆP TRANG 14


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Trong Matlab một bảng m dòng, n cột gọi là một ma trận m×n. Vector là ma
trận một dòng hoặc một cột. Vô hướng là ma trận 1×1 (tương đương với một giá
trị). Matlab hỗ trợ các kiểu vô hướng: thực, phức, kí tự.
Xâu (chuỗi - string) trong Matlab là một vector có các phần tử kiểu kí tự.
Ngoài ma trận 2 chiều như trên, Matlab còn hỗ trợ ma trận nhiều chiều (mỗi
phần tử của ma trận khi đó không phải là một vô hướng mà là một vector hay
một ma trận). .
Do có thể coi vector và vô hướng là các ma trận đặc biệt nên từ đây nếu chỉ
nói “ma trận”, ta ngầm hiểu đó có thể là vector, vô hướng. Để cho dễ thấy hơn,
trong khoá luận này, tên biến vô hướng thường được viết thường, tên vector, ma
trận thường được viết hoa.
Kí pháp định nghĩa ma trận trong Matlab là cặp [ ]. Ma trận được mô tả
từng dòng một, giữa các dòng cách nhau bởi dấu giữa các phần tử trên cùng một
dòng cách nhau bởi dấu phân tách như dấu cách, tab...
1 2 3
 
Ví dụ ma trận 4 5 6 được mô tả trong Matlab là .
7 8 8

Phần tử dòng i, cột j của ma trận A viết là A(i,j). Nếu chỉ viết A(i) thì
Matlab hiểu đó là A(1,i). Còn để xác định vector dòng i của ma trận A thì phải
viết là A(i,:); tương tự để xác định vector cột j của A thì viết là A(:,j). Kí hiệu ở
đây hiểu là “tất cả”.

Viết trong Matlab Ý nghĩa


[] Ma trận rỗng
eye(n) Ma trận đơn vị cấp n
zeros(m,n) Ma trận toàn phần tử 0 cỡ m×n
ones(m,n) Ma trận toàn phần tử 1 cỡ m×n
a:b Vector các phần tử từ a đến b, độ lệch là 1 hay -1 tuỳ thuộc
a lớn hơn hay nhỏ hơn b. Ví dụ 1:5 sinh ra vector [1 2 3
4 5]; 3.6:2 sinh ra vector [3.6 2.6].
a:d:b Vector các phần tử thực từ a đến b, với khoảng chia d.
Ví dụ 1:0.5:3.1 sinh ra vector [1.0 1.5 2 2.5 3.0]

Bảng sau mô tả các phép toán thực hiện với 2 giá trị vô hướng. Cột kết quả
môt tả cho trường hợp a=3; b=1.2

KHOÁ LUẬN TỐT NGHIỆP TRANG 15


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Viết trong Matlab Ý nghĩa Kết quả


a+b Cộng 2 giá trị 4.2
a-b Trừ 2 giá trị 2.8
a*b Nhân 2 giá trị 3.6
a/b Chia 2 giá trị 2.5
a^b Luỹ thừa ab. 3.7372
Thứ tự ưu tiên toán tử trong Matlab giống như các ngôn ngữ lập trình: ưu
tiên cao nhất là dấu ngoặc, tiếp đến là phép luỹ thừa rồi nhân chia trước, cộng
trừ sau từ trái sang phải.

Ví dụ: nếu gán B=A*3; A là một ma trận cỡ m×n thì B cũng là một ma trận
cỡ m×n và B(i,j)=A(i,j) 3.

Các phép toán với vector thực hiện với 2 vector cùng cỡ, kết quả là một
vector cùng cỡ, trong đó mỗi phần tử của vector kết quả là kết quả của phép toán
giữa 2 phần tử tương ứng của 2 vector ban đầu.
Tức là nếu C=A.^B thì C(i)=A(i)^B(i).
Trong bảng sau cột kết quả ứng với A=[4 3]; B=[2 1]
Viết trong Matlab Ý nghĩa Kết quả
A+B Cộng vector [6 4]
A-B Trừ vector [2 2]
A.*B Nhân vector [8 3]
A./B Chia vector [2.0 3.0]
A.^B Luỹ thừa [16 3]
Ngoài ra ta còn thực hiện được các phép toán đó giữa một vector và một vô
hướng (như đã trình bày ở phần về các phép toán với vô hướng).

Với 2 ma trận cùng cỡ, ta có thể thực hiện các phép toán như các phép toán
với vector ở trên (kết quả cũng là một ma trận cùng cỡ, mỗi phần tử là kết quả
của phép toán với 2 phần tử tương ứng).
Viết trong Matlab Ý nghĩa

KHOÁ LUẬN TỐT NGHIỆP TRANG 16


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

A+B Cộng, trừ, nhân,


A-B chia, lấy luỹ thừa 2
A.*B ma trận cùng kích
thước như phép
A./B
toán vector.
A.^B
Ngoài ra ta còn thực hiện được các phép toán đó giữa một ma trận và một
vô hướng (như đã trình bày ở phần về các phép toán với vô hướng)..
Matlab còn có các phép toán sau đối với các ma trận:

A*B Nhân 2 ma trận A(m,n) và B(n,p), được ma trận C(m,p)


mà các phần tử xác định bởi:
n
C(i, j) = ∑ A(i, k ) * B(k , j)
k =1

A*B’ Tích vô hướng 2 vector dòng A,B có cùng số phần tử.


A’ Ma trận chuyển vị của A. Nếu gán B=A’ và A cỡ m×n thì
B có cỡ n×m và B(i,j)=A(j,i).
A(i,:) Vector dòng i.
A(:,j) Vector cột j.
A(x,y) Trích ma trận con: x,y là 2 vector mô tả chỉ số dòng và
cột. A(x,y) là ma trận con trong đó các phần tử là các
phần tử của A có chỉ số dòng và cột mô tả trong x và y.
Tức là nếu gán B=A(x,y) thì B(i,j)=A(x(i),y(j)).
Có thể dùng thêm kí hiệu : để lấy toàn bộ dòng hoặc cột.
reshape(A,m,n) Định dạng lại ma trận A thành ma trận m dòng, n cột
rot90(A,k) Quay ma trận A 90o, ngược chiều kim đồng hồ k lần.
A^k Luỹ thừa ma trận: tính ma trận Ak (nhân A k lần), chỉ áp
dụng với ma trận vuông.
inv(A) Cho ma trận nghịch đảo của A. Chỉ áp dụng với ma trận
vuông
triu(A),tril(A) Cho ma trận tam giác trên/dưới của A.

Matlab có các hàm toán học thông dụng như lượng giác, logarit... để tính
toán. Đối số của hàm là vô hướng hoặc ma trận (vector là trường hợp đặc biệt

KHOÁ LUẬN TỐT NGHIỆP TRANG 17


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

của ma trận). Nếu đối số là ma trận thì kết quả là một ma trận cùng cỡ mà mỗi
phần tử của ma trận này có giá trị tương ứng với các phần tử ma trận đã cho.

abs(x) Cho giá trị tuyệt đối của x. Nếu x là số


phức thì cho môđun của x.
sqrt(x) Căn bậc 2. Nếu muốn lấy căn bậc n thì viết
x.^(1/n)
round(x), fix(x), Cho kết quả là số nguyên tương ứng: gần
floor(x), ceil(x) x, gần 0, gần -∞ và gần +∞ nhất.
rem(x,y) Cho phần dư của phép chia x/y, tức là x
mod y. x div y chính là floor(x/y)
exp(x) ex.
log(x), log10(x) lnx, lgx (tương ứng).
sin(x), cos(x), tan(x) Các hàm lượng giác sin, cos, tg. x lấy đơn
vị radian.
asin(x), acos(x), Các hàm lượng giác arcsin, arccos, arctang
atan(x)
atan2(x,y) Cho arctg của y/x trong khoảng -π đến π,
tuỳ thuộc vào dấu của x,y

Các hàm sau thực hiện cho vector, nếu đối số là ma trận thì kết quả là
vector mà mỗi phần tử tính toán tương ứng với các cột của ma trận.

sum(X) Tính tổng các phần tử của vector X.


mean(X) Tính trung bình cộng các phần tử của vector X.
[xm id] =max(X); Tìm phần tử lớn nhất/nhỏ nhất của X. xm là giá trị,
[xm id] =min(X); id là chỉ số.
norm(X, p) Tính chuẩn bậc p của ma trận hay vector X, mặc
định là bậc 2.
length(X) Cho số phần tử của X.
[m n]= size(A) Cho kích thước ma trận A.

Matlab có một số hàm xử lí âm thanh sau:

[y Đọc tín hiệu âm thanh từ file wav cho bởi xâu


fs]=wavread(wavfile) wavfile, y là vector mô tả tín hiệu âm thanh
(có giá trị thực từ 0 đến 1), fs là tần số lấy mẫu

KHOÁ LUẬN TỐT NGHIỆP TRANG 18


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

(giá trị nguyên)


wavwrite(y,fs,wavfile Ghi tín hiệu âm thanh từ file wav cho bởi xâu
) wavfile, y là vector mô tả tín hiệu âm thanh, fs
là tần số lấy mẫu.
sound(y) Phát âm thanh ra loa, y là vector mô tả tín hiệu
âm thanh.
y=wavrecord(n, fs) Ghi âm (từ micro) với tần số lấy mẫu fs và n
mẫu. Kết quả là vector y.
Đoạn lệnh sau ghi âm trong 2 giây với tần số
lấy mẫu 8kHz, phát lại rồi ghi vào file:
y=wavrecord(16000,8000);
sound(y);
wavwrite(y,8000,‘temp.wav’);

Khác với các ngôn ngữ lập trình thông dụng, Matlab cho phép tính toán trực
tiếp với số phức. Ngoài các phép toán thông thường giống số thực như cộng, trừ,
nhân, chia, với số phức còn có một số phép toán và hàm sau. Cột kết quả viết ví
dụ đối với .
Viết trong Matlab Ý nghĩa Kết quả
real(x) Phần thực a
imag(x) Phần ảo b
conj(x) Số phức liên hợp a-bi
abs(x) môđun a 2 + b2
angle(x) argument arctg(b/a)
i,j Kí hiệu đơn bị ảo. −1
Cách viết phép toán và gọi hàm với số thực và số phức hoàn toàn giống
nhau. Các phép toán hay hàm nào thực hiện được với số phức cho kết quả là số
phức tương ứng.

Matlab hỗ trợ 2 chế độ hoạt động: hoạt động theo giao diện dòng lệnh hoặc
theo chương trình. Giao diện dòng lệnh cho phép người dùng gõ lệnh và máy
hiển thị kết quả trong cửa sổ lệnh (có thể tham khảo một số lệnh ở phần 1.3). Tuy
nhiên để nâng cao hiệu qủa sử dụng Matlab thì phải lập trình.

KHOÁ LUẬN TỐT NGHIỆP TRANG 19


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Chương trình trong Matlab có 2 dạng: script (kịch bản) hoặc function
(hàm). Chương trình nguồn Matlab được lưu vào các file text có phần mở rộng là
.m ( gọi là các m-file) và tên chương trình được xác định qua tên file.
Script và function đều là dãy các lệnh Matlab. Có một khác biệt cơ bản:
hàm có thể nhận đối số và trả lại kết quả, còn script thì không. Khi gõ lệnh chứa
tên hàm hay kịch bản, máy sẽ thực thi dãy các lệnh tương ứng trong chương trình
nguồn như là chúng được gõ trong cửa sổ lệnh (nếu là lệnh gọi hàm thì còn thêm
các thao tác truyền tham số vào-ra, tạo và huỷ biến địa phương…)
Sau đây là ví dụ về hàm dtcv, được lưu trong chương trình nguồn đặt tên
là dtcv.m, thực hiện tính toán diện tích và chu vi hình chữ nhật với tham số vào là
2 cạnh a,b.
function [s, p] = dtcv(a,b)
% Ham tinh dien tich va chu vi hinh chu nhat
s=a*b; p = 2*(a+b);

1. Hàm phải được bắt đầu bằng từ khoá function, sau đó lần lượt là tham
số đầu ra, dấu , tên hàm, dấu , các đối số (tham số đầu vào) và dấu .
Nếu có nhiều tham số đầu vào thì chúng phải viết cách nhau bằng dấu ,
Nếu có nhiều tham số đầu ra thì chúng cũng phải viết cách nhau bằng dấu ,
và có cặp dấu [ ] bao ngoài.
2. Chú thích trong Matlab là chú thích trên dòng. Bắt đầu bằng kí tự %, sau
đó cho đến hết dòng là nội dung chú thích.
Nếu chú thích viết ngay sau khai báo hàm thì khi dùng lệnh help <tên
hàm>, nội dung phần chú thích đó sẽ được Matlab hiển thị.

3. Các kết quả của hàm được xác định qua các tham số đầu ra. Vì vậy trong
thân hàm phải có các dòng lệnh gán giá trị cho chúng.
4. Ngoại trừ các tham số vào/ra, tất cả các biến bên trong hàm đều là biến
địa phương. Chúng được tạo khi có lệnh gán đầu tiên và bị xóa sau khi kết thúc
hàm. Ngược lại, biến trong script thì luôn là biến toàn cục.
5. Lời gọi hàm:
Lệnh gọi hàm có dạng như khai báo hàm, chỉ khác là không được có dấu ;
giữa các tham số đầu ra.
[<các tham số đầu ra>]=<tên hàm>(các tham số đầu vào)

KHOÁ LUẬN TỐT NGHIỆP TRANG 20


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Tuy nhiên Matlab cho phép số tham số đầu vào, đầu ra ít hơn số tham số
hình thức. Người lập trình cần dùng 2 hàm nargin và nargout để xác định số đầu
vào, đầu ra thực sự trong lời gọi hàm (chú ý: .
Chẳng hạn ta có thể dùng lời gọi hàm sau để tính diện tích và chu vi hình
chữ nhật kích thước 4×3:
[dt cv] = dtvc(4,3)

Nếu chỉ quan tâm đến diện tích ta có thể gọi:


dt = dtvc(4,3)

Tuy nhiên trình tự truyền tham số của hàm trong Matlab là từ trái sang, vì
vậy nếu chỉ cần kết quả là chu vi, không quan tâm đến diện tích ta vẫn phải gọi
hàm như câu lệnh đầu tiên, không thể dùng câu lệnh sau:
cv = dtvc(4,3)

Vì nếu gọi như vậy, cv sẽ bị gán giá trị 12 của diện tích.
So sánh với các ngôn ngữ khác chúng ta có một số nhận xét:
• Matlab cho phép hàm trả lại nhiều kết quả.
• Matlab cho phép số tham số thực sự ít hơn số tham số hình thức.
• Matlab không xác định kiểu của tham số hình thức và kiểm tra kiểu
của tham số thực sự. Người lập trình phải tự xác định lấy.

Các cấu trúc điều khiển của Matlab nhìn chung giống Pascal, ngoại trừ đặc
điểm là không có cấu trúc khối begin end nên thường các cấu trúc điều khiển
trong Matlab cho phép có nhiều câu lệnh con và kết thúc bằng end.

Lệnh gán trong Matlab là dấu =, có dạng:


<biến>=<biểu thức>

Khi thực hiện lệnh gán, nếu <biến> chưa tồn tại thì Matlab sẽ tạo ra biến có
kiểu và kích thước trùng với <biểu thức>, sau đó gán giá trị của <biểu thức> cho
biến. Ở đây: <biểu thức> có thể là: kí pháp định nghĩa ma trận, lời gọi hàm, biến,
phép toán với các biểu thức khác...

Matlab có một số lệnh rẽ nhánh sau:


1/ Lệnh if đơn
Cú pháp:

KHOÁ LUẬN TỐT NGHIỆP TRANG 21


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

if <biểu thức logic>


<nhóm lệnh>
end;

Thực thi:
Lệnh này kiểm tra giá trị của <biểu thức logic>, nếu kết quả là đúng
(khác 0) thì thực hiện <nhóm lệnh>.
2/ Lệnh if else
Cú pháp:
if <biểu thức logic>
<nhóm lệnh 1>
else
<nhóm lệnh 2>
end;

Thực thi:
Lệnh này kiểm tra giá trị của <biểu thức logic>, nếu kết quả là đúng
(khác 0) thì thực hiện <nhóm lệnh 1>, ngược lại thì thực hiện <nhóm lệnh
2>.

3/ Lệnh if elseif
Cú pháp
if <biểu thức logic 1>
<nhóm lệnh 1>
elseif <biểu thức logic 2>
<nhóm lệnh 2>
end;

Thực thi:
Dùng elseif thì tương tự như dùng else sau đó có một câu lệnh if:
if <biểu thức logic 1>
<nhóm lệnh 1>
else

KHOÁ LUẬN TỐT NGHIỆP TRANG 22


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

if <biểu thức logic 2>


<nhóm lệnh 2>
end;
end;

Tuy nhiên dùng elseif thì chương trình sáng sủa hơn, không phải thêm các
từ khoá end ở cuối.

Matlab có 2 loại lệnh lặp: lệnh for và lệnh while.


1/ Lệnh for
Cú pháp:
for <chỉ số> = <biểu thức>
<nhóm lệnh>
end;

Trong đó <chỉ số> là một biến, <biểu thức> là vector, ma trận hoặc giá
trị vô hướng.
Quy tắc sử dụng:
• Nếu <biểu thức> là ma trận rỗng thì vòng for không thực hiện.
• Nếu <biểu thức> là giá trị vô hướng (ma trận 1x1) thì <chỉ số> được
gán bằng giá trị vô hướng đó và <nhóm lệnh> thực hiện đúng một
lần.
• Nếu <biểu thức> là một vector (ma trận nx1 hoặc 1xn) thì <nhóm
lệnh> thực hiện n lần, mỗi lần <chỉ số> nhận một phần tử của vector
(từ trái sang phải).
• Nếu <biểu thức> là một ma trận (ma trận mxn) thì <nhóm lệnh> thực
hiện m lần, mỗi lần <chỉ số> nhận một vector cột của ma trận (từ trái
sang phải).

2/ Lệnh while
Cú pháp:
while <biểu thức>
<nhóm lệnh>

KHOÁ LUẬN TỐT NGHIỆP TRANG 23


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

end;

Thực thi:
• Nếu <biểu thức> đúng thì thực hiện <nhóm lệnh>.
• Thực hiện xong lại quay lại kiểm tra <biểu thức> và thực hiện <nhóm
lệnh> cho đến khi nhóm lệnh sai.
• .

Như ở mục trên ta thấy trong các cấu trúc điều khiển, ta luôn cần các biểu
thức logic. Trong Matlab giá trị 0 được coi là sai (false) còn mọi giá trị khác 0
được coi là đúng (true) (giống như trong C).
Ở các ngôn ngữ lập trình thông thường ta chỉ gặp các biểu thức logic có giá
trị là một vô hướng (chỉ là đúng/sai), nhưng trong Matlab thì biểu thức logic có
giá trị là một ma trận (mà giá trị vô hướng là một trường hợp đặc biệt: ma trận 1×
1).

Matlab có các phép toán quan hệ sau với 2 ma trận cùng cỡ:

< Nhỏ hơn A<B


<= Nhỏ hơn hoặc bằng A(1,2)<B(3,4)
> Lớn hơn A>3
>= Lớn hơn hoặc bằng
== Bằng nhau (chú ý: khác với dấu = là toán tử
gán; == là toán tử so sánh).
~= Khác nhau

Phép so sánh ma trận với vô hướng có kết quả là một ma trận cùng cỡ,
trong đó mỗi phần tử của ma trận này là kết qủa so sánh tương ứng phần tử của
ma trận với vô hướng: là 1 nếu đúng, là 0 nếu sai.
Ví dụ: nếu viết lệnh C=A>3; trong đó A,C là các ma trận mxn thì c cũng là
một ma trận mxn, C(i,j)=1 nếu A(i,j)>3 và bằng 0 trong trường hợp ngược lại.
Phép so sánh 2 ma trận cùng cỡ (2 giá trị vô hướng là 2 ma trận 1x1) có kết
quả là một ma trận cùng cỡ, trong đó mỗi phần tử là kết qủa so sánh tương ứng 2
phần tử của 2 ma trận: là 1 nếu đúng, là 0 nếu sai.

KHOÁ LUẬN TỐT NGHIỆP TRANG 24


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Ví dụ: nếu viết lệnh C=A>B; trong đó A,B là các ma trận mxn thì C cũng là
một ma trận mxn, C(i,j)=1 nếu A(i,j)>B(i,j) và bằng 0 trong trường hợp ngược
lại.

Phép toán logic trong Matlab hợp lệ nếu kết hợp 2 trận cùng kích thước chỉ
toàn các phần tử 0 và 1. Kết quả của phép toán logic là một ma trận cùng kích
thước mà mỗi phần tử là kết quả phép toán logic tương ứng của từng phần tử 2
ma trận ban đầu.

& Phép and logic a>=0 & a<=3


| Phép or logic a>b | a<c
~ Phép not logic ~(a>=0 & a<=3)

Bảng kết quả phép toán logic (đối với vô hướng)


a b ~a a|b a&b
false false true false false
false true true true false
true false false true false
true true false true true

Matlab hỗ trợ nhiều hàm cho giá trị logic. Sau đây là một số hàm:
Lời gọi hàm Ý nghĩa
any(x) Chỉ cho giá trị true (1) nếu tồn tại một phần tử của x khác 0
all(x) Chỉ cho giá trị true (1) nếu tất cả các phần tử của x khác 0.
isempty(x) Trả lại true (1) nếu x là ma trận rỗng.
isstr(x) Trả lại true (1) nếu x là một xâu (ma trận kí tự).
find(x) Kết quả là một vector cột chứa chỉ số các phần tử khác 0 của x.
Nếu x là một ma trận thì

KHOÁ LUẬN TỐT NGHIỆP TRANG 25


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Quá trình nhận dạng mẫu (cả ở pha huấn luyện hay pha nhận dạng) đều trải
qua bước giai đoạn là trích chọn đặc trưng (feature extraction). Bước này thực
hiện các phân tích phổ (spectral analysis) nhằm xác định các thông tin quan
trọng, đặc trưng, ổn định của tín hiệu tiếng nói, tối thiểu hoá ảnh hưởng của
nhiễu; xúc cảm, trạng thái, cách phát âm của người nói; giảm khối lượng dữ liệu
cần xử lí...
Mặc dù không mang tính quyết định nhưng giai đoạn trích chọn đặc trưng
ảnh hưởng rất lớn đến hiệu năng nhận dạng. Vì vậy việc lựa chọn đặc trưng cho
tín hiệu tiếng nói rất quan trọng.
Có nhiều phương pháp trích chọn đặc trưng đã và đang được sử dụng
(FBA, MFCC, LPC, PLP...). Mỗi phương pháp có những ưu điểm và nhược điểm
riêng. Hiện nay MFCC (Mel-scale Frequency Cepstral Coefficient) được sử dụng
phổ biến nhất. Vì vậy chúng tôi sử dụng MFCC làm đặc trưng của hệ nhận dạng
được trình bày trong khoá luận này.
Nội dung tiếp theo của chương này trình bày về phương pháp tính đặc trưng
MFCC và toolbox VoiceBox của Matlab dùng trong xử lí tiếng nói.

Các hệ nhận dạng tiếng nói thường tách đặc trưng từ tín hiệu bằng cách:
chia tín hiệu thành các đoạn độ dài 5-15 ms, mỗi đoạn gọi là một khung (frame).
Trong khoảng thời gian ngắn như vậy, phổ của tín hiệu đủ ổn định để tiến hành
tách đặc trưng. Mỗi frame sẽ cho đặc trưng là một vector và đặc trưng của toàn
bộ tín hiệu sẽ là một dãy vector.
MFCC là phương pháp trích đặc trưng dựa trên đặc điểm cảm thụ tần số âm
của tai người: tuyến tính đối với tần số nhỏ hơn 1kHz và phi tuyến đối với tần số
trên 1kHz (theo thang tần số mel, không phải theo Hz).
(theo [12]). Vì lẽ đó rất nhiều hệ thống nhận dạng tiếng nói sử dụng MFCC
làm đặc trưng.

Đối với phương pháp MFCC, việc tính đặc trưng có sơ đồ như sau:

KHOÁ LUẬN TỐT NGHIỆP TRANG 26


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Phân khung Tính toán


Tín hiệu tiếng nói Năng lượng
và cửa sổ hoá năng lượng

Biến đổi Lấy đạo hàm


Fourier Delta MFCC
rời rạc

MFCC
Lọc qua bộ
lọc mel-scale

Biến đổi
Lấy logarit MFCC
Fourier ngược

Minh hoạ: Sơ đồ khối của quá trình trích chọn đặc trưng MFCC

Quá trình tính toán như sau: đầu tiên tín hiệu tiếng nói được chia thành các frame
có độ dài 10ms. Mỗi frame sẽ được nhân với một hàm cửa sổ, thường là cửa sổ
Hamming sau đó được chuyển sang miền tần số nhờ biến đổi Fourier. Tín hiệu ở
miền tần số được nhân với các bộ lọc mel-scale, lấy logarit rồi biến đổi Fourier
ngược (để chuyển sang miền cepstral) sẽ được các hệ số MFCC.
Một số hệ thống có tính thêm năng lượng (cũng lấy logarit) và đặc trưng
delta (đạo hàm rời rạc theo thời gian của MFCC) nhằm thêm thông tin cho các
pha sau của quá trình nhận dạng.
Các mục sau trình bày từng bước quá trình tính toán đặc trưng MFCC.

Tín hiệu tiếng nói x[n] gồm L mẫu được sau khi được chia thành các khung
độ rộng 10ms (ứng với fs*0.01 mẫu) sẽ được cửa sổ hoá bằng cách nhân tín hiệu
với môt hàm cửa sổ độ rộng N.
x (n ) = x t (n ) * w (n ); n = 0..N − 1
Hàm cửa sổ thường được dùng là hàm cửa sổ Hamming:
2πn
w (n ) = 0.54 − 0.46 × cos( ) ; n = 0..N - 1
N

Tín hiệu (của một frame) sau khi nhân với hàm cửa sổ, được chuyển sang
miền tần số bằng biến đổi Fourier rời rạc:
N −1 i 2 πkn

X (k ) = ∑ x (n ).e N
; k = 0..N − 1
n =0

KHOÁ LUẬN TỐT NGHIỆP TRANG 27


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Các bộ lọc mel-scale là các bộ lọc tam giác, đặt cách đều nhau trong miền
tần số nhỏ hơn 1kHz và khoảng cách tăng theo hàm mũ trong miền từ 1kHz đến
fs/2 (một nửa của tần số lấy mẫu).

Minh hoạ: Các bộ lọc mel-scale tam giác (triangle mel-scale filters)

Với M bộ lọc đó, ta hoàn toàn xác định được hệ số nhân h i(k) của mỗi bộ lọc. Kết
quả lọc đối với tín hiệu ở miền tần số qua các bộ lọc được tính như sau:
N −1
F(i) = ∑ h i (k ). | X(k ) |; i = 1..M
k =0

Chú ý: X(k) là số phức nhưng thông tin về pha của X(k) không quan trọng
nên ta chỉ tính kết quả lọc với modun của X(k).
Việc nhân tín hiệu ở miền tần sốvới các bộ lọc mel-scale để chuyển biểu
diễn miền tần số từ thang Hz sang thang mel.

Lấy logarit của tín hiệu ở miền tần số () rồi biến đổi Fourier ngược sẽ đưa
tín hiệu về một miền gọi là có đơn vị thời gian (thuật ngữ là đảo ngược của âm
đầu tiên trong từ spectrum → cepstrum). Biến đổi từ spectrum sang cepstrum là
một biến đổi đồng hình (homomorphic). Theo [9] biến đổi đồng hình chuyển
biểu diễn tín hiệu từ dạng tích về dạng tổng, như vậy cho phép sử dụng các hệ
tuyến tính để xử lí các tín hiệu không tuyến tính.
Công thức tính của bước này là:
M
i 2πn (k − 1)
c(n ) = ∑ log(F(k )). cos( ); n = 1..p
k =1 2M

KHOÁ LUẬN TỐT NGHIỆP TRANG 28


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Chú ý: mặc dù biến đổi từ spectrum sang cepstrum là biến đổi Fourier
ngược, tuy nhiên do ta dùng spectrum và cepstrum thực nên chỉ sử dụng biến đổi
cosine rời rạc (DCT) để tăng hiệu năng tính toán.
Sau bước này ta được vector cepstral (ở độ đo mel) p thành phần. Thông
thường người ta thường nhân thêm vào kết quả một hàm cửa sổ sóng sin (gọi là
thủ tục liftering) để giảm bớt ảnh hưởng của các biến đổi đến kết quả.
L nπ
w (n ) = 1 + . sin( )
2 L
c(n ) = c(n ).w (n )

Kèm thêm thông tin về năng lượng của tín hiệu sẽ tăng thêm thông tin cho
nhận dạng (ví dụ: phân biệt các khoảng chứa tín hiệu âm và khoảng lặng, phân
biệt vùng tín hiệu chứa nguyên âm và phụ âm…)
Năng lượng của cả frame được tính qua công thức:
N −1
E = ∑ ( x (n )) 2
n =0

Đặc trưng delta là đạo hàm bậc nhất (rời rạc) của đặc trưng theo thời gian.
Có các đặc trưng delta sẽ tăng thêm thông tin cho nhận dạng (chẳng hạn: xác
định các vùng mà phổ tín hiệu ổn định…). Đặc trưng delta được tính theo công
thức:
∂ T
C' ( t ) = C( t ) = ∑ u.C( t + u )
∂t u =−T

Trong đó C(t) là cả vector cepstral tại thời điểm t. T là một hằng số chọn
trước, thường thì người ta lấy T=3.

VoiceBox là một toolbox của Matlab chuyên về xử lí tiếng nói do Mike


Brookes phát triển. VoiceBox yêu cầu Matlab phiên bản 5 trở lên.
VoiceBox gồm các hàm có thể chia thành một số nhóm chức năng sau:
• Xử lí file âm thanh (đọc, ghi file wav và một số định dạng file âm
thanh khác)
• Phân tích phổ tín hiệu
• Phân tích LPC
• Tính toán MFCC, chuyển đổi spectral - cepstral
• Chuyển đổi tần số (mel-scale, midi,...)
• Biến đổi Fourier, Fourier ngược, Fourier thực...
• Tính khoảng cách (sai lệch) giữa các vector và dãy vector.

KHOÁ LUẬN TỐT NGHIỆP TRANG 29


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

• Loại trừ nhiễu trong tín hiệu tiếng nói.


Tuy nhiên chức năng quan trọng nhất là trích đặc trưng tín hiệu tiếng nói,
mà ở đây là 2 loại phổ biến nhất LPC và MFCC.
Hàm tính MFCC của tín hiệu trong VoiceBox là hàm :
c=melcepst(s,fs,w,nc,p,n,inc,fl,fh)

Hàm có rất nhiều tham số, một số tham số quan trọng là:
• s là vector tín hiệu tiếng nói (có được sau khi dùng hàm hoặc ), fs là
tần số lấy mẫu (mặc định là 11050).
• nc là số hệ số MFCC cần tính (tức là số phần tử của vector đặc trưng.
Mặc định là 12, trong nghiên cứu chúng tôi chọn là 8).
• p là số bộ lọc mel-scale.
• w là một xâu mô tả các lựa chọn khác: nếu có thì tính thêm log năng
lượng, có thì tính thêm đặc trưng delta.
Mặc dù vậy hàm có thể gọi một cách đơn giản là:
c=melcepst(s,fs);

Lời gọi hàm sinh ra ma trận c, mỗi dòng của ma trận là 12 hệ số MFCC của
một frame. Để kèm thêm log năng lượng và dữ liệu delta như trong các hệ nhận
dạng khác, ta dùng lệnh:
c=melcepst(s,fs,’ed’);

Khi đó mỗi dòng của c là vector 26 hệ số MFCC của frame tương ứng.
Hàm melcepst được chúng tôi sử dụng để trích chọn đặc trưng MFCC trong
hệ thống nhận dạng được trình bày trong chương 5.

KHOÁ LUẬN TỐT NGHIỆP TRANG 30


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Bộ não con người, dưới góc độ tính toán có thể coi là một hệ thống xử lí
song song lớn và mật độ kết nối cao: phần tử xử lí là các nơ ron là một và kết nối
là các dây thần kinh.
Khả năng tuyệt vời của bộ não đã gợi nên những ý tưởng về việc mô phỏng
chúng trong lĩnh vực tính toán. Và mạng nơ ron nhân tạo (artificial neural
network -ANN) là kết quả của những ý tưởng đó.

Có nhiều mô hình mạng nơron khác nhau. Mô hình mạng đơn giản và phổ
biến nhất là mô hình mạng perceptron truyền thẳng nhiều lớp (multi layer
perceptron - MLP). Đó là mô hình mạng chúng tôi sử dụng trong hệ nhận dạng
được trình bày trong khoá luận này. Bạn đọc quan tâm có thể tham khảo thêm về
mạng nơron trong [4, 8,11].

Một nơron perceptron là một phần tử xử lí gồm:


• n đầu vào xi, mỗi đầu vào ứng với một giá trị thực wi gọi là trọng số.
• Một giá trị thực b gọi là ngưỡng (bias).
• Một hàm kích hoạt f.
• Giá trị ra y.

Minh hoạ: Mô hình một nơron perceptron

Giá trị ra của perceptron được tính theo quy tắc sau:
n
u = ∑ xiwi + b
i =1

y = f (u )

KHOÁ LUẬN TỐT NGHIỆP TRANG 31


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Hàm kích hoạt được sử dụng phổ biến là hàm sigmoid (còn gọi là hàm
logistic) do tính phi tuyến và khả vi:
1
f (u ) =
1 + e −u
Ngoài ra còn có một số hàm kích hoạt khác: hàm tang hyperbolic (tanh),
hàm softmax.
Khả năng tính toán của một nơron perceptron khá hạn chế. Để cải thiện
người ta nối chúng thành mạng. Mô hình mạng đơn giản nhất là mạng perceptron
truyền thẳng đa lớp MLP.

Mạng nơron MLP n đầu vào, m đầu ra có mô hình như sau:


• Các nơron được chia thành các lớp: lớp sau được nối với lớp trước.
Lớp đầu tiên là lớp vào (input - nhận đầu vào), lớp cuối cùng là lớp ra
(output - cho đầu ra). Giữa lớp vào và lớp ra là các lớp ẩn (hidden).
Thông thường chỉ có một lớp ẩn.
• Tất cả các nơron cùng một lớp sử dụng chung một vector đầu vào.
Mỗi lớp khi nhận một vector đầu vào sẽ tính đầu ra của mỗi nơron, kết
hợp thành một vector và lấy đó làm đầu vào cho lớp sau.
• Mạng MLP nhận đầu vào là một vector n thành phần, lấy đó làm đầu
vào của lớp input và tính toán cho đến khi lớp output có đầu ra, lấy đó
là đầu ra của mạng: một vector m thành phần.
• Toàn bộ các nơron của toàn mạng sử dụng chung một hàm kích hoạt,
thường là hàm logistic.
Ngoài lớp vào và lớp ra, mạng MLP thường có một hay nhiều
lớp ẩn. Thông thường người ta chỉ sử dụng một lớp ẩn. Vì vậy
đôi khi người ta hay đồng nhất MLP với MLP 3 lớp.

KHOÁ LUẬN TỐT NGHIỆP TRANG 32


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

output layer
hidden layer
input layer

Minh hoạ: Mô hình mạng perceptron 3 lớp (MLP)

Như vậy xét dưới góc độ toán học mạng MLP biểu diễn một hàm phi tuyến
từ R vào Rm. Người ta cũng chứng minh được rằng: “một hàm phi tuyến liên
n

tục bất kì có thể xấp xỉ với độ chính xác tuỳ ý bằng mạng MLP” (định lí
Kolmogorov-được nhắc đến trong [8]).
Mạng MLP n×p×m (n đầu vào, m đầu ra, p nơron ẩn) được biểu diễn bằng 2
ma trận trọng số w1 cỡ n×p, w2 cỡ p×m và 2 vector ngưỡng b1 p phần tử, b2 m
phần tử. (Lớp input của MLP chỉ có tác dụng nhận đầu vào, hoàn toàn không
thực hiện tính toán).
Khi đó tính toán đầu ra y của mạng theo đầu vào x như sau:
u = x.w 1 + b1
z = f (u )
v = z.w 2 + b 2
y = f ( v)
Ở đây, u, v, z là các vector. Viết z=f(u) có nghĩa là zi=f(ui) với mọi i.
Để biểu diễn được một hàm nào đó, mạng MLP cần được huấn luyện.

Để mạng nơron biểu diễn được hàm f, ta cần một bộ dữ liệu gồm N cặp
vector (xi, ti), trong đó xi thuộc tập xác định của f và ti là giá trị của f tại xi:
ti = f(xi)
Mạng MLP sẽ biểu diễn được hàm f nếu cho đầu vào của mạng là x i thì đầu
ra của mạng là ti. Thường thì MLP chỉ biểu diễn được xấp xỉ hàm f, do đó ta
mong muốn nếu mạng cho đầu ra thực tế là yi thì yi càng gần ti càng tốt.
Như vậy bài toán huấn luyện mạng là :

KHOÁ LUẬN TỐT NGHIỆP TRANG 33


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

N
E = ∑ t i − y i → min
i =1

Trong đó yi là đầu ra thực tế của mạng ứng với đầu vào xi.
Thuật toán huấn luyện MLP phổ biến nhất là thuật toán lan truyền ngược lỗi
(back-propagation training). Thuật toán có đầu vào là tập mẫu {(xi, ti)}, đầu ra là
bộ trọng số của mạng.
Các bước tiến hành huấn luyện như sau:
1/ Khởi tạo trọng số của mạng: wij được gán các giá trị ngẫu nhiên, nhỏ
(nằm trong miền [-α, α]).
2/ Với mỗi cặp (x,t) trong bộ dữ liệu huấn luyện:
Giả sử x = (x1 , ..., xn). Ta thực hiện:
1. Lan truyền x qua mạng để có y (theo công thức mục 4.1.3).
2. Tính sai số e của mạng: e=t-y.
3. Hiệu chỉnh các trọng số liên kết nơron dẫn tới lớp ra w ij từ nơron j tại
lớp ẩn tới nơron i tại lớp ra:
wij = wij + ∆wij
wij là trọng số giữa nơron i ở lớp trước và nơron j ở lớp sau. ∆wij được tính
theo công thức sau:
∆wij=ρδjyi
• ρ là hằng số tốc độ học (learning rate), thường lấy bằng .
• yi là đầu ra của nơron i (nếu i là nơron lớp input thì thay yi bằng xi).
• δj là sai số tại nơron j. Nếu j là nơron lớp ra (output layer) thì δj được
tính theo công thức:
δj = yj(1-yj)(tj-yj)
Nếu j là nơron lớp ẩn thì được tính theo công thức:

δj = yj(1-yj) ∑ δ k w jk
k

trong đó k là các các nơron của lớp sau lớp của j.


Việc đưa mẫu huấn luyện qua mạng, tính toán và cập nhật trọng số được
tiến hành với tất cả phần tử trong bộ mẫu (có thể chọn ngẫu nhiên hoặc tuần tự).
Quá trình sẽ dừng lại khi sai số trung bình (hoặc tổng sai số) nhỏ hơn một giá trị
cho trước hoặc thay đổi không đáng kể (tức là quá trình huấn luyện hội tụ).

Các nghiên cứu cả về mặt lí thuyết và thực tế cho thấy mạng nơron có
những ưu điểm sau:

KHOÁ LUẬN TỐT NGHIỆP TRANG 34


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

• Có thể xấp xỉ một hệ phi tuyến động (nonlinear dynamical system) với
độ chính xác bất kì.
• Có khả năng miễn nhiễu (robustness) và chịu sai hỏng (fault tolerance)
cao. Chẳng hạn mạng có thể nhận các dữ liệu bị sai lệch hoặc không
đầy đủ mà vẫn hoạt động được.
• Có khả năng thích ứng: mạng nơron có thể “học” (learn) và “điều
chỉnh” (adapt) trong quá trình hoạt động. Đây là điểm đáng chú ý nhất
của mạng nơron trong nhận dạng tiếng nói. Đặc điểm này của mạng
cho phép ta hi vọng xây dựng được một hệ nhận dạng có thể “học tập”
để nâng cao khả năng nhận dạng trong khi hoạt động.
• Có khả năng tổng quát hoá (generalize) tốt và phân lớp (classify)
mạng.
Nhưng mạng nơron cũng không phải là công cụ vạn năng cho mọi vấn đề,
vì chúng cũng có nhiều nhược điểm:
• Chỉ xử lí được các dữ liệu số. Cần tích hợp thêm nhiều thành phần
khác (ví dụ: các hệ mờ, các bộ số hoá...) để có thể xử lí những dữ liệu
phi số.
• Hiệu năng của mạng phụ thuộc bộ dữ liệu huấn luyện. Để đảm bảo
hiệu năng, mạng cần được huấn luyện với lượng dữ liệu lớn. Quá trình
huấn luyện do đó rất dài. Mặt khác nếu bộ dữ liệu được chuẩn bị
không tốt thì mạng có khả năng tổng quát hoá thấp.
• Mạng nơron gần như là một “hộp đen” đối với các phân tích. Rất khó
xác định được sự phân bố thông tin và xử lí trên các phần tử của
mạng.
• Không có một phương pháp chung nào để xác định cấu trúc mạng phù
hợp từng bài toán. Nhà nghiên cứu phải tiến hành thử nghiệm hoặc
dựa vào kinh nghiệm để xác định.
• Các thuật toán huấn luyện hiện chưa đảm bảo tránh quá trình huấn
luyện rơi vào một cực trị địa phương. Hơn nữa sai số huấn luyện giảm
không đồng nghĩa với tăng hiệu năng hoạt động của mạng.
• Mạng cấu trúc lớn cài đặt bằng phần mềm trên máy tính hoạt động rất
chậm. Việc xây dựng mạng nơron bằng phần cứng vẫn còn đang được
nghiên cứu.

KHOÁ LUẬN TỐT NGHIỆP TRANG 35


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Bài toán nhận dạng sẽ được giải quyết nếu chúng ta xây dựng được một cơ
cấu nhận dạng có:
• Đầu vào là đặc trưng của đối tượng cần nhận dạng.
• Đầu ra là xác suất phân lớp hoặc độ giống (likelihood), độ tương tự
(similarity) của đối tượng với những lớp mẫu đã huấn luyện.

Đặc trưng 1 Lớp 1

)
v 1(

(X
X)

p1
Trích
chọn Cơ cấu nhận dạng p2( X) Lớp 2
Đối tượng Đặc trưng 2 v2(X)
đặc
trưng

X)

pm
vn (

(X
)
Đặc trưng n Lớp m

Minh hoạ: Mô hình nhận dạng bằng cơ cấu nhận dạng dựa theo xác suất phân lớp

Chúng ta thấy rằng có thể dùng MLP để là một cơ cấu nhận dạng như vậy:
MLP sẽ được huấn luyện dựa trên bộ dữ liệu huấn luyện được chuẩn bị trước để
tìm mối liên hệ giữa đầu vào và đầu ra ( và ). Những vấn đề này sẽ được trình
bày kĩ trong chương 5.

MLP có một số nhược điểm sau khi sử dụng trong nhận dạng tiếng nói:
- Có đầu vào cố định (trong khi tín hiệu tiếng nói là tín hiệu thay đổi theo
thời gian: mỗi lần phát âm cho các từ có độ dài thường không bằng nhau).
- Chi phí huấn luyện tốn kém (thời gian, không gian lưu trữ).
Do đó MLP thường chỉ cho kết quả cao trong nhận dạng với bộ từ vựng nhỏ
và phân biệt (độ tương tự của các lớp mẫu thấp).

Ngoài cách tiếp cận như ở phần 4.2.1, còn có nhiều cách tiếp cận khác đối
với nhận dạng tiếng nói bằng mạng nơron:
- Dùng mô hình mạng TDNN (mạng nơron thời gian trễ): là mô hình cải
tiến của MLP, có cơ chế để tích hợp thông tin về thời gian (các nơron trễ) khi đưa
các mẫu tiếng nói qua mạng. Mô hình này nhằm giải quyết vấn đề về sự phụ
thuộc thời gian của tín hiệu tiếng nói.
- Kết hợp MLP và HMM: sử dụng MLP là bộ đo xác suất phát xạ vector
quan sát. Cách tiếp cận này kết hợp ưu điểm của cả 2 mô hình.

KHOÁ LUẬN TỐT NGHIỆP TRANG 36


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Mạng nơron trên Matlab được hỗ trợ bởi nhiều toolbox, chẳng hạn NNet
sẵn có của Matlab hoặc NetLab do Ian T. Nabney phát triển. Chúng tôi sử dụng
toolbox NetLab để xây dựng, huấn luyện và thử nghiệm mạng nơron MLP cho hệ
thống nhận dạng trong khoá luận này.

Lệnh khởi tạo MLP trong NetLab có cú pháp như sau:


net = mlp(inode, hnode, onode, func, anpha);

Trong đó:
• inode, hnode, onode lần lượt là số nơron của lớp vào, lớp ẩn và lớp ra.
• func là kiểu hàm kích hoạt, func có thể có các giá trị ‘logistic’,
‘softmax’…
• anpha là ngưỡng của giá trị trọng số, thường lấy bằng 0.01.
• net là mạng MLP do hàm tạo ra.

Mạng MLP sau khi điều kiện khởi tạo có thể huấn luyện với một bộ dữ liệu
huấn luyện cho trước. Lệnh huấn luyện MLP trong NetLab có cú pháp như sau:
[net, error] = mlptrain(net, x, t, its)

Trong đó:
• x, t là bộ dữ liệu huấn luyện. x là các vector đầu vào, t là các vector
đầu ra cần đạt đến (target).
• its là số vòng huấn luyện (số lần thực hiện thuật toán lan truyền ngược
lỗi).
• net là mạng nơron.
• error là tổng sai số của lần huấn luyện cuối cùng.

Sau khi huấn luyện ta có thể dùng mạng MLP để tính đầu ra ứng với các
đầu vào bất kì. Lệnh tính đầu ra y của MLP ứng với đầu vào x như sau:
y = mlpfwd(net, x)

Trong đó:
• x là một hay nhiều vector đầu vào
• y là các vector đầu ra tương ứng.
Bạn đọc có thể tham khảo ví dụ về script và function ở mục 1.2.2. để tìm
hiểu việc sử dụng các hàm này.

KHOÁ LUẬN TỐT NGHIỆP TRANG 37


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

.
• Phương pháp: nhận dạng từ đơn (isolate word recognition).
• Input: file wav, mỗi file chỉ chứa một từ. Hoặc ghi âm trực tiếp.
• Output: chữ số được nhận dạng trong file đầu vào.
• Bộ từ vựng: 11 từ đơn âm các chữ số tiếng Việt (“không”, “một”,
“hai”... “mười”).

Trích chọn đặc Xây dựng CSDL


trưng MFCC huấn luyện mạng

Chia bộ dữ liệu,
CSDL

luyện
phân lớp Thử nghiệm
huấn

DL thử nghiệm Độ chính xác


mạng
DL huấn luyện

Thu thập, tiền xử


Nguồn vào (tiếng nói) lí (cắt từ, lọc
nhiễu...)

Trích chọn đặc Xây dựng và Mạng nơron


trưng MFCC huấn luyện mạng MLP

Truyền qua mạng


Tính đầu vào cho Lựa chọn lớp có
để tính xác suất Chữ số được nhận dạng
mạng xác suất cao nhất
phân lớp

Minh hoạ: Sơ đồ khối hệ thống nhận dạng tiếng nói các chữ số tiếng Việt bằng mạng
nơron MLP trên môi trường Matlab

Các phần tiếp theo mô tả cụ thể từng chức năng của hệ thống.

Thu thập và tiền xử lí tín hiệu tiếng nói ở giai đoạn huấn luyện được thực
hiện bằng phương pháp thủ công: sử dụng phần mềm ghi âm, lọc nhiễu và cắt
thành các từ riêng rẽ, mỗi từ ghi vào một file (tên file ghi từ tương ứng).
Bộ dữ liệu do chúng tôi tự xây dựng gồm:
• file wav 16 bit 8kHz, mỗi file là phát âm của một từ.

• từ là các chữ số tiếng Việt từ đến . (Mặc dù “mười” không phải là chữ
số nhưng vẫn cần trong hệ nhận dạng chữ số vì có các số phát âm là
“mười một”, “mười hai”...).

KHOÁ LUẬN TỐT NGHIỆP TRANG 38


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

• người nói.
Ở giai đoạn nhận dạng, việc thu thập và tiền xử lí (cắt các vùng không chứa
tín hiệu tiếng nói) được thực hiện bởi các lệnh sau:
x = wavrecord(10000,8000); %tần số lấy mẫu 8kHz
x = x'; % ghi âm chừng hơn 1s
y = endcut(x, 64, 1.5E-3);

Hàm endcut dùng cắt các khoảng lặng không chứa tín hiệu âm:
function y = endcut(x, n, es)
% cat khoang lang ra khoi x.
% n là độ dài frame, es là ngưỡng năng lượng.
x = x - mean(x);
if nargin < 3
es = 2E-3;
end;
if nargin < 2
n = 128;
end;
y=[];
t=x(1:n);
e=mean(t.^2);
i=n+1;ln = length(x) - n+1;
while i<=ln
t=x(i:i+n-1);
e1=mean(t.^2);
if ~( (e1<es) | (abs(e1-e)<es) )
y = [y t];
end;
i=i+n;
end;

Bộ dữ liệu huấn luyện có 11 từ nên chúng tôi chia toàn bộ vector đặc trưng
thành 11 lớp, mỗi vector ứng với lớp của từ tương ứng. (Từ “một” thuộc lớp 1, từ
“hai” thuộc lớp 2,... từ “không” thuộc lớp 11).
Các dữ liệu trên lại tiếp tục được chia làm 2 phần: một phần dành cho huấn
luyện và một phần để kiểm tra.
Phân chia bộ dữ liệu và phân lớp cũng được thực hiện thủ công: danh sách
các file được đưa vào Excel, thông tin về chỉ số lớp của mỗi file được đưa vào
tương ứng. Mỗi file cũng được xếp vào một trong 2 nhóm: train và test.
Nạp file Excel bằng Matlab để tạo thành 2 biến: biến file mô tả tên file, và
biến list mô tả thông tin phân lớp. Sau đó dùng các lệnh sau:

KHOÁ LUẬN TỐT NGHIỆP TRANG 39


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

numid=list(:,1);
train=find(list(:,2)==1);
test=find(list(:,2)==0);

mô tả chỉ số lớp tương ứng với mỗi từ; là danh sách các từ thuộc bộ dữ liệu
huấn luyện và kiểm tra.

Mỗi file âm thanh được trích chọn đặc trưng MFCC thành một dãy các
vector MFCC bằng hàm wave2mfcc:
function mfcc = wave2mfcc(wav, fs, p);
if nargin < 3 % mặc định lấy vector MFCC 8pt
p = 8;
end;
if nargin < 2 % mặc định tần số lấy mẫu = 8kHz
fs = 8000;
end;
if isstr(wav) % nếu wav là tên file thì đọc
[wav fs] = wavread(wav);
end;
% chuẩn hoá để max(wav)=1.
mx = max(wav);
wav = wav ./ mx;
% tính vector MFCC p phần tử, gồm cả năng lượng
mfcc = melcepst(wav,fs,'e',p-1);

Vì các file wav có độ dài ngắn khác nhau nên dãy các vector đặc trưng
MFCC tương ứng cũng không có cùng số phần tử. Nhưng đầu vào của mạng
nơron MLP lại phải cố định. Do đó chúng tôi thực hiện một biện pháp đơn giản
là chia dãy đặc trưng thành 5 phần đều nhau, tính trung bình của từng phần
được 5 vector rồi ghép lại thành một vector. Kết quả đầu vào của mạng nơron là
một vector 40 thành phần.
Hàm tính đầu vào của mạng:
function x = VecAvr(ft,k);
% trích ft thành k phần chia trung bình.
n = length(ft); m = floor(n/k); x=[];
i=0;t=1;
while i<k
i=i+1;
f=sum(ft(t:t+m-1,:))./m;
x=[x f];
t=t+m;
end;

Toàn bộ dữ liệu huấn luyện được đọc vào Matlab qua hàm:

KHOÁ LUẬN TỐT NGHIỆP TRANG 40


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

function [x,t,z]=MakeDataANN(file, train, numid,


test)
N=length(train);
i=0; x=[]; t=[];
while i<N
i = i + 1; j=train(i)
str = file{j};
mfc = wave2mfcc(str); % trích MFCC từ file wav
xi = vecavr(mfc,5); % chia 5 phần
ti = zeros(1,11); ti(numid(j))=1; % tính target
x = [x; xi]; % ghép xi vào cuối của x
t = [t; ti];
end;
N=length(test);
i=0; z=[];
while i<N
i = i + 1;
str = file{test(i)};
mfc = wave2mfcc(str);
xi = vecavr(mfc,5);
z = [z; xi];
end;

Trong đó: x, z là đầu vào cho mạng của tương ứng với dữ liệu huấn luyện và
kiểm tra. t là đầu ra mong muốn (target) dành cho huấn luyện.
Đầu ra mong muốn của dữ liệu huấn luyện xác định rất đơn giản: là một
vector 11 thành phần (ứng với 11 lớp mẫu). Nếu file tương ứng trong bộ dữ liệu
huấn luyện thuộc lớp k, thì thành phần thứ k của vector bằng 1, các thành phần
còn lại bằng 0.

Xây dựng và huấn luyện và thử nghiệm các mạng có cấu trúc khác nhau (về
số nơron ẩn, kiểu hàm kích hoạt) được tiến hành bằng script sau:
clc;
hnode=0; kq=[]; mac=0; i=0;
while hnode<150
hnode=hnode+5 % tăng hnode theo bước 5
main % thử nghiệm mạng
if mac < ac % ghi nhận mạng tốt hơn
mac = ac;
best = net;
end;
i=i+1;
netkq{i} = net; % ghi lại tất cả các mạng
end;

Trong đó script thực hiện khởi tạo, huấn luyện và kiểm tra mạng:

KHOÁ LUẬN TỐT NGHIỆP TRANG 41


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

net = mlp(inode, hnode, onode, func, anpha); % tạo


MLP
[net err]=mlptrain(net, xtrain, target, loop); %
train
ytest = mlpfwd(net, xtest); % tính đầu ra bộ test
ac = TestANN(ytest, numid(test)); % tính độ chính xác
kq =[kq; ac];

Các tham số mạng như (kiểu hàm kích hoạt), (cận khởi tạo trọng số), (số vòng
lặp huấn luyện) được thay đổi theo mỗi cấu trúc mạng.
Hàm TestANN dùng tính số từ được nhận dạng chính xác dựa trên đầu ra
tương ứng với đầu vào của bộ bộ dữ liệu kiểm tra.
function [ac, qt] = TestANN(yte, numid)
qt=[]; ac=0; i=0;
while i<length(yte)
i=i+1;
kc = yte(i,:);
[mi id] = max(kc); % xác định lớp xác suất cao
nhất
if id == numid(i) % nếu là chỉ số lớp tương ứng
ac = ac + 1; % => nhận dạng đúng
end;
qt = [qt; i id numid(i) mi ac kc];
end;
ac = ac / length(yte); %độ chính xác=số từ đúng/tổng

Hàm ANNrecognize thực hiện nhận dạng với đầu vào cho trước:
function [id, xs, out] = ANNrecognize(wav,net);
mfc = wave2mfcc(wav); % trích MFCC
vec = vecavr(mfc,5); % tính đầu vào
out = mlpfwd(net,vec); % tính đầu ra của mạng
[xs id] = max(out); % đưa ra lớp cao nhất

KHOÁ LUẬN TỐT NGHIỆP TRANG 42


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Phần mềm demo có thể nhận dạng cả trực tuyến (vừa ghi âm vừa nhận dạng) và
ngoại tuyến (nhận dạng file được ghi âm sẵn). Mỗi lần chỉ nhận dạng được một
từ. Nhìn chung nhận dạng ngoại tuyến cho kết quả cao hơn vì hàm cắt khoảng
lặng của phần mềm demo có độ chính xác chưa cao.

KHOÁ LUẬN TỐT NGHIỆP TRANG 43


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Kết quả quá trình thử nghiệm được tổng hợp trong bảng sau:
Bảng kết quả thử nghiệm:
Bộ dữ liệu 5 người nói
Số từ dùng huấn luyện: 268
Số từ dùng kiểm tra: 268
Độ chính xác=số từ nhận dạng đúng/tổng số từ trong bộ dữ liệu kiểm tra.

hnode sig01-50 sig01-100 sig05-50 smx01-50 smx01-100 smx05-50


5 27.61% 22.02% 20.52% 35.08% 60.45% 42.54%
10 53.36% 81.34% 37.31% 88.81% 90.30% 87.69%
15 82.46% 89.18% 89.18% 94.03% 92.16% 89.93%
20 66.42% 76.87% 86.57% 95.15% 94.03% 95.52%
25 92.16% 96.64% 88.06% 95.52% 96.64% 94.78%
30 94.78% 92.91% 93.28% 97.39% 92.91% 94.78%
35 94.40% 94.78% 93.28% 95.15% 96.27% 95.52%
40 94.40% 97.02% 95.52% 98.13% 97.76% 97.02%
45 94.03% 97.39% 95.90% 95.52% 97.76% 97.76%
50 96.27% 97.02% 97.39% 97.39% 97.39% 97.76%
55 94.78% 96.64% 97.39% 98.13% 97.76% 97.76%
60 97.02% 97.76% 97.02% 98.51% 98.88% 96.64%
65 98.51% 97.39% 96.64% 97.76% 98.88% 97.76%
70 97.02% 97.02% 97.76% 97.76% 98.51% 97.76%
75 98.13% 97.39% 97.39% 98.51% 97.39% 96.64%
80 95.90% 98.51% 96.64% 98.88% 98.88% 96.64%
85 97.76% 97.02% 98.51% 98.13% 98.88% 98.88%
90 98.13% 98.51% 98.13% 98.51% 98.51% 97.76%
95 98.51% 98.88% 96.27% 97.39% 98.88% 99.25%
100 97.76% 98.88% 98.51% 98.13% 98.13% 98.13%
105 97.39% 97.76% 97.39% 98.51% 98.51% 98.13%
110 98.51% 98.51% 98.13% 98.51% 98.13% 98.51%
115 97.39% 99.25% 97.39% 97.39% 98.13% 98.13%
120 98.13% 98.13% 98.13% 98.13% 97.39% 99.25%
125 98.51% 98.51% 98.13% 98.51% 98.13% 97.76%
130 97.76% 98.51% 97.76% 97.76% 98.51% 98.51%
135 98.88% 98.51% 98.13% 98.13% 98.51% 97.76%
140 97.39% 98.13% 97.76% 98.88% 98.51% 98.51%
145 99.25% 98.88% 98.51% 97.02% 98.88% 98.13%
150 97.76% 98.13% 98.13% 97.76% 98.13% 98.51%
T.B. 91.68% 93.58% 91.69% 95.15% 96.11% 95.12%

Trong đó hnode là số nơron lớp ẩn, ứng với mỗi kiểu mạng như sau:

KHOÁ LUẬN TỐT NGHIỆP TRANG 44


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Kí hiệu Hàm kích hoạt Giá trị khởi Số vòng lặp


tạo trọng số huấn luyện
sig01-50 sigmoid (logistic) 0.1 50
sig01-100 sigmoid (logistic) 0.1 100
sig05-50 sigmoid (logistic) 0.5 50
smx01-50 softmax 0.1 50
smx01-100 softmax 0.1 100
smx05-50 softmax 0.5 50

Biểu đồ sau thể hiện kết quả nhận dạng theo số nơron lớp ẩn trong 2 kiểu mạng
cho kết quả cao nhất.

100%

95%

90%

85%

80%

75%
5 15 25 35 45 55 65 75 85 95 105 115 125 135 145

sig01-100 smx05-50

Từ kết quả thử nghiệm, chúng tôi rút ra một số kết luận sau:
1. trên bộ dữ liệu do chúng tôi tự xây dựng. Như vậy có thể sử dụng
mạng nơron làm một cơ cấu nhận dạng hiệu quả, ít nhất là đối với hệ
thống nhận dạng chữ số.
2. . Không hẳn cứ nhiều nơron lớp ẩn, cứ huấn luyện nhiều là mạng có
độ chính xác cao hơn. (Mặc dù điều đó làm giảm sai số huấn luyện của
mạng). Vấn đề sai số huấn luyện thấp, sai số kiểm tra cao xảy ra khi độ
tương tự giữa bộ dữ liệu huấn luyện và bộ dữ liệu kiểm tra không lớn.
Khi đó mạng nhận dạng rất chính xác trên bộ dữ liệu huấn luyện
nhưng kém chính xác hơn nhiều trên bộ dữ liệu kiểm tra.

KHOÁ LUẬN TỐT NGHIỆP TRANG 45


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

3. . (Kết quả nhận dạng trung bình cao hơn, số nơron ẩn cần dùng thấp
hơn khi cho kết quả nhận dạng cao nhất).
4. . Nhờ có Matlab và các bộ công cụ VoiceBox, NetLab mà việc phát
triển hệ thống nhận dạng khá đơn giản và nhanh chóng (ví dụ: mã
chương trình dùng rất ít lệnh, nhiều phần không cần lập trình).
Những kết luận trên cho thấy khả năng sử dụng mạng nơron và môi trường
Matlab trong nhận dạng tiếng nói có nhiều hứa hẹn. Tuy nhiên để đạt được điều
đó thì phải xây dựng một bộ dữ liệu chuẩn và có chiến lược xây dựng, huấn
luyện, thử nghiệm mạng hợp lí.

Như ta đã thấy, bộ dữ liệu là thành phần cực kì quan trọng đối với hệ nhận
dạng. Hiện tại bộ dữ liệu chúng tôi đã xây dựng (182 file, 11 từ, 2 người) là còn
quá khiêm tốn. Để có thể có những kết quả nghiên cứu tốt hơn, chúng tôi sẽ mở
rộng bộ dữ liệu: tăng số người nói và số từ, đa dạng hoá môi trường ghi âm.

Hệ thống nhận dạng hiện tại của chúng tôi hiện chỉ được thử nghiệm trên
môi trường Matlab, mới có khả năng nhận dạng một file ghi âm sẵn của một từ
(nhận dạng từ đơn, ngoại tuyến). Trong khi đó để hệ nhận dạng có thể ứng dụng
được thì hệ phải hoạt động ở dạng trực tiếp và liên tục (tức là vừa ghi âm vừa
nhận dạng, nhận dạng nhiều chữ số một lúc, chạy như một chương trình hệ
thống). Mục tiêu của chúng tôi là sau khi thử nghiệm hệ thống cho kết quả cao sẽ
xây dựng một bộ công cụ nhận dạng tiếng nói và các phần mềm ứng dụng, vì đó
mới là mục đích của nghiên cứu nhận dạng tiếng nói.

Ở nghiên cứu này, việc tách đặc trưng của tín hiệu tiếng nói còn rất đơn
giản (chia frame, tính MFCC, chia 5 phần lấy trung bình cộng). Để nâng cao kết
quả nhận dạng cần tìm những đặc trưng ổn định hơn của tiếng nói và những
phương pháp tách đặc trưng hiệu quả hơn.

Các nghiên cứu khác ([1,9,10]) cho thấy hiện tại mô hình Markov ẩn
(HMM) đang cho kết quả nhận dạng cao nhất. Hướng nghiên cứu mới của đề tài
là tìm cách kết hợp mạng nơron và mô hình Markov ẩn nhằm kết hợp ưu điểm
của hai mô hình.
Mặt khác, đối với bộ từ vựng nhỏ thì nhận dạng từ đơn (âm tiết) là thích
hợp. Tuy nhiên với hệ nhận dạng cỡ lớn, nhất là hệ nhận dạng tiếng Việt hoàn
chỉnh (6 nghìn âm tiết ) thì chọn đơn vị nhận dạng là âm tiết không hợp lí lắm.
Một hướng nghiên cứu khác của đề tài là nhận dạng đối với đơn vị nhỏ hơn âm
tiết là âm vị. Tức là xây dựng các hệ nhận dạng có chức năng:

KHOÁ LUẬN TỐT NGHIỆP TRANG 46


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

• Phân biệt được nhiễu nền (khoảng lặng), phụ âm, nguyên âm.
• Nhận dạng phụ âm (phân biệt được các phụ âm khác nhau).
• Nhận dạng nguyên âm (phân biệt được các nguyên âm khác nhau).
• Nhận dạng thanh điệu của âm tiết.

KHOÁ LUẬN TỐT NGHIỆP TRANG 47


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

[1] Đặng Ngọc Đức Mạng nơron và mô hình Luận án tiến sĩ


Markov ẩn trong nhận dạng
tiếng Việt
[2] Nguyễn Hữu Tình, Cơ sở Matlab và ứng dụng Sách NXB KHKT
Lê Tấn Hùng, Phạm -1999
Ngọc Yến, Nguyễn
Thị Lan Hương
[3] Đoàn Thiện Thuật Ngữ âm tiếng Việt Sách NXB ĐHQG
Hà Nội - 2003
[4] Nguyễn Thanh Thuỷ Nhập môn xử lý ảnh số Sách NXBKHKT
[5] Alpay Koç Acoustic feature analysis for
robust speech recognition
[6] John-Paul Hosom, A diphone-based digit http://cslu.cse.ogi.e
Ron Cole recognition system using neural du/cslu
networks
[7] John-Paul Hosom, Speech Recognition Using Webpage tại
Ron Cole, Mark Neural Networks http://cslu.cse.ogi.e
Fanty, Don Colton du/cslu
[8] Mehdi R. Zargham Computer Architecture
[9] Rabiner L.R A Tutorial on Hidden Markov Proceedings of
Models and Selected IEEE, VOL.77,
Applications in Speech NO.2, FEB 1989
Recognition
[10] Rabiner L.R, Huang Fundamentals of Speech Sách NXB Prentice
B. H Recognition Hall - 1993
[11] Simon Haykin Neural Networks - A Sách NXB Prentice
comprehensive foundation Hall - 1998
[12] V.Mantha, Implementation and analysis of ECE4773/Digital
R.Duncan, Y.Wu, speech recognition front-ends Signal Processing -
J.Zhao 1998
[13] Joe Tebelskis Speech Recognition using CMU-CS-95-142
Neural Networks

KHOÁ LUẬN TỐT NGHIỆP TRANG 48


Khoa CNTT trường ĐHSP Hà Nội Nguyễn Thanh Tùng

Artifactial Neural Network ANN Mạng nơron nhân tạo


Fast Fourier Transform FFT Biến đổi Fourier nhanh
Dicrette Cosine Transform DCT Biến đổi cosin rời rạc.
Hidden Markov Model HMM Mô hình Markov ẩn
Linear predictive code LPC Hế số dự đoán tuyến tính
Mel-scale Frequency MFCC Hệ số cepstral độ đo mel
Cepstral Coefficient
Multi Layer Perceptron MLP Mạng perceptron truyền thẳng nhiều lớp
Speech Recognition SR,ASR Nhận dạng tiếng nói
Bias Ngưỡng kích hoạt
Pattern Recognition Nhận dạng mẫu
Likelihood Mức độ giống
Similarity Mức độ tương tự
Feature Đặc trưng
Spectral, spectrum Phổ tín hiệu

KHOÁ LUẬN TỐT NGHIỆP TRANG 49

You might also like