BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HCM
MÔN THỰC TẬP HỆ THỐNG NHÚNG
BÁO CÁO LAB3
GVHD: Thầy Võ Minh HuânSVTH: Ngô Minh Thái 19161161
Lớp sáng thứ 5 tiết 1-3
Tp Hồ Chí Minh, tháng 5 năm 2022
Trang 2!pip install python_speech_features
from os import listdir
from os.path import isdir, join
- Cho phép gg colab truy cập vào drive
from google.colab import drive drive.mount('/content/drive')
- Chuyển vào thư mục muốn training
%cd /content/drive/MyDrive/Nhung
- Chọn file âm thanh dùng để training và in các tên file # Dataset path and view possible targets
dataset_path = 'speech_commands_v0.021' for name in listdir(dataset_path): if isdir(join(dataset_path, name)): print(name)
Trang 3- Tạo danh sách các file cần train và in ra # Create an all targets list
all_targets = [name for name in listdir(dataset_path) if isdir(join(dataset_path, nam e))]
- Loại bỏ file âm thanh nhiễu và in các file còn lại # Leave off background noise set
- Xem có bao nhiêu tập tin trong từng file # See how many files are in each
num_samples = 0
for target in all_targets:
print(len(listdir(join(dataset_path, target))))
num_samples += len(listdir(join(dataset_path, target)))
print('Total samples:', num_samples)
- Cài đặt các thông số và tên file train ra được
- Tạo danh sách tên tệp cùng với vectơ
# Create list of filenames along with ground truth vector (y) filenames = []
y = []
for index, target in enumerate(target_list): print(join(dataset_path, target))
filenames.append(listdir(join(dataset_path, target))) y.append(np.ones(len(filenames[index])) * index)
Trang 4# Check ground truth Y vector
for item in y:
print(len(item))
# Flatten filename and y vectors
filenames = [item for sublist in filenames for item in sublist] y = [item for sublist in y for item in sublist]
- Liên kết tên file với các đầu ra và tráo lại # Associate filenames with true output and shuffle filenames_y = list(zip(filenames, y))
random.shuffle(filenames_y) filenames, y = zip(*filenames_y)
- Chỉ giữ lại số lượng mẫu được chỉ định
# Only keep the specified number of samples (shorter extraction/training)
filenames = filenames[:int(len(filenames) * perc_keep_samples)]
- Tính toán kích thước tập hợp kiểm tra và xác thực # Calculate validation and test set sizes
val_set_size = int(len(filenames) * val_ratio) test_set_size = int(len(filenames) * test_ratio)
- Chia nhỏ tập dữ liệu thành các tập huấn luyện, xác thực và thử nghiệm # Break dataset apart into train, validation, and test sets
filenames_val = filenames[:val_set_size]
filenames_test = filenames[val_set_size:(val_set_size + test_set_size)] filenames_train = filenames[(val_set_size + test_set_size):]
- Chia nhỏ y thành các tập hợp đào tạo, xác thực và kiểm tra # Break y apart into train, validation, and test sets
y_orig_val = y[:val_set_size]
y_orig_test = y[val_set_size:(val_set_size + test_set_size)] y_orig_train = y[(val_set_size + test_set_size):]
# Function: Create MFCC from given path
def calc_mfcc(path):
Trang 5- Xây dựng bộ kiểm tra bằng tính toán MFCC của mỗi tệp WAV # TEST: Construct test set by computing MFCC of each WAV file
# Create path from given filename and target item
path = join(dataset_path, target_list[int(y_orig_train[index])],
print('% of problematic samples:', prob_cnt / 500)
# TEST: Test shorter MFCC
!pip install playsound
from playsound import playsound idx = 13
# Create path from given filename and target item
path = join(dataset_path, target_list[int(y_orig_train[idx])], filenames_train[idx])
Trang 6plt.imshow(mfccs, cmap='inferno', origin='lower') # TEST: Play problem sounds
print(target_list[int(y_orig_train[idx])]) playsound(path)
# Function: Create MFCCs, keeping only ones of desired length
def extract_features(in_files, in_y):
# Create path from given filename and target item
path = join(dataset_path, target_list[int(in_y[index])], filename)
# Check to make sure we're reading a wav file if not path.endswith('.wav'):
Trang 7print('Dropped:', index, mfccs.shape) prob_cnt += 1
return out_x, out_y, prob_cnt
- Tạo tập hợp đào tạo, xác thực và kiểm tra # Create train, validation, and test sets
x_train, y_train, prob = extract_features(filenames_train, y_orig_train)
print('Removed percentage:', prob / len(y_orig_train))
x_val, y_val, prob = extract_features(filenames_val, y_orig_val)
print('Removed percentage:', prob / len(y_orig_val))
x_test, y_test, prob = extract_features(filenames_test, y_orig_test)
print('Removed percentage:', prob / len(y_orig_test))
# Save features and truth vector (y) sets to disk
- Sau khi train thu được file như hình dưới đây vào drive
Trang 8from os import listdir
from os.path import isdir, join
from tensorflow.keras import layers, models
# Load feature sets
feature_sets = np.load(join(feature_sets_path, feature_sets_filename))
# Assign feature sets
x_train = feature_sets['x_train'] y_train = feature_sets['y_train'] x_val = feature_sets['x_val'] y_val = feature_sets['y_val'] x_test = feature_sets['x_test'] y_test = feature_sets['y_test']
# Look at tensor dimensions
print(x_test.shape)
Trang 9# Peek at labels
# Convert ground truth arrays to one wake word (1) and 'other' (0) wake_word_index = all_targets.index(wake_word)
y_train = np.equal(y_train, wake_word_index).astype('float64') y_val = np.equal(y_val, wake_word_index).astype('float64') y_test = np.equal(y_test, wake_word_index).astype('float64')
# Peek at labels after conversion
# What percentage of 'one' appear in validation labels
print(sum(y_val) / len(y_val))
print(1 - sum(y_val) / len(y_val))
# View the dimensions of our input data
# CNN for TF expects (batch, height, width, channels)
# So we reshape the input tensors with a "color" channel of 1
Trang 11# Add training parameters to model
model.compile(loss='binary_crossentropy', acc = history.history['acc']
val_acc = history.history['val_acc'] loss = history.history['loss']
val_loss = history.history['val_loss'] epochs = range(1, len(acc) + 1)
Trang 12plt.plot(epochs, acc, 'bo', label='Training acc') plt.plot(epochs, val_acc, 'b', label='Validation acc') plt.title('Training and validation accuracy')
plt.legend() plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss') plt.plot(epochs, val_loss, 'b', label='Validation loss') plt.title('Training and validation loss')
plt.legend() plt.show()
# Save the model as a file
models.save_model(model, model_filename)
# See which are 'stop'
for idx, y in enumerate(y_test): if y == 1
print(idx)
Trang 13# TEST: Load model and run it against test set
- Train xong tập tin với độ chính xác là 0,9873 và lỗi là 0,0691
- File xuất vào drive
Trang 14from tensorflow import lite
from tensorflow.keras import models
from google.colab import drive
open(tflite_filename, 'wb').write(tflite_model)
- File sau khi train xong