Hệ thống nhận dạng giọng nói dựa trên MATLAB

Hệ thống nhận dạng giọng nói được thiết kế để xác định danh tính của người nói bằng cách sử dụng các kỹ thuật xử lý tín hiệu âm thanh trong MATLAB.

1. Tổng quan về hệ thống

a. Nguyên lý hoạt động

Hệ thống này sử dụng công nghệ nhận dạng dấu vân giọng (Voiceprint Recognition) để xác thực danh tính người dùng qua giọng nói. Công nghệ này khác biệt với nhận dạng giọng nói (Speech Recognition), vốn tập trung vào việc hiểu nội dung ngôn ngữ thay vì nhận diện cá nhân.

b. Hệ số MFCC

Mel-Frequency Cepstral Coefficients (MFCC) là một trong những đặc trưng phổ biến nhất được sử dụng trong xử lý tín hiệu âm thanh. MFCC mô phỏng cách mà tai người nghe và phân tích âm thanh, giúp chuyển đổi tín hiệu âm thanh từ miền tần số tuyến tính sang miền Mel phi tuyến tính.

Công thức chuyển đổi từ tần số thông thường sang tần số Mel:

M(f) = 2595 \times \log10(1 + \frac{f}{700})

c. Lượng hóa vector

Phương pháp lượng hóa vector (Vector Quantization - VQ) được áp dụng để nén dữ liệu đặc trưng MFCC đã trích xuất. Đây là một phương pháp nén có mất mát, nhưng vẫn giữ lại hầu hết thông tin cần thiết cho quá trình nhận dạng.

d. Cấu trúc hệ thống

Hệ thống bao gồm hai giai đoạn chính:

  • Giai đoạn huấn luyện: Tín hiệu âm thanh đầu tiên sẽ được tiền xử lý, sau đó trích xuất đặc trưng MFCC và áp dụng phương pháp lượng hóa vector để tạo ra mã sách (codebook) cho từng người nói.
  • Giai đoạn nhận dạng: Trong quá trình kiểm tra, hệ thống sẽ so sánh đặc trưng MFCC của tín hiệu đầu vào với các mã sách đã lưu trữ. Nếu khoảng cách Euclid giữa chúng nhỏ hơn một ngưỡng nhất định, hệ thống sẽ xác nhận danh tính người nói.

2. Mã nguồn ví dụ

Dưới đây là một đoạn mã minh họa cách xây dựng giao diện người dùng (GUI) và logic xử lý cơ bản:

function varargout = VoiceAuth(varargin)
    gui_Singleton = 1;
    gui_State = struct('gui_Name', mfilename, ...
        'gui_Singleton', gui_Singleton, ...
        'gui_OpeningFcn', @VoiceAuth_OpeningFcn, ...
        'gui_OutputFcn', @VoiceAuth_OutputFcn, ...
        'gui_LayoutFcn', [], ...
        'gui_Callback', []);
    
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
end

% Hàm khởi tạo GUI
function VoiceAuth_OpeningFcn(hObject, eventdata, handles, varargin)
    handles.output = hObject;
    guidata(hObject, handles);
end

% Hàm xử lý khi nhấn nút huấn luyện
function trainSpeaker_Callback(hObject, eventdata, handles)
    speakerID = trainSpeaker();
    set(handles.trainStatus, 'string', 'Đã hoàn thành!');
    speakerMsg = sprintf('Người nói số %d', speakerID);
    set(handles.speakerInfo, 'string', speakerMsg);
end

% Hàm xử lý khi nhận lệnh thoại
function processCommand_Callback(hObject, eventdata, handles)
    Fs = 8000; % Tốc độ lấy mẫu
    Nseconds = 1; % Thời gian thu âm (giây)
    recorder = audiorecorder(Fs, 16, 1);
    
    while true
        fprintf('Hãy nói một từ bất kỳ sau khi nhấn Enter');
        input('');
        recordblocking(recorder, Nseconds);
        audioData = getaudiodata(recorder);
        
        % Trích xuất đặc trưng LPC
        [lpcCoeffs, error] = lpc(audioData, 12);
        lpcCoeffs = double(lpcCoeffs) / max(lpcCoeffs);
        
        % Xử lý và phân loại lệnh
        prediction = classifyCommand(lpcCoeffs);
        updateUI(prediction, handles);
    end
end

% Hàm phân loại lệnh
function command = classifyCommand(features)
    % Giả sử mạng neural đã được đào tạo trước đó
    load network.mat weights biases;
    output = predictNetwork(features, weights, biases);
    [~, command] = max(output);
end

% Hàm cập nhật giao diện
function updateUI(command, handles)
    switch command
        case 1
            set(handles.commandLabel, 'string', 'Tiến');
            set(handles.forwardButton, 'BackgroundColor', 'green');
        case 2
            set(handles.commandLabel, 'string', 'Dừng');
            set(handles.stopButton, 'BackgroundColor', 'green');
        case 3
            set(handles.commandLabel, 'string', 'Lùi');
            set(handles.backwardButton, 'BackgroundColor', 'green');
        case 4
            set(handles.commandLabel, 'string', 'Trái');
            set(handles.leftButton, 'BackgroundColor', 'green');
        case 5
            set(handles.commandLabel, 'string', 'Phải');
            set(handles.rightButton, 'BackgroundColor', 'green');
    end
    pause(2);
    resetUI(handles);
end

% Hàm đặt lại giao diện
function resetUI(handles)
    set(handles.forwardButton, 'BackgroundColor', 'white');
    set(handles.stopButton, 'BackgroundColor', 'white');
    set(handles.backwardButton, 'BackgroundColor', 'white');
    set(handles.leftButton, 'BackgroundColor', 'white');
    set(handles.rightButton, 'BackgroundColor', 'white');
end

3. Kết quả chạy thử

Kết quả thử nghiệm cho thấy rằng chỉ khi cả danh tính người nói và nội dung phát biểu khớp với dữ liệu đã lưu trữ, hệ thống mới hiển thị "Xác thực thành công". Ngược lại, nếu không khớp, hệ thống sẽ báo lỗi.

Thẻ: MATLAB mfcc VoiceRecognition

Đăng vào ngày 13 tháng 7 lúc 22:10