Phát hiện tiếng nói bất thường là một ứng dụng quan trọng trong AI, được dùng rộng rãi từ giám sát an ninh, hỗ trợ y tế đến trợ lý ảo. Các hệ thống này cần khả năng phân tích âm thanh để nhận biết những tiếng kêu lạ như tiếng hét, tiếng vỡ, hay tiếng ho kéo dài. Trong bài viết này, chúng ta sẽ sử dụng Python và TensorFlow để xây dựng một mô hình nhận diện âm thanh dựa trên dữ liệu thực tế.
Nếu bạn từng tìm hiểu về Ứng dụng AI nhận diện biển báo giao thông hoặc Tách đối tượng người ra khỏi ảnh nền, thì việc xử lý dữ liệu âm thanh sẽ mở rộng kiến thức của bạn sang một lĩnh vực hoàn toàn mới: audio processing.
Tập dữ liệu sử dụng
Chúng ta sẽ dùng UrbanSound8K, một tập dữ liệu gồm 8732 clip âm thanh (≤4 giây) thuộc 10 loại khác nhau như tiếng chó sủa, tiếng khoan, tiếng người hét, và tiếng súng. Đây là nguồn dữ liệu lý tưởng để huấn luyện một mô hình phát hiện tiếng nói bất thường.
📦 Link Kaggle Notebook: UrbanSound8K Classification
📥 Dataset: UrbanSound8K
Cấu trúc dữ liệu:
| Trường | Mô tả |
|---|---|
| slice_file_name | Tên file âm thanh |
| fold | Fold số (cho cross-validation) |
| class | Nhãn lớp (ví dụ: gun_shot, dog_bark) |
| classID | ID của lớp (0–9) |
Xử lý và nạp dữ liệu âm thanh
Giải thích
Đầu tiên, chúng ta cần xử lý các file âm thanh để trích xuất đặc trưng phục vụ mô hình học máy. Một phương pháp phổ biến là sử dụng MFCC (Mel-frequency cepstral coefficients), giúp mô tả phổ âm thanh dưới dạng vector đặc trưng gọn nhẹ và giàu thông tin.
Chúng ta cũng chuẩn bị dữ liệu bằng cách chuẩn hóa và chia thành tập huấn luyện và kiểm tra, đảm bảo mô hình được đánh giá khách quan.
import pandas as pd
import numpy as np
import librosa
import os
from sklearn.model_selection import train_test_split
metadata = pd.read_csv('../input/urbansound8k/UrbanSound8K.csv')
X, y = [], []
for index, row in metadata.iterrows():
file_path = os.path.join('../input/urbansound8k/fold'+str(row["fold"]), row["slice_file_name"])
try:
audio, sr = librosa.load(file_path, duration=4)
mfcc = librosa.feature.mfcc(y=audio, sr=sr, n_mfcc=40)
mfcc_scaled = np.mean(mfcc.T, axis=0)
X.append(mfcc_scaled)
y.append(row['classID'])
except:
continue
X = np.array(X)
y = np.array(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
Xây dựng mô hình mạng nơ-ron
Mô hình Multi-Layer Perceptron (MLP) với các lớp Dense sẽ được sử dụng để phân loại âm thanh. Mô hình có thể được mở rộng sang CNN nếu bạn xử lý trực tiếp phổ âm (spectrogram). Việc thiết kế kiến trúc này giúp mô hình học được các mẫu âm thanh đặc trưng của tiếng nói bất thường.
Các lớp Dropout được thêm vào để giảm nguy cơ overfitting khi huấn luyện trên dữ liệu đa dạng như UrbanSound8K.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
model = Sequential([
Dense(256, activation='relu', input_shape=(40,)),
Dropout(0.3),
Dense(128, activation='relu'),
Dropout(0.3),
Dense(64, activation='relu'),
Dropout(0.3),
Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
Huấn luyện mô hình
Huấn luyện mô hình trên tập dữ liệu đã xử lý sẽ giúp mạng học cách phân loại các loại âm thanh khác nhau. Với mỗi epoch, mô hình sẽ cải thiện khả năng nhận diện tiếng nói bất thường trong dữ liệu kiểm tra.
Việc theo dõi độ chính xác và hàm mất mát giúp bạn điều chỉnh các siêu tham số để tối ưu hóa mô hình.
history = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test))
Đánh giá và thử nghiệm mô hình
Sau khi huấn luyện, chúng ta đánh giá mô hình trên tập kiểm tra để kiểm tra khả năng phân loại tiếng nói bất thường. Việc thử nghiệm trên âm thanh mới giúp xác định hiệu quả thực tế của hệ thống.
Bạn có thể mở rộng bằng cách tạo hệ thống cảnh báo khi phát hiện tiếng nói nguy hiểm như tiếng hét hoặc tiếng súng.
loss, accuracy = model.evaluate(X_test, y_test)
print(f"Độ chính xác trên tập test: {accuracy*100:.2f}%")
# Dự đoán một file âm thanh mới
def predict_audio(file_path):
audio, sr = librosa.load(file_path, duration=4)
mfcc = librosa.feature.mfcc(y=audio, sr=sr, n_mfcc=40)
mfcc_scaled = np.mean(mfcc.T, axis=0).reshape(1, -1)
prediction = model.predict(mfcc_scaled)
classID = np.argmax(prediction)
print("Âm thanh được dự đoán là:", metadata.loc[metadata['classID'] == classID]['class'].values[0])
predict_audio('../input/urbansound8k/fold1/7383-3-0-0.wav')
Kết luận
Bạn vừa xây dựng thành công một mô hình phát hiện tiếng nói bất thường bằng AI, từ xử lý dữ liệu âm thanh đến huấn luyện mạng nơ-ron và thử nghiệm dự đoán âm thanh mới. Hệ thống này có thể mở rộng để ứng dụng vào giám sát an ninh, chăm sóc sức khỏe, hoặc trợ lý ảo thông minh.
Bước tiếp theo, bạn có thể thử kiến trúc CNN+RNN để xử lý spectrogram hoặc huấn luyện với tập dữ liệu lớn hơn như AudioSet để tăng tính chính xác.

