HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
KHOA CƠNG NGHỆ THÔNG TIN
----- -----
BÁO CÁO BÀI TẬP LỚN
MÔN HỌC: HỆ CƠ SỞ DỮ LIỆU ĐA PHƯƠNG TIỆN
ĐỀ TÀI:
XÂY DỰNG HỆ CƠ SỞ DỮ LIỆU NHẬN DẠNG ÂM THANH
NHẠC CỤ BỘ DÂY
CHUN NGÀNH: HỆ THỐNG THƠNG TIN
SINH VIÊN THỰC HIỆN:
NGUYỄN HỒNG QUỐC QUYỀN
B17DCCN523
DƯƠNG ĐỨC HOÀNG
B17DCCN257
LÊ TUẤN ANH
B17DCCN019
Hà Nội, năm 2021
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
KHOA CƠNG NGHỆ THÔNG TIN
----- -----
BÁO CÁO BÀI TẬP LỚN
MÔN HỌC: HỆ CƠ SỞ DỮ LIỆU ĐA PHƯƠNG TIỆN
ĐỀ TÀI:
XÂY DỰNG HỆ CƠ SỞ DỮ LIỆU NHẬN DẠNG ÂM THANH
NHẠC CỤ BỘ DÂY
CHUN NGÀNH: HỆ THỐNG THƠNG TIN
GIẢNG VIÊN: TS. NGUYỄN ĐÌNH HOÁ
Hà Nội, năm 2021
MỤC LỤC
Nội dung
MỤC LỤC..................................................................................................................................3
NHẬN XÉT CỦA GIẢNG VIÊN.................................................................................................4
DANH MỤC TỪ VIẾT TẮT.......................................................................................................5
DANH MỤC HÌNH VẼ...............................................................................................................6
MỞ ĐẦU.....................................................................................................................................7
I.
U CẦU BÀI TỐN......................................................................................................8
II.
DỮ LIỆU ÂM THANH VỀ CÁC NHẠC CỤ BỘ DÂY.....................................................8
III.
CÁC KỸ THUẬT XỬ LÝ VÀ NHẬN DẠNG TIẾNG NHẠC CỤ ĐANG HIỆN HÀNH...9
IV.
XÂY DỰNG HỆ THỐNG NHẬN DẠNG TIẾNG NHẠC CỤ ĐÀN DÂY.......................15
TÀI LIỆU THAM KHẢO.........................................................................................................30
LỜI KẾT..................................................................................................................................31
NHẬN XÉT CỦA GIẢNG VIÊN
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
Hà Nội, ngày tháng năm 2021
Giảng viên
DANH MỤC TỪ VIẾT TẮT
STT
1
2
3
4
5
6
7
8
9
10
Ký hiệu chữ viết tắt
CSDL
DTW
MFCC
DFT
DCT
IFFT
A/D
ZC
ANNOY
IBM
Chữ viết đầy đủ
Cơ sở dữ liệu
Dynamic Time Warping
Mel Frequency Cepstral Coefficient
Discrete Fourier Transform
Discrete Cosine Transform
Inverse Fast Fourier Transform
Analog to Digital
Zero Crossings
Approximate Nearest Neighbors Oh Yeah!
International Business Machines Corporation
DANH MỤC HÌNH VẼ
STT
Số hiệu
1
2
3
4
5
6
Hình 2.1
Hình 3.1
Hình 3.2
Hình 3.3
Hình 3.4
Hình 3.5
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Hình 3.6
Hình 3.7
Hình 4.1
Hình 4.2
Hình 4.3
Hình 4.4
Hình 4.5
Hình 4.6
Hình 4.7
Hình 4.8
Hình 4.9
Hình 4.10
Hình 4.11
Hình 4.12
Hình 4.13
Hình 4.14
Hình 4.15
Tên hình
Dữ liệu chuẩn bị
Mơ hình Markov 3 trạng thái
Mơ hình Markov ẩn 3 trạng thái
Mơ hình đầu ra của biến đổi wavelet
Biến đổi wavelet
Sự khác biệt giữa 2 cách so khớp chuối thời gian: theo
khoảng cách Euclide và theo DTW
Mơ hình so khớp chuỗi thời gian theo DTW
Công thức truy hồi của DTW
Sơ đồ khối q trình thực hiện
Q trình trích chọn đặc trưng âm thanh
Quá trình thực hiện nhận dạng âm thanh và truy vấn
Đồ thị chuyển đổi thang đo mel với thang đo hertz
Chuyển đổi tín hiệu liên tục sang tín hiệu rời rạc
Pre-emphasis
Framing
Các cửa sổ lọc phổ biến
Spectrogram 2D và 3D
Bộ lọc mel
Quá trình thực hiện DCT
Zero crossings
Quá trình thực hiện nhận dạng âm thanh và truy vấn
Chia mặt phẳng làm 2 nửa
ANNOY
MỞ ĐẦU
Bài toán nhận dạng âm thanh là một bài tốn điển hình trong lĩnh vực học máy, trí
tuệ nhân tạo. Nhận dạng âm thanh đang xâm nhập vào cuộc sống hiện đại. Nó được
cài đặt trong những chiếc điện thoại, điều khiển trị chơi hay những chiếc đồng hồ
thơng minh. Chỉ với khoảng $50, bạn có thể có Amazon Echo Dot - một chiếc hộp
thần kỳ cho phép bạn đặt pizza, nhận thông tin dự báo thời tiết hoặc thậm chí mua
những vật dụng - chỉ bằng cách đưa ra mệnh lệnh. Sự ra đời của Deep Learning đã
giúp việc nhận dạng âm thanh trở nên chính xác, thậm chí ở ngồi mơi trường phịng
lab.
Hãy tưởng tượng một ngày nọ bạn đang đi trên đường và vơ tình nghe thấy một
giai điệu rất quen thuộc và bắt tai, thế nhưng, bạn lại không nhớ tên bài hát, không
biết rõ đoạn nhạc này nằm ở đâu. Hay thậm chí, bạn có thể gặp vơ số các trường hợp
trên mạng xã hội mà người dùng đưa ra câu hỏi kiểu như: “Giúp em tìm bài hát có
đoạn nhạc “abcxyz…” với ạ”. Tài liệu này sẽ đưa ra thử nghiệm để giải quyết vấn đề
nhận dạng âm thanh nhạc cụ bộ dây.
I.
YÊU CẦU BÀI TOÁN
Xây dựng hệ CSDL nhận dạng âm thanh nhạc cụ bộ dây:
1. Hãy xây dựng/sưu tầm một bộ dữ liệu âm thanh về tiếng các nhạc cụ thuộc đàn
dây gồm ít nhất 100 files âm thanh của ít nhất 10 loại nhạc cụ đàn dây khác nhau,
các file âm thanh đều có cùng độ dài.
2. Hãy tìm hiểu các kỹ thuật xử lý và nhận dạng tiếng nhạc cụ đang hiện hành.
3. Xây dựng hệ thống nhận dạng tiếng nhạc cụ đàn dây với đầu vào là một file âm
thanh mới về tiếng của một nhạc cụ đàn dây đã có và chưa có trong phần 1, đầu ra
là kết quả nhận dạng tiếng nhạc cụ của file đầu vào.
a) Trình bày sơ đồ khối của hệ thống và quy trình thực hiện yêu cầu của đề bài.
b) Trình bày các thuộc tính được sử dụng để nhận dạng tiếng nhạc cụ trong hệ
thống, cùng các kỹ thuật để trích rút các thuộc tính đó.
c) Trình bày cách lưu trữ các thuộc tính âm thanh về tiếng nhạc cụ đàn dây và
cách nhận dạng tiếng nhạc cụ dựa trên các thuộc tính đó.
4. Demo hệ thống và đánh giá kết quả đã đạt được.
II.
DỮ LIỆU ÂM THANH VỀ CÁC NHẠC CỤ BỘ DÂY
Hình 2.1. Dữ liệu chuẩn bị
Gồm 100 file âm thanh về các bản solo nhạc cụ bộ dây sử dụng cho việc trích
chọn và lưu trữ đặc trưng. Tất cả đều ở định dạng wav (một trong những định dạng
âm thanh phổ biến nhất được phát triển bởi Microsoft (phối hợp với IBM) và thường
lưu trữ những dữ liệu âm thanh không nén với điều chế mã xung, nhưng nó có thể
được sử dụng để lưu trữ âm thanh xử lý với các bộ codec âm thanh khác).
Các loại nhạc cụ có trong bộ dữ liệu: Banjo, cello, đàn bầu, đàn luýt, đàn nguyệt,
đàn nhị, đàn tranh, ghita, đàn tì bà, ukulele.
Đặc điểm:
Trống tổng năng lượng lớn hơn sáo nhưng thấp hơn đàn dây, zero crossings cao
hơn sáo, cường độ ko đều, biên độ max cao nhất.
Sáo tổng năng lượng thấp nhất, zero crossings rất thấp, cường độ rất đều, biên
độ max thấp.
Đàn dây tổng năng lượng hơn trống 1 chút và là lớn nhất trong cả 3 bộ, zero
crossings hơn trống, cường độ đều hơn trống nhưng thua xa sáo, biên độ max
bé hơn trống.
III.
CÁC KỸ THUẬT XỬ LÝ VÀ NHẬN DẠNG TIẾNG NHẠC CỤ ĐANG
HIỆN HÀNH
1. Hidden Markov Model
Mơ hình Markov
Xét một hệ thống gồm N trạng thái phân biệt, được đánh số thứ tự 1, 2, …, N. Tại
thời điểm t bất kỳ, hệ thống có thể chuyển từ trạng thái Si sang một trong N – 1 trạng
thái còn lại hoặc chuyển trở lại chính trạng thái Si.
Như vậy, ở thời điểm t, từ trạng thái Si có N nhánh thao tác chuyển trạng thái. Mỗi
nhánh này có một độ đo khả năng xảy ra (xác suất xảy ra), được gọi là xác suất
chuyển trạng thái.
Hình 3.1. Mơ hình Markov 3 trạng thái
Gọi qt là trạng thái đạt được ở thời điểm t, aij là xác suất chuyển trạng thái từ Si
sang trạng thái Sj (xác suất Sj xảy ra với điều kiện Si đã xảy ra). Xác suất chuyển
trạng thái aij này không phụ thuộc vào thời gian t và độc lập với các trạng thái đã
chuyển trước đó. Duy nhất chỉ phụ thuộc vào trạng thái hiện tại. Q trình mang tính
ngẫu nhiên này được gọi là “có thuộc tính Markov”. Ta có:
Và aij phải thõa mãn các ràng buộc xác suất:
Kết xuất của hệ thống là một chuỗi các trạng thái tại các thời điểm t tương ứng. Ta
biết được trạng thái nào ở thời điểm t nào, vì vậy mơ hình này gọi là mơ hình Markov
hiện.
Mơ hình Markov ẩn
Mơ hình Markov ẩn là dạng mở rộng của mơ hình Markov. Trong mơ hình
Markov, các sự kiện quan sát được nằm trong mỗi trạng thái và phụ thuộc vào hàm
mật độ xác suất trong các trạng thái đó. Các trạng thái này có thể là các âm tiết, các từ
hay thành phần ngữ pháp trong một câu.
Hình 3.2. Mơ hình Markov ẩn 3 trạng thái
Hình trên minh họa mơ hình Markov ẩn 3 trạng thái với các sự kiện có thể quan sát
được trong mỗi trạng thái là V = {v1, v2, v3, v4}. Khả năng (xác suất) quan sát được
sự kiện vk trong trạng thái Sj phụ thuộc vào hàm xác suất bj(k). Hàm b được gọi là
hàm mật độ xác suất của các sự kiện được quan sát.
Gọi là mơ hình Markov ẩn vì chúng ta chỉ quan sát trên các tham số ẩn, chỉ
xuất hiện thông qua giai đoạn tiền xử lý (gán nhãn, phân loại) và được coi như các
“trạng thái” ẩn.
Ứng dụng
Dựa vào xác suất chuyển đổi của các trạng thái ẩn, chúng ta có thể áp dụng
Markov ẩn vào các hệ thống xử lý ngôn ngữ tự nhiên, nhận dạng mẫu âm thanh hay
dự đoán các mẫu.
2. Biến đổi wavelet
Giới thiệu chung
Trong xử lý tín hiệu, phép biến đổi Fourier là một cơng cụ tốn học quan trọng vì
nó là cầu nối cho việc biểu diễn tín hiệu giữa miền khơng gian và miền tần số. Việc
biểu diễn tín hiệu trong miền tần số đơi khi có lợi hơn là việc biểu diễn trong miền
không gian. Tuy nhiên, phép biến đổi Fourier chỉ cung cấp thơng tin có tính tồn cục
và chỉ thích hợp cho những tín hiệu tuần hồn, khơng chứa các đột biến hoặc các thay
đổi không dự báo được.
Để khắc phục khuyết điểm này, Gabor, D., (1946) đã áp dụng phép biến đổi
Fourier cửa sổ (Windowed Fourier Transform) cho từng đoạn nhỏ của tín hiệu (cửa
sổ); phép biến đổi này cho thấy mối liên hệ giữa không gian và tần số nhưng bị khống
chế bởi nguyên lý bất định Heisengber cho các thành phần tần số cao và tần số thấp
trong tín hiệu. Phép biến đổi wavelet là bước tiếp theo để khắc phục hạn chế này.
Cơ sở lý thuyết
Năm 1975, Morlet, J., phát triển phương pháp đa phân giải (multiresolution);
trong đó, ơng ta sử dụng một xung dao động, được hiểu là một “wavelet” (dịch theo từ
gốc của nó là một sóng nhỏ) cho thay đổi kích thước và so sánh với tín hiệu ở từng
đoạn riêng biệt. Kỹ thuật này bắt đầu với sóng nhỏ (wavelet) chứa các dao động tần số
khá thấp, sóng nhỏ này được so sánh với tín hiệu phân tích để có một bức tranh tồn
cục của tín hiệu ở độ phân giải thơ. Sau đó sóng nhỏ được nén lại để nâng cao dần tần
số dao động. Quá trình này gọi là làm thay đổi tỉ lệ (scale) phân tích; khi thực hiện
tiếp bước so sánh, tín hiệu sẽ được nghiên cứu chi tiết ở các độ phân giải cao hơn,
giúp phát hiện các thành phần biến thiên nhanh còn ẩn bên trong tín hiệu.
Hình 3.3. Mơ hình đầu ra của biến đổi wavelet
Phép biến đổi wavelet tương tự như phép biến đổi Fourier nhưng với một hàm
cơng bội hồn tồn khác. Sự khác biệt chính là: Biến đổi Fourier phân hủy tín hiệu
thành các sin và cosin, tức là các hàm được xác định trong không gian Fourier; ngược
lại, phép biến đổi wavelet sử dụng các hàm được xác định trong cả không gian thực và
không gian Fourier. Nói chung, biến đổi wavelet có thể được biểu diễn bằng phương
trình sau:
Hình 3.4. Biến đổi wavelet
trong đó dấu * là ký hiệu liên hợp phức tạp và hàm ψ là một số hàm. Hàm này có thể
được chọn tùy ý miễn là nó tuân theo các quy tắc nhất định. Tất cả các hệ số wavelet
lớn hơn một ngưỡng do người dùng quyết định có thể được giữ lại. Tất cả các hệ số
khác được đặt thành 0.
Như đã thấy, phép biến đổi wavelet trên thực tế là một tập hợp vô hạn các phép
biến đổi khác nhau, tùy thuộc vào hàm tích lũy được sử dụng để tính tốn của nó. Đây
là lý do chính, tại sao chúng ta có thể nghe thấy thuật ngữ “biến đổi wavelet” trong
các tình huống và ứng dụng rất khác nhau. Cũng có nhiều cách để sắp xếp các loại
biến đổi wavelet. Chúng ta có thể sử dụng wavelet trực giao để phát triển biến đổi
wavelet rời rạc và wavelet không trực giao để phát triển biến đổi wavelet liên tục. Hai
phép biến đổi này có các tính chất sau:
1. Phép biến đổi wavelet rời rạc trả về một vectơ dữ liệu có cùng độ dài với đầu vào.
Thơng thường, ngay cả trong vectơ này, nhiều dữ liệu gần như bằng không. Điều
này tương ứng với thực tế là nó phân rã thành một tập hợp các wavelet (hàm) trực
giao với các phép tịnh tiến và tỷ lệ của nó. Do đó, chúng ta phân rã một tín hiệu
như vậy thành một số tương tự hoặc thấp hơn của phổ hệ số wavelet cũng như số
điểm dữ liệu tín hiệu. Ví dụ, một phổ wavelet như vậy rất tốt cho việc xử lý và nén
tín hiệu, vì chúng ta khơng nhận được thông tin dư thừa nào ở đây.
2. Ngược lại, phép biến đổi wavelet liên tục trả về mảng lớn hơn một chiều so với dữ
liệu đầu vào. Đối với dữ liệu 1D, chúng ta thu được hình ảnh của mặt phẳng tần số
thời gian. Chúng ta có thể dễ dàng nhìn thấy sự thay đổi tần số tín hiệu trong suốt
thời gian của tín hiệu và so sánh phổ với các phổ tín hiệu khác. Vì ở đây được sử
dụng tập các wavelet khơng trực giao, dữ liệu có tính tương quan cao, do đó có thể
thấy sự dư thừa lớn ở đây.
Ứng dụng
Wavelet là một kỹ thuật hỗ trợ việc trích rút các thơng tin của âm thanh dễ dàng
hơn, giúp chúng ta có thể quan sát được các thơng số trên nhiều khía cạnh hơn.
Wavelet được sử dụng trong một số hệ thống nhận dạng âm thanh, chuỗi tín hiệu theo
thời gian hay nén thơng tin.
3. Độ cong thời gian động (Dynamic Time Warping)
Dynamic Time Warping (DTW) là một cách để so sánh hai trình tự thời gian
thường khơng đồng bộ với nhau một cách hồn hảo. Nó là một phương pháp để tính
tốn sự phù hợp tối ưu giữa hai chuỗi.
Hình 3.5. Sự khác biệt giữa 2 cách so khớp chuối thời gian: theo khoảng cách
Euclide và theo DTW
Hình 3.6. Mơ hình so khớp chuỗi thời gian theo DTW
Ràng buộc
DTW cần 1 số ràng buộc sau:
Điều kiện ranh giới: Ràng buộc này đảm bảo rằng đường cong bắt đầu bằng điểm
bắt đầu của cả hai tín hiệu và kết thúc bằng điểm cuối của chúng.
Điều kiện đơn điệu: Ràng buộc này bảo toàn thứ tự thời gian của điểm (không
quay ngược thời gian).
Điều kiện liên tục (kích thước bước): Ràng buộc này hạn chế chuyển tiếp đường
dẫn đến các điểm liền kề trong thời gian (không nhảy trong thời gian).
Điều kiện cửa sổ cong vênh: Có thể hạn chế các điểm cho phép nằm trong một cửa
sổ cong vênh nhất định có chiều rộng � (một số nguyên dương).
Điều kiện độ dốc: Đường cong có thể bị hạn chế bằng cách hạn chế độ dốc, và do
đó tránh các chuyển động cực đoan theo một hướng:
Di chuyển ngang: (�, �) → (�, � + 1)
Di chuyển dọc: (�, �) → (� + 1, �)
Di chuyển theo đường chéo: (�, �) → (� + 1, � + 1)
Cơng thức truy hồi
Hình 3.7. Cơng thức truy hồi của DTW
Ứng dụng
DTW hữu ích trong nhiều lĩnh vực như nhận dạng giọng nói, khai thác dữ liệu, thị
trường tài chính, v.v… để đối phó với các tốc độ thay đổi chuỗi khác nhau. DTW
thường được sử dụng trong khai thác dữ liệu để so sánh sự giống nhau giữa hai chuỗi
thời gian.
IV.
XÂY DỰNG HỆ THỐNG NHẬN DẠNG TIẾNG NHẠC CỤ ĐÀN DÂY
Mel Frequency Cepstral Coefficient (MFCC) là một cách để trích xuất đặc trưng
âm thanh dựa trên miền tần số sử dụng thang đo mel, thường được sử dụng trong các
model nhận dạng giọng nói (Automatic Speech Recognition) hay phân loại giọng nói
(Speech Classification). MFCC đưa ra kết quả là các hệ số (coefficients) cepstral từ
bộ lọc mel trên phổ lấy được từ file âm thanh. Mơ hình này được xây dựng mô phỏng
theo khả năng cảm nhận âm thanh của tai người.
3 đặc trưng dùng để nhận dạng trong hệ thống này là:
-
Hệ số theo quang phổ tần số mel.
Logarit của tổng năng lượng mỗi frame.
Zero crossings (số lần biên độ dao động qua lại điểm 0).
Sơ đồ khối:
Hình 4.1. Sơ đồ khối quá trình thực hiện
Hình 4.2. Q trình trích chọn đặc trưng âm thanh
Hình 4.3. Quá trình thực hiện nhận dạng âm thanh và truy vấn
1. Phổ đặc trưng mel
Thang đo mel được đặt tên bởi Stevens, Volkmann và Newman vào năm 1973.
Thang đo mel là miền tần số của âm thanh, đặc trưng cho sự cảm nhận âm thanh, âm
lượng của một giai điệu. Các nghiên cứu chỉ ra rằng nhận thức của con người đối với
tần số của âm thanh, các tín hiệu tiếng nói khơng theo một tỉ lệ tuyến tính. Vì vậy
người ta sử dụng một thang độ dựa trên tỉ lệ “mel”.
Để chuyển từ thang đo hertz sang thang đo mel ta sử dụng cơng thức:
Và cơng thức biến đổi ngược lại:
Hình 4.4. Đồ thị chuyển đổi thang đo mel với thang đo hertz
2. Trình tự thực hiện:
Giả sử ta đang có 1 đoạn âm thanh và tốc độ mẫu của nó là 16kHz.
A/D conversion
Lấy mẫu rời rạc các biên độ để có được cơ sở xây dựng bộ đặc trưng.
Âm thanh là dạng tín hiệu liên tục, trong khi đó máy tính làm việc với các con số
rời rạc. Ta cần lấy mẫu tại các khoảng thời gian cách đều nhau với 1 tần số lấy mẫu
xác định (sample rate) để chuyển từ dạng tín hiệu liên tục về dạng rời rạc. VD:
sample_rate = 8000 ⟶ trong 1s lấy 8000 giá trị.
Trong demo ta chọn sr = 16000 Hz.
song = os.path.join(data_dir, song)
y, sr = librosa.load(song, sr=16000)
Hình 4.5. Chuyển đổi tín hiệu liên tục sang tín hiệu rời rạc
Pre – emphasis
Âm thanh thu được có thể chứa nhiều âm thanh nhiễu từ môi trường như tiếng
cười nói, tiếng nhạc, tivi,... 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ủa chúng ta có đặc điểm: các âm ở tần số thấp có mức năng lượng cao,
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
các tín hiệu ở tần số cao này lên. Nguyên lý hoạt động là so sánh bit dữ liệu đã truyền
trước đó với bit dữ liệu hiện tại, trong đó khối mạch [Z – 1] cung cấp độ trễ cho một
bit dữ liệu duy nhất. Nếu hai bit - bit bị trễ và bit hiện tại - có cùng mức, thì bit hiện
tại được truyền ở mức bình thường. Nếu hai bit khác nhau, bit hiện tại được truyền
với cường độ cao hơn.Việc cài đặt đơn giản có thể thực hiện theo công thức sau:
y(t) = x(t) − αx(t − 1)
Hình 4.6. Pre-emphasis
signal = sigproc.preemphasis(signal,preemph)
def preemphasis(signal,coeff=0.95):
"""perform preemphasis on the input signal.
:param signal: The signal to filter.
:param coeff: The preemphasis coefficient. 0 is no filter, default is
0.95.\
:returns: the filtered signal.
"""
return numpy.append(signal[0],signal[1:]-coeff*signal[:-1])
Framing
Trong phân tích tín hiệu âm thanh người ta thường sử dụng phương pháp phân tích
ngắn hạn do hầu hết các tín hiệu âm thanh ổn định trong khoảng thời gian ngắn
(20ms). Do vậy áp dụng phương pháp Framing để khái quát dữ liệu âm thanh một
cách tốt nhất.
Ta chia mẫu dữ liệu âm thanh thành các frames. Mỗi frame có kích thước từ 25ms.
Các frame liên tiếp nhau sẽ chồng lên nhau (tức là từ đầu frame sau tới cuối frame
trước) khoảng 10ms, việc này giúp chúng ta không bị mất mát thơng tin bởi vì khi lấy
các frame nối tiếp nhau, các thơng tin ở biên rất có thể bị gián đoạn và mất đi.
Hình 4.7. Framing
Một vài thuật ngữ được sử dụng:
● Kích thước khung (frame size): Số điểm mẫu trong mỗi khung.
● Chồng lấp khung (frame overlap): Số điểm mẫu chồng lấp giữa các khung liên
tiếp.
● Bước khung = frame size – frame overlap
● Tỷ lệ khung (frame rate): là số khung trên mỗi giấy, được tính theo cơng thức:
tần số lấy mẫu / bước khung. Ví dụ: tần số lấy mẫu fs = 16000. Thời gian mỗi
khung là t1 = 25ms. Thời gian chồng lấp khung: t2 = 5ms
● Frame size = fs * t1 = (16000 * 25) / 1000 = 400 (điểm mẫu)
●
def fbank(signal,samplerate=16000,winlen=0.025,winstep=0.01,
nfilt=26,nfft=512,lowfreq=0,highfreq=None,preemph=0.97,
winfunc=lambda x:numpy.ones((x,))):
"""Compute mel-filterbank energy features from an audio signal.
:param signal: the audio signal from which to compute features. Should
be an N*1 array
:param samplerate: the samplerate of the signal we are working with.
:param winlen: the length of the analysis window in seconds. Default is
0.025s (25 milliseconds)
:param winstep: the step between successive windows in seconds. Default
is 0.01s (10 milliseconds)
:param nfilt: the number of filters in the filterbank, default 26.
:param nfft: the FFT size. Default is 512.
:param lowfreq: lowest band edge of mel filters. In Hz, default is 0.
:param highfreq: highest band edge of mel filters. In Hz, default is
samplerate/2
:param preemph: apply preemphasis filter with preemph as coefficient. 0
is no filter. Default is 0.97.
:param winfunc: the analysis window to apply to each frame. By default
no window is applied. You can use numpy window functions here e.g.
winfunc=numpy.hamming
:returns: 2 values. The first is a numpy array of size (NUMFRAMES by
nfilt) containing features. Each row holds 1 feature vector. The
second return value is the energy in each frame (total energy,
unwindowed)
"""
highfreq= highfreq or samplerate/2
signal = sigproc.preemphasis(signal,preemph)
frames = sigproc.framesig(signal, winlen*samplerate,
winstep*samplerate, winfunc)
pspec = sigproc.powspec(frames,nfft)
energy = numpy.sum(pspec,1) # this stores the total energy in each
frame
energy = numpy.where(energy == 0,numpy.finfo(float).eps,energy) # if
energy is zero, we get problems with log
fb =
feat
feat
zero, we
get_filterbanks(nfilt,nfft,samplerate,lowfreq,highfreq)
= numpy.dot(pspec,fb.T) # compute the filterbank energies
= numpy.where(feat == 0,numpy.finfo(float).eps,feat) # if feat is
get problems with log
return feat,energy
Windowing
Hình 4.8. Các cửa sổ lọc phổ biến
Do framing làm rời rạc hóa dữ liệu âm thanh, ta áp dụng Hamming window để
làm mịn các frame. Cửa số hóa các frame, nhằm giảm sự gián đoạn của tín hiệu tại
các biên của mỗi frame. Hay nói cách khác là giảm dần tín hiệu về 0 tại các khoảng
bắt đầu và kết thúc của mỗi frame, điều này làm thông tin dữ liệu tập trung vào chính
giữa frame. Cơng thức Hamming window:
DFT
DFT – Discrete Fourier Transform hay còn gọi là thuật toán biến đổi Fourier rời
rạc. Thuật toán này biến đổi các frame từ miền thời gian về miền tần số. Áp dụng
công thức:
def powspec(frames,NFFT):
"""Compute the power spectrum of each frame in frames. If frames is an
NxD matrix, output will be Nx(NFFT/2+1).
:param frames: the array of frames. Each row is a frame.
:param NFFT: the FFT length to use. If NFFT > frame_len, the frames are
zero-padded.
:returns: If frames is an NxD matrix, output will be Nx(NFFT/2+1). Each
row will be the power spectrum of the corresponding frame.
"""
return 1.0/NFFT * numpy.square(magspec(frames,NFFT))
Mỗi frame ta thu được 1 list các giá trị độ lớn (magnitude) tương ứng với từng tần
số từ 0 → N. Áp dụng trên tất cả các frame, ta đã thu được 1 spectrogram như hình
dưới đây. Trục xx là trục thời gian (tương ứng với thứ tự các frame), trục yy thể hiện
dải tần số từ 0 → 10000 Hz, giá trị magnitude tại từng tần số được thể hiện bằng màu
sắc. Qua quan sát spectrogram này, ta nhận thấy các tại các tần số thấp thường có
magnitude cao, tần số cao thường có magnitude thấp.
Hình 4.9. Spectrogram 2D và 3D
Mel Filtering
Hình 4.10. Bộ lọc mel
fb = get_filterbanks(nfilt,nfft,samplerate,lowfreq,highfreq)
def
get_filterbanks(nfilt=20,nfft=512,samplerate=16000,lowfreq=0,highfreq=None)
:
"""Compute a mel-filterbank. The filters are stored in the rows, the
columns correspond
to fft bins. The filters are returned as an array of size nfilt *
(nfft/2 + 1)
:param nfilt: the number of filters in the filterbank, default 20.
:param nfft: the FFT size. Default is 512.
:param samplerate: the samplerate of the signal we are working with.
Affects mel spacing.
:param lowfreq: lowest band edge of mel filters, default 0 Hz
:param highfreq: highest band edge of mel filters, default samplerate/2
:returns: A numpy array of size nfilt * (nfft/2 + 1) containing
filterbank. Each row holds 1 filter.
"""
highfreq= highfreq or samplerate/2
assert highfreq <= samplerate/2, "highfreq is greater than
samplerate/2"
# compute points evenly spaced in mels
lowmel = hz2mel(lowfreq)
highmel = hz2mel(highfreq)
melpoints = numpy.linspace(lowmel,highmel,nfilt+2)
# our points are in Hz, but we use fft bins, so we have to convert
# from Hz to fft bin number
bin = numpy.floor((nfft+1)*mel2hz(melpoints)/samplerate)
fbank = numpy.zeros([nfilt,nfft//2+1])
for j in range(0,nfilt):
for i in range(int(bin[j]), int(bin[j+1])):
fbank[j,i] = (i - bin[j]) / (bin[j+1]-bin[j])
for i in range(int(bin[j+1]), int(bin[j+2])):
fbank[j,i] = (bin[j+2]-i) / (bin[j+2]-bin[j+1])
return fbank
Đây là bước áp dụng bộ lọc mel – frequency filter. Cảm nhận của tai người là phi
tuyến tính, khơng giống các thiết bị đo. Tai người cảm nhận tốt ở các tần số thấp, kém
nhạy cảm với các tần số cao. Nên ta cần một cơ chế mapping. Dữ liệu âm thanh sau
khi được chuyển từ miền thời gian về miền tần số sẽ được đưa qua bộ lọc thang mel.
Áp dụng các phương trình biến đổi từ tần số hertz(f) sang mel (m):
Bộ lọc sẽ chỉ giữ lại miền tín hiệu nằm phía trong bộ lọc và loại bỏ đi tất cả những
vùng giá trị bên ngoài.
Logarithmic compression
Dữ liệu dạng vector thu được là những miền giá trị nằm trong bộ lọc được lấy
logarit để giảm độ lớn dữ liệu đi đáng kể, giảm độ phức tạp cho tính tốn về sau. Cụ
thể là đưa các hệ số về khoảng dao động âm dương qua điểm 0.
feat = numpy.log(feat)
DCT
DCT - Discrete Cosine Transformation, hay cịn gọi là thuật tốn biến đổi Cosine
rời rạc. Đây là bước biến đổi từ spectrum sang cepstrum, áp dụng DCT (1 dạng IFFT)
lên kết quả của filter banks, ta sẽ thu được 12 giá trị đầu tiên là 12 hệ số cepstral. Lí
do chỉ lấy 12 giá trị đó là vì chúng giúp phân biệt được âm thanh do có sự thay đổi
nhiều, các giá trị sau dao động rất ít hoặc khơng dao động nên khơng hiệu quả khi
dùng để nhận dạng âm thanh.
feat = dct(feat, type=2, axis=1, norm='ortho')[:,:numcep]
Hình 4.11. Quá trình thực hiện DCT
MFCC
Sau khi kết thúc bước DCT, mỗi frame ta thu được 9 hệ số đặc trưng mel (MFCC)
là 9 giá trị đầu tiên của MFCC, giá trị thứ 10 là tổng năng lượng của frame đó. Tiếp
đó, chúng ta sẽ gộp thuộc tính của từng 10 frame lại làm một bộ vector 100 chiều
bằng cách trượt theo bước nhảy 100ms (5 frame liền nhau) để tránh mất mát thông tin
(hệ số đầu tiên là tổng năng lượng của frame, 9 hệ số còn lại là hệ số theo quang phổ
tần số mel).
Xử lý đơn giản nhưng vẫn hiệu quả.
feat = mfcc(y, sr, nfilt=nfilt, winstep=winsteps, winfunc=np.hamming)
def crop_feature(feat, i=0, nb_step=10, maxlen=100):
crop_feat = np.array(feat[i: i + nb_step]).flatten()
crop_feat = np.pad(crop_feat, (0, maxlen - len(crop_feat)),
mode='constant')
return crop_feat
for i in range(0, feat.shape[0] - 10, 5): # (1, 101) * 98 * 100
add_zrcs = list(crop_feature(feat, i, nb_step=10))
add_zrcs.append(zcrs)
features.append(add_zrcs)
songs.append(song)
Zero crossings
Chúng ta sẽ thực hiện trích rút zero crossings theo từng file và gán thông số này
vào làm hệ số thứ 101 của mỗi vector. Các hệ số zero crossings giúp tăng độ chính
xác trong việc phân biệt các file với nhau vì mỗi file sẽ có zero crossings khác nhau.