1.Hãy xây dựng/sưu tầm một bộ dữ liệu gồm ít nhất ...
創建於:2026年5月7日
使用 GPT-5.5 Thinking 回答 Chat01
創建於:2026年5月7日
使用 GPT-5.5 Thinking 回答 Chat01
1.Hãy xây dựng/sưu tầm một bộ dữ liệu gồm ít nhất 500 files âm thanh về tiếng chim, các file có độ dài phù hợp để trích xuất các đặc trưng của tiếng chim (SV tùy chọn định dạng file âm thanh).
2.Hãy xây dựng một bộ thuộc tính để nhận diện tiếng chim hót của các file âm thanh khác nhau từ bộ dữ liệu đã thu thập. Trình bày cụ thể về lý do lựa chọn và giá trị thông tin của các thuộc tính này.
3. Xây dựng hệ CSDL để quản trị các siêu dữ liệu và trình bày cơ chế tìm kiếm tiếng chim hót dựa trên các siêu dữ liệu này.
4. Xây dựng hệ thống tìm kiếm tiếng chim với đầu vào là một file âm thanh mới của một loài chim nào đó (loài đã có và không có trong dữ liệu), đầu ra là 5 files giống nhất, xếp thứ tự giảm dần về độ tương đồng với âm thanh đầ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 kết quả trung gian của quá trình tìm kiếm tiếng chim.
5.Demo hệ thống và đánh giá kết quả đã đạt được.
đây là yêu cầu của giảng viên
hãy đọc các file trong dự án của tôi và tổng quan lại dự án, nếu ra tôi làm được những gì và bây giờ cần thêm gì, nhiệm vụ trong nhóm của tôi là phần 4b và 5
pythonimport pandas as pd, os, json, textwrap, numpy as np path='/mnt/data/train_metadata.csv' df=pd.read_csv(path) df.shape, df.columns.tolist(), df.head(3).to_dict('records')[:1] ((24459, 12), ['primary_label', 'secondary_labels', 'type', 'latitude', 'longitude', 'scientific_name', 'common_name', 'author', 'license', 'rating', 'url', 'filename'], [{'primary_label': 'asbfly', 'secondary_labels': '[]', 'type': "['call']", 'latitude': 39.2297, 'longitude': 118.1987, 'scientific_name': 'Muscicapa dauurica', 'common_name': 'Asian Brown Flycatcher', 'author': 'Matt Slaymaker', 'license': 'Creative Commons Attribution-NonCommercial-ShareAlike 3.0', 'rating': 5.0, 'url': 'https://www.xeno-canto.org/134896', 'filename': 'asbfly/XC134896.ogg'}])
pythonstats = { "rows": len(df), "unique_primary_labels": df['primary_label'].nunique(), "unique_common_names": df['common_name'].nunique(), "rating_min": df['rating'].min(), "rating_max": df['rating'].max(), "rating_mean": df['rating'].mean(), "top_labels": df['primary_label'].value_counts().head(10).to_dict() } stats {'rows': 24459, 'unique_primary_labels': 182, 'unique_common_names': 182, 'rating_min': np.float64(0.0), 'rating_max': np.float64(5.0), 'rating_mean': np.float64(3.8434931926898073), 'top_labels': {'bcnher': 500, 'barswa': 500, 'bkwsti': 500, 'blrwar1': 500, 'comsan': 500, 'comgre': 500, 'eaywag1': 500, 'commoo3': 500, 'comkin1': 500, 'comros': 500}}
pythonfrom pathlib import Path for fn in ['data.py','build_db.py','search_birds.py']: print('---',fn) lines=Path('/mnt/data/'+fn).read_text(encoding='utf-8').splitlines() for i,l in enumerate(lines,1): if any(s in l for s in ['BASE_DIR', 'TOTAL_REQUIRED', 'def get_balanced_file_list', 'drop_duplicates', 'process_and_save', 'librosa.effects.trim', 'sf.write', 'new_name', 'HOÀN TẤT YÊU CẦU 1', 'AUDIO_DIR', 'DB_PATH', 'N_SEGMENTS', 'def extract_features_for_db', 'CREATE TABLE', 'INSERT INTO', 'def calculate_combined_similarity', 'StandardScaler', 'if query_matrix', 'diff =', 'similarity =', 'def search_similar_birds', 'cursor.execute', 'top_indices', 'select_audio_file', "
Dưới đây là tổng quan dự án của bạn theo đúng 5 yêu cầu của giảng viên, rồi mình tách riêng phần 4b và 5 là nhiệm vụ của bạn.
Bạn đã có phần xử lý yêu cầu 1 trong data.py.
File này đặt mục tiêu TOTAL_REQUIRED = 500, chuẩn hóa sample rate SR = 22050, chuẩn hóa độ dài mỗi file về 10 giây, và lưu ra thư mục bird_prepared_500. (data.py)
Quy trình chọn dữ liệu cũng khá hợp lý: đọc train_metadata.csv, loại trùng theo author, latitude, longitude, primary_label, rồi chọn tương đối cân bằng theo từng loài. (data.py)
Phần tiền xử lý âm thanh đã có: load file .ogg, loại khoảng lặng bằng librosa.effects.trim, cắt hoặc padding về 10 giây, rồi lưu sang .wav. (data.py)
Kết luận: yêu cầu 1 cơ bản đã làm được. Cần kiểm tra lại trên máy bạn xem thư mục bird_prepared_500 có đủ đúng 500 file .wav hay chưa.
Bạn đã làm phần trích xuất đặc trưng trong cả build_db.py và search_birds.py.
Mỗi file được chia thành 10 đoạn, mỗi đoạn trích xuất 18 thuộc tính gồm:
| Nhóm thuộc tính | Số chiều | Ý nghĩa |
|---|---|---|
| MFCC | 13 | Biểu diễn hình dạng phổ âm, rất quan trọng cho âm sắc tiếng chim |
| Spectral Centroid | 1 | Cho biết âm thanh sáng/cao hay trầm |
| ZCR | 1 | Phản ánh mức dao động nhanh/chậm của tín hiệu |
| Silence Ratio | 1 | Tỷ lệ khoảng lặng trong đoạn |
| Spectral Bandwidth | 1 | Độ rộng phổ tần |
| Pitch/F0 | 1 | Độ cao cơ bản của tiếng chim |
Trong code, các đặc trưng này được gộp thành vector 18 chiều cho từng đoạn, tức mỗi file có ma trận đặc trưng kích thước 10 × 18. (build_db.py)
Kết luận: yêu cầu 2 đã làm được về mặt kỹ thuật. Khi viết báo cáo, cần bổ sung phần giải thích “lý do chọn” và “giá trị thông tin” của từng thuộc tính.
Bạn đã xây dựng CSDL SQLite trong build_db.py.
CSDL có bảng bird_metadata gồm các trường: id, file_name, xc_id, common_name, scientific_name, author, file_path, feature_vector, duration_seconds, sample_rate. (build_db.py)
Sau đó chương trình duyệt các file .wav trong bird_prepared_500, trích xuất đặc trưng, lấy thông tin metadata từ train_metadata.csv, rồi insert vào bảng bird_metadata. (build_db.py)
Kết luận: yêu cầu 3 đã làm được. Tuy nhiên, phần “cơ chế tìm kiếm dựa trên metadata” vẫn cần viết rõ hơn trong báo cáo, ví dụ tìm theo tên loài, tác giả, sample rate, độ dài, hoặc lọc theo common_name/scientific_name.
Bạn đã có quy trình xử lý đầy đủ trong code, chỉ cần vẽ lại thành sơ đồ khối.
Quy trình hiện tại là:
textFile âm thanh đầu vào ↓ Tiền xử lý: trim silence, chuẩn hóa 10s, SR = 22050 ↓ Chia file thành 10 đoạn ↓ Trích xuất đặc trưng 18 chiều / đoạn ↓ Tạo ma trận query 10 × 18 ↓ Đọc feature_vector từ SQLite ↓ Chuẩn hóa Z-score ↓ Lọc đoạn quá im lặng ↓ Tính khoảng cách Euclidean có trọng số ↓ Đổi khoảng cách thành độ tương đồng ↓ Sắp xếp giảm dần ↓ Trả về top 5 file giống nhất
Trong search_birds.py, hệ thống trích xuất đặc trưng từ query, load toàn bộ vector từ SQLite, tính điểm tương đồng, rồi lấy top 5 kết quả. (search_birds.py)
Hiện tại code đã có các bước trung gian, nhưng chưa in/ghi lại đầy đủ để đưa vào báo cáo.
Các kết quả trung gian bạn nên trình bày gồm:
Ví dụ:
textFile query: bird_001_asbfly_XC134896.wav Định dạng: wav Sample rate sau chuẩn hóa: 22050 Hz Độ dài sau chuẩn hóa: 10 giây
Trong code, người dùng có thể chọn file từ database hoặc chọn file mới từ máy tính. (search_birds.py)
Nên ghi:
text- Đã loại bỏ khoảng lặng đầu/cuối file. - File được cắt hoặc padding về 10 giây. - File được chia thành 10 đoạn, mỗi đoạn dài 1 giây.
Trong search_birds.py, query được trim silence, chuẩn hóa về 10 giây và chia thành N_SEGMENTS = 10. (search_birds.py) (search_birds.py)
Đây là phần rất quan trọng cho 4b. Bạn nên trình bày dạng bảng rút gọn:
| Segment | MFCC_mean | Centroid | ZCR | Silence Ratio | Bandwidth | Pitch |
|---|---|---|---|---|---|---|
| 1 | ... | ... | ... | ... | ... | ... |
| 2 | ... | ... | ... | ... | ... | ... |
| ... | ... | ... | ... | ... | ... | ... |
| 10 | ... | ... | ... | ... | ... | ... |
Không cần trình bày đủ 13 hệ số MFCC trong slide, vì sẽ quá dài. Bạn có thể ghi:
textMỗi segment có vector 18 chiều: [MFCC1…MFCC13, Centroid, ZCR, Silence Ratio, Bandwidth, Pitch]
Code hiện tại tạo đúng vector này. (search_birds.py)
Bạn nên ghi:
textToàn bộ ma trận đặc trưng của file query và các file trong database được chuẩn hóa bằng Z-score để đưa các thuộc tính về cùng thang đo.
Trong code, bạn dùng StandardScaler để chuẩn hóa query và database trước khi tính khoảng cách. (search_birds.py)
Bạn nên trình bày:
textNếu một đoạn có Silence Ratio > 0.95 thì đoạn đó được xem là không có nhiều thông tin tiếng chim và bị bỏ qua khi tính độ tương đồng.
Trong code, điều kiện lọc là query_matrix[k][SILENCE_IDX] <= 0.95 và db_original[k][SILENCE_IDX] <= 0.95. (search_birds.py)
Công thức bạn đang dùng có thể trình bày như sau:
textVới từng đoạn hợp lệ: distance = sqrt(sum(((query_feature - db_feature) * weight)^2)) Sau đó: similarity = exp(-average_distance)
Code hiện tại dùng khoảng cách Euclidean có trọng số, sau đó chuyển sang điểm tương đồng bằng hàm exp(-avg_dist). (search_birds.py)
Bạn đã có phần in ra bảng kết quả gồm Rank, Độ Tương Tự, Loài Chim, Tên File. (search_birds.py)
Nên trình bày trong báo cáo như bảng:
| Rank | File kết quả | Loài | Similarity |
|---|---|---|---|
| 1 | ... | ... | 0.xxx |
| 2 | ... | ... | 0.xxx |
| 3 | ... | ... | 0.xxx |
| 4 | ... | ... | 0.xxx |
| 5 | ... | ... | 0.xxx |
Phần demo hiện tại đã có giao diện dòng lệnh, chưa có giao diện web/app. Khi chạy search_birds.py, chương trình cho chọn:
text1. Chọn file từ database (bird_prepared_500) 2. Chọn file mới từ máy tính
Sau đó hệ thống chạy tìm kiếm và trả về 5 file giống nhất. (search_birds.py)
Mục tiêu: kiểm tra hệ thống có tìm lại được file cùng loài hay không.
Kịch bản:
textInput: một file trong bird_prepared_500 Output: top 5 file giống nhất Kỳ vọng: top 5 nên có nhiều file cùng primary_label hoặc cùng loài gần giống.
Cách đánh giá:
textTop-1 đúng loài hay không? Trong top 5 có bao nhiêu file đúng loài?
Ví dụ bảng đánh giá:
| Query file | Loài thật | Top-1 đúng? | Số file đúng trong Top-5 |
|---|---|---|---|
| query_01.wav | asbfly | Có | 4/5 |
| query_02.wav | barswa | Có | 3/5 |
| query_03.wav | comkin1 | Không | 2/5 |
Mục tiêu: kiểm tra khả năng nhận diện file bên ngoài database.
Kịch bản:
textInput: file tiếng chim mới tải từ bên ngoài, nhưng thuộc loài có trong database. Output: top 5 file giống nhất. Kỳ vọng: các kết quả đầu có cùng loài hoặc loài âm thanh gần giống.
Đánh giá:
textNếu top 1 hoặc top 5 có file cùng loài thì hệ thống hoạt động tốt.
Đây là phần giảng viên có nhắc: “loài đã có và không có trong dữ liệu”.
Kịch bản:
textInput: file tiếng chim của loài không nằm trong 500 file. Output: hệ thống vẫn trả về 5 file giống nhất. Kỳ vọng: không thể nhận diện đúng loài, nhưng có thể trả về các file có đặc trưng âm thanh gần nhất.
Bạn nên nói rõ:
textVới loài chưa có trong CSDL, hệ thống không kết luận tên loài chính xác, mà chỉ thực hiện truy vấn tương đồng âm thanh. Do đó đầu ra là 5 file gần nhất về mặt đặc trưng âm học.
Câu này rất quan trọng để tránh bị hỏi “sao loài chưa có mà vẫn trả về kết quả”.
Bạn nên bổ sung chức năng in/log các kết quả trung gian:
text- Tên file query - Shape ma trận đặc trưng: 10 × 18 - Một vài giá trị đặc trưng của query - Số file được load từ database - Số segment hợp lệ sau khi lọc silence - Điểm similarity của top 5
Hiện tại code chỉ trả kết quả cuối, chưa in rõ các bước trung gian. Đây là thiếu sót chính của phần 4b.
Bạn cần có bảng đánh giá, tối thiểu khoảng 10–20 file test.
Nên làm bảng:
| STT | Query | Loài thật | Top-1 | Top-1 đúng? | Số đúng trong Top-5 | Nhận xét |
|---|---|---|---|---|---|---|
| 1 | file A | asbfly | asbfly | Có | 4/5 | Tốt |
| 2 | file B | barswa | barswa | Có | 3/5 | Tốt |
| 3 | file C | loài ngoài CSDL | — | Không áp dụng | — | Trả về loài gần âm nhất |
Sau đó tính:
textTop-1 Accuracy = số query có top-1 đúng loài / tổng số query đã có loài trong CSDL Top-5 Accuracy = số query có ít nhất 1 kết quả đúng loài trong top 5 / tổng số query đã có loài trong CSDL Precision@5 = tổng số kết quả đúng trong top 5 / tổng số kết quả top 5
data.py đang hard-code theo máy Windows của một bạn khácpythonBASE_DIR = r"C:\Users\hoang\OneDrive\Desktop\CSDLDPT"
Nên đổi thành đường dẫn tương đối để máy nào cũng chạy được, ví dụ:
pythonBASE_DIR = os.getcwd()
Dòng hard-code này nằm trong phần cấu hình của data.py. (data.py)
common_name trong databaseHiện tại common_name đang lưu species_label, tức mã loài như asbfly, chứ chưa phải tên phổ thông như “Asian Brown Flycatcher”. Trong build_db.py, bạn đang lấy scientific_name và author, nhưng chưa lấy common_name thật từ CSV. (build_db.py)
Nếu demo chọn một file có sẵn trong database, top 1 có thể là chính file đó. Khi đánh giá, nên loại file query khỏi danh sách kết quả nếu file_path trùng với query.
Hiện tại hàm search_similar_birds() chỉ trả về top 5, chưa trả về ma trận đặc trưng query, số segment hợp lệ, điểm từng file, hoặc bảng so sánh chi tiết. (search_birds.py)
Bạn có thể viết như sau:
Dự án đã xây dựng được hệ thống tìm kiếm tiếng chim dựa trên đặc trưng âm thanh. Dữ liệu âm thanh được chuẩn hóa về cùng sample rate 22050 Hz và độ dài 10 giây. Mỗi file được chia thành 10 đoạn, mỗi đoạn trích xuất vector 18 chiều gồm MFCC, Spectral Centroid, Zero Crossing Rate, Silence Ratio, Spectral Bandwidth và Pitch. Các vector đặc trưng cùng metadata được lưu trong CSDL SQLite. Khi có file âm thanh đầu vào, hệ thống trích xuất đặc trưng tương tự, chuẩn hóa Z-score, lọc các đoạn im lặng, tính khoảng cách Euclidean có trọng số và trả về 5 file có độ tương đồng cao nhất.
Với nhiệm vụ của bạn, phần đã có là hệ thống tìm kiếm top 5. Phần cần bổ sung là bảng kết quả trung gian cho 4b và bảng demo/đánh giá định lượng cho phần 5.
dựa vào file mẫu csdldpt tôi muốn hoàn thiện báo cáo của nhóm mình là nhóm 6, hướng dẫn tôi thực hiện hoàn thiện đầy đủ báo cáo của nhóm mình
Dưới đây là cách bạn nên hoàn thiện báo cáo nhóm 6 dựa trên file mẫu CSDLDPT và các file dự án hiện có.
Báo cáo nhóm 6 hiện mới có khoảng 3 trang, gồm: bìa, đề bài, phần mở đầu, mục tiêu cụ thể và công nghệ chính. Nội dung hiện đã nêu đúng đề tài “xây dựng hệ CSDL lưu trữ và tìm kiếm tiếng chim hót”, yêu cầu trả về 5 file giống nhất, và có nhắc đến SQLite, Librosa, Soundfile, Scikit-learn. ([D22- Lớp 4] Nhóm 6.pdf)
File mẫu có cấu trúc đầy đủ hơn: mở đầu, mục tiêu, công nghệ, xây dựng dataset, bộ thuộc tính, nguyên lý trích rút đặc trưng, sơ đồ khối, mô tả quy trình, lưu trữ, tìm kiếm và phần thực nghiệm/kết quả trung gian. (CSDLDPT báo cáo (2).pdf)
Vì vậy, nhóm bạn không cần viết lại từ đầu. Bạn nên dùng file mẫu làm khung báo cáo, nhưng phải đổi toàn bộ nội dung từ “tìm kiếm nội dung file âm thanh/giọng nói” sang “tìm kiếm tiếng chim hót”.
Bạn nên làm báo cáo theo bố cục sau:
textTRANG BÌA ĐỀ BÀI MỤC LỤC I. MỞ ĐẦU 1. Bối cảnh 2. Mục tiêu cụ thể 3. Công nghệ sử dụng II. XÂY DỰNG DATASET 1. Nguồn dữ liệu 2. Tiêu chí chọn file 3. Tiền xử lý âm thanh 4. Kết quả dataset sau xử lý III. XÂY DỰNG BỘ THUỘC TÍNH ĐẶC TRƯNG 1. Các thuộc tính metadata 2. Các thuộc tính đặc trưng âm thanh 3. Lý do lựa chọn từng thuộc tính 4. Cấu trúc vector đặc trưng IV. XÂY DỰNG CƠ SỞ DỮ LIỆU 1. Thiết kế bảng bird_metadata 2. Quy trình lưu metadata và feature vector 3. Cơ chế tìm kiếm dựa trên metadata V. HỆ THỐNG TÌM KIẾM TIẾNG CHIM 1. Sơ đồ khối hệ thống 2. Quy trình tìm kiếm 3. Công thức tính độ tương đồng 4. Kết quả trung gian của quá trình tìm kiếm VI. DEMO HỆ THỐNG VÀ ĐÁNH GIÁ 1. Môi trường chạy demo 2. Kịch bản demo 3. Kết quả demo 4. Đánh giá kết quả 5. Hạn chế và hướng phát triển VII. KẾT LUẬN PHỤ LỤC: Code chính
Phần V.4 và VI là phần của bạn: 4b và 5.
Phần này nhóm bạn đã có rồi, chỉ cần mở rộng thêm một chút. Nội dung nên nhấn mạnh:
Bạn có thể viết thêm đoạn này:
Trong bài toán tiếng chim hót, mỗi file âm thanh không chỉ được quản lý bằng tên file hay tên loài, mà còn được biểu diễn bằng các đặc trưng âm học như MFCC, cao độ, trọng tâm phổ, băng thông phổ và tỷ lệ khoảng lặng. Nhờ đó, hệ thống có thể tìm kiếm các file có tiếng hót tương đồng với file truy vấn, kể cả khi file đầu vào thuộc loài chưa có trong cơ sở dữ liệu.
Dựa vào data.py, nhóm bạn đã có quy trình tạo dataset tương đối đầy đủ. Code đặt mục tiêu TOTAL_REQUIRED = 500, sample rate SR = 22050, độ dài chuẩn DURATION = 10 giây và thư mục lưu kết quả là bird_prepared_500. (data.py)
Phần này nên trình bày theo 4 ý:
Viết:
Dữ liệu được lấy từ tập dữ liệu tiếng chim trên Kaggle, gồm các file âm thanh gốc và file metadata
train_metadata.csv. Metadata cung cấp các thông tin như tên file, mã loài, tên khoa học, tác giả, vị trí thu âm.
Dựa vào code, bạn đang loại trùng theo author, latitude, longitude, primary_label, sau đó chọn một số file đại diện cho từng loài để đảm bảo cân bằng. (data.py)
Viết:
Để tránh dữ liệu bị lệch về một loài hoặc một nguồn thu âm, hệ thống loại bỏ các bản ghi trùng lặp theo tác giả, vị trí và mã loài. Sau đó, chương trình chọn số lượng file tương đối cân bằng giữa các loài cho đến khi đủ 500 file.
Trong code, mỗi file được load bằng Librosa, loại bỏ khoảng lặng bằng librosa.effects.trim, cắt hoặc padding về 10 giây, sau đó lưu thành .wav. (data.py)
Viết:
Các file âm thanh gốc được chuẩn hóa về cùng tần số lấy mẫu 22050 Hz, loại bỏ khoảng lặng ở đầu/cuối file, sau đó cắt hoặc thêm padding để đạt độ dài 10 giây. Việc chuẩn hóa này giúp các file có cùng kích thước tín hiệu, thuận lợi cho quá trình chia đoạn và trích xuất đặc trưng.
Cần chèn ảnh minh họa:
bird_prepared_500.data.py.Bảng nên có dạng:
| Thuộc tính | Giá trị |
|---|---|
| Số lượng file | 500 |
| Định dạng sau xử lý | WAV |
| Sample rate | 22050 Hz |
| Độ dài mỗi file | 10 giây |
| Thư mục lưu | bird_prepared_500 |
| Nguồn metadata | train_metadata.csv |
Phần này rất quan trọng vì yêu cầu 2 của giảng viên bắt trình bày lý do lựa chọn và giá trị thông tin của thuộc tính.
Trong code, mỗi file được chia thành 10 phân đoạn, mỗi phân đoạn trích xuất vector 18 chiều, gồm 13 MFCC và 5 đặc trưng bổ sung: Spectral Centroid, ZCR, Silence Ratio, Spectral Bandwidth, Pitch. (build_db.py)
Bạn nên trình bày bảng này:
| Thuộc tính | Số chiều | Ý nghĩa | Lý do chọn |
|---|---|---|---|
| MFCC | 13 | Biểu diễn đặc trưng phổ/âm sắc | Tiếng chim khác nhau có cấu trúc phổ khác nhau |
| Spectral Centroid | 1 | Trọng tâm phổ tần số | Phân biệt âm sáng/cao với âm trầm |
| Zero Crossing Rate | 1 | Tốc độ đổi dấu tín hiệu | Phản ánh mức dao động nhanh/chậm |
| Silence Ratio | 1 | Tỷ lệ khoảng lặng | Loại bỏ đoạn ít thông tin |
| Spectral Bandwidth | 1 | Độ rộng phổ | Phân biệt tiếng hót hẹp/rộng dải tần |
| Pitch/F0 | 1 | Cao độ cơ bản | Tiếng chim thường khác nhau rõ ở cao độ |
Đoạn giải thích có thể viết:
Mỗi file âm thanh được chuẩn hóa về 10 giây và chia thành 10 đoạn, mỗi đoạn dài khoảng 1 giây. Với mỗi đoạn, hệ thống trích xuất 18 đặc trưng âm học. Cách biểu diễn theo phân đoạn giúp giữ lại sự thay đổi theo thời gian của tiếng chim thay vì chỉ lấy một vector trung bình cho toàn bộ file. Như vậy, mỗi file được biểu diễn bằng ma trận đặc trưng kích thước 10 × 18.
Phần này dựa vào build_db.py.
CSDL của bạn dùng SQLite, bảng chính là bird_metadata, gồm các trường: id, file_name, xc_id, common_name, scientific_name, author, file_path, feature_vector, duration_seconds, sample_rate. (build_db.py)
Bạn nên chèn bảng thiết kế CSDL:
| Tên trường | Kiểu dữ liệu | Ý nghĩa |
|---|---|---|
| id | INTEGER | Khóa chính |
| file_name | TEXT | Tên file âm thanh |
| xc_id | TEXT | Mã file gốc |
| common_name | TEXT | Mã/tên loài |
| scientific_name | TEXT | Tên khoa học |
| author | TEXT | Người thu âm/tác giả |
| file_path | TEXT | Đường dẫn file |
| feature_vector | TEXT | Vector đặc trưng dạng JSON |
| duration_seconds | REAL | Thời lượng file |
| sample_rate | INTEGER | Tần số lấy mẫu |
Đoạn mô tả:
Khi xây dựng CSDL, hệ thống duyệt toàn bộ file
.wavtrong thư mụcbird_prepared_500, trích xuất ma trận đặc trưng 10 × 18, chuyển ma trận này sang dạng JSON và lưu vào trườngfeature_vector. Đồng thời, hệ thống lấy thêm thông tin từtrain_metadata.csvnhư tên khoa học và tác giả để lưu cùng metadata. (build_db.py)
Phần “cơ chế tìm kiếm dựa trên metadata” nên viết thêm:
Ngoài tìm kiếm theo nội dung âm thanh, CSDL còn hỗ trợ truy vấn metadata như tìm theo tên file, mã loài, tên khoa học, tác giả, thời lượng hoặc sample rate. Các truy vấn này được thực hiện bằng SQL trên bảng
bird_metadata, giúp người dùng lọc nhanh dữ liệu trước hoặc sau khi tìm kiếm tương đồng âm thanh.
Hiện tại search_birds.py đã có quy trình tìm kiếm: trích xuất đặc trưng query, đọc feature_vector từ SQLite, tính độ tương đồng, sắp xếp và trả về top 5. (search_birds.py)
Nhưng báo cáo cần kết quả trung gian, không chỉ kết quả cuối. Bạn nên trình bày theo 6 bước sau.
Trong báo cáo, tạo bảng:
| Thuộc tính | Giá trị ví dụ |
|---|---|
| File query | bird_001_xxx.wav |
| Định dạng | WAV |
| Sample rate | 22050 Hz |
| Độ dài sau chuẩn hóa | 10 giây |
| Số đoạn | 10 |
| Số đặc trưng mỗi đoạn | 18 |
| Kích thước ma trận query | 10 × 18 |
Chèn ảnh terminal lúc chương trình in:
textFile query: ... Bắt đầu tìm kiếm...
Viết:
File truy vấn được load bằng Librosa với sample rate 22050 Hz. Sau đó hệ thống loại bỏ khoảng lặng bằng
librosa.effects.trim, chuẩn hóa độ dài về 10 giây, rồi chia thành 10 đoạn bằng nhau để trích xuất đặc trưng.
Phần này đúng với hàm extract_features_segmented() trong search_birds.py. (search_birds.py)
Bạn không nên đưa đủ 18 cột vì quá dài. Chỉ cần đưa bảng rút gọn:
| Segment | MFCC_mean | Centroid | ZCR | Silence Ratio | Bandwidth | Pitch |
|---|---|---|---|---|---|---|
| 1 | ... | ... | ... | ... | ... | ... |
| 2 | ... | ... | ... | ... | ... | ... |
| 3 | ... | ... | ... | ... | ... | ... |
| ... | ... | ... | ... | ... | ... | ... |
| 10 | ... | ... | ... | ... | ... | ... |
Đoạn mô tả:
Mỗi đoạn âm thanh được biểu diễn bởi vector gồm 18 giá trị: 13 hệ số MFCC và 5 đặc trưng bổ sung gồm Spectral Centroid, ZCR, Silence Ratio, Spectral Bandwidth và Pitch. (search_birds.py)
Trong code, dữ liệu query và database được gom lại rồi chuẩn hóa bằng StandardScaler. (search_birds.py)
Viết:
Do các đặc trưng có đơn vị và thang đo khác nhau, ví dụ Pitch có giá trị theo Hz còn ZCR thường nằm trong khoảng nhỏ, hệ thống chuẩn hóa toàn bộ dữ liệu bằng Z-score trước khi tính khoảng cách. Việc chuẩn hóa giúp các thuộc tính đóng góp công bằng hơn vào điểm tương đồng.
Trong code, các segment có Silence Ratio > 0.95 bị bỏ qua khi tính tương đồng. (search_birds.py)
Bảng nên có:
| Segment | Silence Ratio Query | Trạng thái |
|---|---|---|
| 1 | 0.12 | Giữ lại |
| 2 | 0.97 | Bỏ qua |
| 3 | 0.21 | Giữ lại |
Đoạn mô tả:
Các đoạn có tỷ lệ khoảng lặng quá cao không chứa nhiều thông tin tiếng chim, do đó được bỏ qua để tránh làm sai lệch độ tương đồng.
Công thức bạn đang dùng:
textdistance = sqrt(sum(((query_feature - db_feature) * weight)^2)) similarity = exp(-average_distance)
Trong báo cáo, ghi:
Sau khi chuẩn hóa và lọc các đoạn không hợp lệ, hệ thống tính khoảng cách Euclidean có trọng số giữa từng đoạn của file truy vấn và file trong CSDL. Khoảng cách trung bình được chuyển thành điểm tương đồng bằng hàm mũ
exp(-avg_dist). Điểm càng gần 1 thì hai file càng giống nhau.
Bảng kết quả trung gian nên có:
| File so sánh | Số segment hợp lệ | Avg distance | Similarity |
|---|---|---|---|
| bird_001_xxx.wav | 9 | 0.421 | 0.656 |
| bird_123_xxx.wav | 8 | 0.538 | 0.584 |
| bird_312_xxx.wav | 10 | 0.692 | 0.500 |
Sau đó mới đưa bảng top 5:
| Rank | File kết quả | Loài | Similarity |
|---|---|---|---|
| 1 | ... | ... | ... |
| 2 | ... | ... | ... |
| 3 | ... | ... | ... |
| 4 | ... | ... | ... |
| 5 | ... | ... | ... |
Trong search_birds.py, hệ thống đã có demo dòng lệnh: người dùng chọn file trong database hoặc chọn file mới từ máy tính, sau đó chương trình in bảng top 5 kết quả. (search_birds.py)
Bạn nên hoàn thiện phần demo theo 3 kịch bản.
Mục tiêu: kiểm tra hệ thống có tìm được các file cùng loài hoặc gần giống không.
Cách làm:
textpython search_birds.py Chọn 1: Chọn file từ database Chọn một file bất kỳ Ghi lại top 5 kết quả
Lưu ý quan trọng: nếu query là file có sẵn trong database, top 1 có thể chính là nó. Khi đánh giá nghiêm túc, nên loại file query ra khỏi kết quả để tránh “ăn gian”.
Bảng báo cáo:
| Query file | Loài query | Rank 1 | Rank 2 | Rank 3 | Rank 4 | Rank 5 | Nhận xét |
|---|---|---|---|---|---|---|---|
| bird_001_xxx.wav | asbfly | ... | ... | ... | ... | ... | Có nhiều file cùng loài |
Mục tiêu: kiểm tra hệ thống với file bên ngoài.
Cách làm:
Bảng:
| Query ngoài CSDL | Loài thật | Top 1 | Top 5 có cùng loài không? | Nhận xét |
|---|---|---|---|---|
| test_asbfly.wav | asbfly | ... | Có/Không | ... |
Mục tiêu: chứng minh hệ thống vẫn trả về 5 file gần nhất, nhưng không khẳng định nhận diện đúng loài.
Đoạn nên viết trong báo cáo:
Với file truy vấn thuộc loài chưa có trong CSDL, hệ thống không thể trả về đúng tên loài vì dữ liệu huấn luyện không chứa loài đó. Tuy nhiên, hệ thống vẫn thực hiện tìm kiếm tương đồng âm học và trả về 5 file có đặc trưng gần nhất trong CSDL.
Bảng:
| Query | Loài thật | Có trong CSDL? | Top 1 | Top 5 | Nhận xét |
|---|---|---|---|---|---|
| unknown_bird.wav | loài ngoài CSDL | Không | ... | ... | Trả về âm thanh gần nhất |
Bạn nên đánh giá tối thiểu bằng 3 chỉ số:
textTop-1 Accuracy = Số query có kết quả rank 1 đúng loài / Tổng số query test
textTop-5 Accuracy = Số query có ít nhất 1 file đúng loài trong top 5 / Tổng số query test
textPrecision@5 = Tổng số file đúng loài trong top 5 / Tổng số file được trả về
Ví dụ bảng tổng hợp:
| Số lượng query test | Top-1 Accuracy | Top-5 Accuracy | Precision@5 | Thời gian tìm kiếm TB |
|---|---|---|---|---|
| 10 | 60% | 80% | 52% | 1.2s |
Nếu chưa kịp test nhiều, dùng tối thiểu 5 query trong CSDL + 2 query ngoài CSDL + 1 query loài chưa có.
Bạn nên chuẩn bị các ảnh sau:
| Ảnh | Đưa vào phần nào |
|---|---|
Thư mục bird_prepared_500 có 500 file | II. Dataset |
Terminal chạy data.py thành công | II. Dataset |
Terminal chạy build_db.py thành công | IV. CSDL |
Ảnh DB Browser for SQLite mở bảng bird_metadata | IV. CSDL |
Ảnh chạy search_birds.py chọn file query | V/VI |
| Ảnh bảng top 5 kết quả | VI. Demo |
| Ảnh file âm thanh query và file kết quả nếu có giao diện phát lại | VI. Demo |
File mẫu có sơ đồ khối ở trang 12, gồm input, tiền xử lý, trích xuất đặc trưng, lưu trữ, tìm kiếm và trả kết quả. (CSDLDPT báo cáo (2).pdf)
Với nhóm 6, sơ đồ nên sửa thành:
textFile tiếng chim đầu vào ↓ Tiền xử lý âm thanh Resample 22050 Hz, trim silence, chuẩn hóa 10s ↓ Chia thành 10 segment ↓ Trích xuất đặc trưng MFCC, Centroid, ZCR, Silence Ratio, Bandwidth, Pitch ↓ Ma trận đặc trưng 10 × 18 ↓ Lưu vào SQLite Metadata + Feature Vector JSON ↓ File query mới ↓ Trích xuất đặc trưng query ↓ Chuẩn hóa Z-score ↓ Lọc segment im lặng ↓ Tính Weighted Euclidean Distance ↓ Tính Similarity = exp(-distance) ↓ Sắp xếp giảm dần ↓ Trả về Top 5 file giống nhất
Bạn có thể vẽ bằng PowerPoint, Word SmartArt hoặc draw.io.
Trong báo cáo nhóm 6, phần công nghệ đang dừng ở dòng “(giao diện)”. ([D22- Lớp 4] Nhóm 6.pdf) Nên sửa thành:
text- Librosa: Dùng để load audio, loại bỏ khoảng lặng và trích xuất các đặc trưng âm học như MFCC, Spectral Centroid, ZCR, Spectral Bandwidth, Pitch. - Soundfile: Dùng để lưu các file âm thanh sau khi chuẩn hóa về định dạng WAV. - SQLite: Dùng để lưu metadata và vector đặc trưng dưới dạng JSON. - Pandas: Dùng để đọc file train_metadata.csv và lấy thông tin metadata. - NumPy: Dùng để xử lý vector, ma trận đặc trưng và tính toán khoảng cách. - Scikit-learn: Dùng StandardScaler để chuẩn hóa Z-score. - Tkinter: Dùng để tạo hộp thoại chọn file âm thanh khi demo.
Làm theo thứ tự này là báo cáo sẽ đầy đủ:
data.py.bird_metadata.Phần quan trọng nhất của bạn là không chỉ chụp kết quả top 5, mà phải chứng minh quá trình tìm kiếm đi qua các bước trung gian: query → ma trận 10×18 → chuẩn hóa → lọc silence → tính khoảng cách → similarity → top 5.