Quá trình ƣớc lƣợng và cập nhật nhiễu

Một phần của tài liệu Tìm hiểu một số phương pháp tăng cường chất lượng tiếng nói (Trang 48)

Nhiễu sẽ đƣợc ƣớc lƣợng lúc ban đầu bằng cách lấy trung bình biên độ phổ của tín hiệu bị nhiễu.

(3.22) Sau đó, sử dụng phƣơng pháp VAD để nhận biết các frame tiếp theo, frame nào là frame nhiễu và sẽ cập nhật nhiễu đó cho các frame tiếp theo. Để có thể nhận biết đƣợc frame nào là nhiễu thì chúng ta thực hiện so sánh biên độ phổ của nhiễu đƣợc ƣớc lƣợng với biên độ phổ của tín hiệu bị nhiễu :

CHƢƠNG 4: THỰC HIỆN VÀ ĐÁNH GIÁ CÁC THUẬT TOÁN 4.1 Giới thiệu chƣơng

Qua nghiên cứu lý thuyết thì chƣơng này sẽ xây dựng các lƣu đồ thuật toán và thực hiện các thuật toán giảm nhiễu mô phỏng bằng Matlab, sau đó đánh giá các kết quả thu đƣợc chủ yếu bằng phƣơng pháp đánh giá khách quan.

4.2 Lƣu đồ thực hiện và đánh giá thuật toán.

Hình 4.1.Sơ đồ thực hiện và đánh giá thuật toán tăng cƣờng

Xây dựng thuật toán : dựa trên các cơ sở toán học, các phép biến đổi trong miền thời gian và tần số đối với xử lý tín hiệu số để xây dựng nên các thuật toán xử lý nhiễu trong tiếng nói.

Triển khai trên Matlab: từ thuật toán đã xây dựng đƣợc, thực viết mã nguồn bằng ngôn ngữ lập trình và sử dụng các công cụ trên Matlab tạo nên chƣơng trình thực hiện xử lý nhiễu trong tiếng nói trên nền Matlab.

Thực hiện xử lý tiếng nói bằng các thuật toán: thực hiện xử lý triệt nhiễu trong các file âm thanh bị nhiễu bằng chƣơng trình đã xây dựng ở trên.

Thực hiện các phương pháp đánh giá dựa trên các kết quả đạt được sau khi xử lý : sau khi các file âm thanh bị nhiễu với các mức độ và loại nhiễu khác nhau đã đƣợc xử lý triệt nhiễu, cùng với các file âm thanh sạch tƣơng ứng, ta sử dụng

Xây dựng thuật toán

Triển khai thuật toán trên Matlab Thực hiện xử lý tiếng nói bằng các

thuật toán

Thực hiện các thuật toán đánh giá dựa trên các kết quả đạt đƣợc sau

khi xử lý

các phƣơng pháp đánh giá của tăng cƣờng chất lƣợng tiếng nói để thực kiểm tra, đánh giá tính hiệu của thuật toán.

Nhận xét đánh giá: từ các kết quả sau khi thực hiện các phƣơng pháp đánh giá đã có ở trên, đƣa ra các kết luận đánh giá : thuật toán nào thích hợp cho loại nhiễu nào, với mức độ bao nhiêu, thuật toán nào có khả xử lý nhiễu tốt hơn trong mọi trƣờng hợp.

4.3 Lƣu đồ thuật toán Trừ phổ

Hình 4.2 Trừ phổ

VAD

I=0, nhập Frame đầu tiên

Biến đổi FFT cho các Frame

Tính công suất trung bình ban đầu Phân chia Frame tín hiệu đầu vào

Cập nhật và làm trơn nhiễu

Thực hiện trừ phổ

X(:,i)=max(D,0);

I=I+1;nhập frame tiếp theo Begin

Giảm nhiễu dƣ

End

I> Number of Frame

Speech Flag =0

Đ S

IFFT Suy giảm tín hiệu

S[k]= Beta*[k]

Đ S

4.4 Lƣu đồ thuật toán lọc Wiener

Hình 4.3 Lƣu đồ thuật toán WF.

Đ

Begin

Phân chia Frame tín hiệu đầu vào

Biến đổi FFT cho các Frame Tính công suất nhiễu trung

bình ban đầu VAD

Tính Priori SNR

SpeechFlag = =0 Tính toán lại mức nhiễu

trung bình

Tính Gain Funtion G

Ƣớc lƣợng tín hiệu sạch

Thực hiện IFFT và nối các Frame I > Number of Frame Overlap Adding End Đ S S

4.5 Thực hiện thuật toán

Chúng ta thực hiện xử lý các file âm thanh bị nhiễu, với 2 loại nhiễu đó là nhiễu do tiếng xe hơi và nhiễu do ngƣời nói xung quanh tƣơng ứng với SNR=10dB. Chúng ta đánh giá dựa vào tiêu chí đánh giá cảm quan MOS:

Rating ( Đánh giá)

Quality of Speech ( Chất lƣợng)

3 ( tốt hơn nhiều)Much better

2 ( Tốt hơn)Better

1 Slightly Better(hơi Tốt hơn)

0 About the Same( Giống nhau)

-1 Slightly Worse(hơi tồi tệ )

-2 ( tồi tệ)Worse

-3 Much Worse( Quá tồi tệ)

* Xét file âm thanh c0dBF1_NOISY.waw tín hiệu có nhiễu là do tiếng ồn môi trƣờng xung quanh tạo ra.

Tín hiệu sau khi khử nhiễu bằng phƣơng pháp lọc WF

Hình 4.4 Tín hiệu có nhiễu và sau khi lọc nhiễu bằng WF

- Trƣớc khi xử lý nhiễu bằng thuật toán Trừ phổ:

- Sau khi xử lý triệt nhiễu bằng thuật toán Trừ phổ

* Xét file âm thanh đường hầm3.waw và file âm thanh nhiễu4.waw tín hiệu có nhiễu là do tiếng ồn môi trường xung quanh là tiếng ô tô trong đường hầm tạo ra.

- Với thuật toán WF:

Tín hiệu và nhiễu do đám đông gây ra trƣớc khi khử nhiễu

Tín hiệu sau khi khử nhiễu bằng phƣơng pháp lọc WF

- Với thuật toán SS:

+ Tín hiệu trƣớc khi xử lý nhiễu

* Nhận xét sơ bộ

Sau khi nghe các file âm thanh của tín hiệu sạch, tín hiệu sau khi xử lý nhiễu, dựa trên dạng sóng và spectrogram của tín hiệu sạch, tín hiệu sau khi xử lý triệt nhiễu bằng 2 thuật toán SS và WF, ta có thể đƣa ra một số nhận xét nhƣ sau:

+ Cả hai thuật toán đều có thể xử lý triệt nhiễu tốt hơn ở môi trƣờng có SNR cao hơn, và xử lý tốt hơn đối với tín hiệu bị nhiễu biến đổi chậm và có phân bố đều.

+ Cả hai thuật toán đều có tính hiệu quả giống nhau đối với nhiễu ở mức SNR thấp, nhƣng đối với môi trƣờng có SNR cao hơn thì thuật toán Wiener xử lý triệt nhiễu tốt hơn.

+ Tổng hợp các ý kiến đánh giá tín hiệu đã xử lý so với trƣớc khi xử lý chỉ đạt 0, có thể do cập nhật nhiễu chƣa đúng nên kết quả xử lý chƣa đƣợc tốt. Do vậy cần phải thay đổi một vài thông số trong đoạn Code để cải thiện chất lƣợng xử lý.

4.6 Các thông số ảnh hƣởng đến thuật toán.

* Các thông số chung ảnh hƣởng đến cả 2 thuật toán:

- SP ( Shift Percentage ): là độ dịch khi chia tín hiệu ra từng Segment. Nếu SP không thích hợp thì khi cộng gộp các Segments lại sẽ gây ra hiện tƣợng méo dạng.

- IS ( Initial Silence ): là khoảng lặng ban đầu. Nếu IS quá lớn thì có thể xảy ra trƣờng hợp tiếng nói ban đầu cũng bị xem là nhiễu. Nếu IS quá nhỏ thì lƣợng nhiễu cập nhật ban đầu bị thiếu.

- NoiseMargin và Hangover: là các thông số để quyết định 1 Segment là nhiễu hay tiếng nói. Nếu một Segment bị đánh giá sai thì nhiễu cập nhật sẽ bị sai, do đó kết quả sẽ bị ảnh hƣởng.

* Các thông số ảnh hƣởng đến thuật toán Spectral Subtraction. - NoiseLength: hệ số làm trơn cho quá trình cập nhật nhiễu.

- Gamma ( PowExp ): hệ số dùng để chọn thuật toán là trừ phổ biên độ hay trừ phổ công suất.

* Cácthông số ảnh hƣởng đến thuật toán Wiener:

4.7 Phát triển thuật toán Trừ phổ từ thuật toán Lọc Wiener.

SS based on WF Trừ phổ độ : PowExp=1 Trừ phổ công suất: PowExp=2

Biến đổi FTF Tính Công suất trung bình

đầu vào

I=1, nhập Frame đầu tiên Phân Chia khung (Segment)

Cập nhật và làm trơn biên độ Và phƣơng sai của nhiễu

Đ

Đ SpeechFlag==0?

Đ

S

Thuật toán VAD

Tính SNRpri Gain Funtion G=Sqrt(SNRpri/(SNRpri+1)) Ƣớc lƣợng tín hiếu sạch S[k]=G.*Y[k] Đ S I > Số Frame phân chia Đ Đ

Thực hiện IFT và nối các Frame

Overlap Adding

END I++

4.8 Nhận xét và kết luận. Nhận xét: Nhận xét:

Qua kết quả đánh giá bằng OE và SE đƣa ra đƣợc kết luận là :

- Đối với từng loại nhiễu khác nhau thì tác động của các thuật toán tăng cƣờng là khác nhau.

- Đối với từng mức nhiễu khác nhau thì thuật toán cũng tác động cũng khác nhau.

- Ở môi trƣờng có SNR thấp thì phần tiếng bị mất nhiều, nhiều lúc bị ngắt quãng do nén quá lớn.

- Ở môi trƣờng SNR lớn, nhiễu đƣợc nén triệt để hơn nhƣng vẫn giữ đƣợc chất lƣợng tiếng nói.

- Ở phƣơng pháp lọc Wiener phần tiếng đƣợc khuếch đại lớn hơn so với phƣơng pháp trừ phổ nên có cảm giác nhiễu ít hơn.

KẾT LUẬN LUẬN VĂN VÀ HƢỚNG PHÁT TRIỂN TRIỂN TIẾP THEO

Chất lƣợng của tiếng nói bị suy giảm do sự tác động của nhiễu trong môi trƣờng xung quanh là một vấn đề quan trọng cần phải đƣợc giải quyết. Việc tìm ra các phƣơng pháp để triệt nhiễu và giảm nhiễu trong tiếng nói luôn luôn đề tài đƣợc quan tâm rất nhiều. Trong các dịch vụ truyền thông với phƣơng tiện ngôn ngữ là tiếng nói thì việc tăng cƣờng, cải thiện chất lƣợng tiếng nói đã bị nhiễu là rất cần thiết, giúp cho ngƣời nghe có thể nghe rõ và đúng những gì ngƣời nói đã nói.

Luận văn đã thực hiện đƣợc các vấn đề:

- Tìm hiểu và nghiên cứu các phƣơng pháp cải thiện chất lƣợng tiếng nói, nhƣng tập trung vào 2 thuật toán tăng cƣờng chất lƣợng tiếng nói Trừ phổ và lọc Wiener

- Xây dựng đƣợc chƣơng trình thực hiện xử lý nhiễu trong các file âm thanh đã bị nhiễu dựa trên thuật toán Trừ phổ và Lọc Wiener.

- Thực hiện và đánh giá tính hiệu quả của 2 thuật toán trong các môi trƣờng nhiễu và mức độ nhiễu khác nhau, từ đó đƣa ra các biện pháp tối ƣu hóa các thuật toán. Kết quả đạt đƣợc cho thấy Lọc Wiener là thuật toán giảm nhiễu tốt hơn trừ phổ. Các thuật toán giảm nhiễu có hiệu quả khác nhau đối với từng môi trƣờng nhiễu khác nhau

Tuy nhiên luận văn vẫn chƣa giải quyết hết đƣợc các vấn đề trong tăng cƣờng chất lƣợng tiếng nói, nên hƣớng phát triển của đề tài trong tƣơng lai sẽ là :

- Tìm hiểu, nghiên cứu và xây dựng các chƣơng trình thực hiện xử lý nhiễu dựa trên các thuật toán khác trong tăng cƣờng chất lƣợng tiếng nói nhƣ thuật toán Kalman, thuật toán tối thiểu hóa bình phƣơng tạp âm.

- Nghiên cứu và đƣa ra thuật toán mới về xử lý nhiễu và triệt nhiễu trong tăng cƣờng chất lƣợng tiếng nói.

PHỤ LỤC CHẠY THỰC NGHIỆM VÀ CÁC ĐOẠN CODE MATLAB * Phƣơng pháp chạy thực nghiệm trên Matlab.

- Công cụ: Sử dụng Matlab 2012 làm công cụ để chạy thực nghiệm. - Dữ liệu: Các file âm thanh thu ở các môi trƣờng nhiễu khác nhau, tập dữ liệu chƣơng trình chạy ứng dụng tăng cƣờng chất lƣợng tiếng nói.

- Các bƣớc thực hiện:

+ Cài chƣơng trình Matlab 2012

+ Coppy toàn bộ các file trong chƣơng trình ứng dụng tăng cƣờng chất lƣợng tiếng nói vào đƣờng dẫn chứa thƣ mục Bin của Matlab 2012 vừa đƣợc cài. Ví dụ: C:\Program Files\MATLAB\R2012a\bin.

+ Chạy chƣơng trình đã xây dựng:

+ Chọn file nhiễu cần lọc trong From Multilmedia file sau đó nhấn vào nút Start Simulation kết quả thu đƣợc âm thanh sau khử nhiễu và dạng phổ của tín hiệu:

* Các đoạn Code Matlab trong chƣơng trình

Matlab Code thuật toán phân đoạn tín hiệu

function Seg=segment(signal,W,SP,Window) if nargin<3 SP=.4; end if nargin<2 W=256; end if nargin<4 Window=hamming(W); end Window=Window(:); %make it a column vector

L=length(signal); SP=fix(W*SP); N=fix((L-W)/SP +1); %number of segments Index=(repmat(1:W,N,1)+repmat((0:(N-1))'*SP,1,W))'; % size 256 x 461 when W = 256, SP = .4 hw=repmat(Window,1,N); % size 256 x 461 Seg=signal(Index).*hw;

% size 256 x 461 : each column is a frame of signal, consist of 461 frames[5].

Matlab Code thuật toán VAD:

Function[NoiseFlag,SpeechFlag,NoiseCounter,Dist]=vad(signal,noise,NoiseCount er,NoiseMargin,Hangover) if nargin<4 NoiseMargin=3; end if nargin<5 Hangover=8; end if nargin<3 NoiseCounter=0; end FreqResol=length(signal); SpectralDist= max(20*(log10(signal)-log10(noise)),0); %SpectralDist(find(SpectralDist<0))=0; Dist=mean(SpectralDist);

if (Dist < NoiseMargin) NoiseFlag=1; NoiseCounter=NoiseCounter+1; else NoiseFlag=0; NoiseCounter=0; end

% Detect noise only periods and attenuate the signal if (NoiseCounter > Hangover)

SpeechFlag=0; else

SpeechFlag=1; End.

Matlab Code thuật toán xếp chồng:

function ReconstructedSignal=OverlapAdd2(XNEW,yphase,windowLen,ShiftLsen) if nargin<2 yphase=angle(XNEW); end if nargin<3 windowLen=size(XNEW,1)*2; end if nargin<4 ShiftLen=windowLen/2; end if fix(ShiftLen)~=ShiftLen ShiftLen=fix(ShiftLen);

disp('The shift length have to be an integer as it is the number of samples.');

end

disp(['shift length is fixed to ' num2str(ShiftLen)])

[FreqRes FrameNum]=size(XNEW); Spec=XNEW.*exp(j*yphase); if mod(windowLen,2)

%if FreqResol is odd

Spec=[Spec;flipud(conj(Spec(2:end,:)))]; else Spec=[Spec;flipud(conj(Spec(2:end-1,:)))]; end sig=zeros((FrameNum-1)*ShiftLen+windowLen,1); weight=sig; for i=1:FrameNum start=(i-1)*ShiftLen+1;

spec=Spec(:,i);

sig(start:start+windowLen-1)=sig(start:start+windowLen-1)+ real(ifft(spec,windowLen));

end

ReconstructedSignal=sig;

MATLAB code thuật toán Trừ phổ

function signalOut = Tru_Pho(signal)

% Nâng cao chat luong tieng noi bang phuong pháp Spectral Subtraction

fs = 10000; % tan so lay mau

IS = 0.25; %

if (nargin<3 || isstruct(IS)) IS=.25; %seconds

end

W=fix(.0256*fs); %Window length is 25,6 ms

nfft=W;

SP=.4; %Shift percentage is 40% (10ms) %Overlap-Add method works good with this value(.4)

% wnd=hamming(W);

wnd=hamming(256);

NIS=fix((IS*fs-W)/(SP*W) +1);%number of initial silence segments

Gamma=1;%Magnitude Power (1 for magnitude spectral subtraction 2 for power spectrum subtraction)

%Change Gamma to 1 to get a completely different performance % Segment Begin ---

Window=wnd(:); %make it a column vector

L=length(signal); SPNew=fix(W.*SP);

N=fix((L-W)/SPNew +1); %number of segments

T1=1:W; T2=0:(N-1); Index=(repmat(T1,N,1)+repmat((T2)'*SPNew,1,W))'; hw=repmat(Window,1,N); si=size(hw); y = zeros(si); for i=1:si(1)

for j=1:si(2) y(i,j)=signal(Index(i,j)); end end y=y.*hw; % Segment End --- Y=fft(y,nfft);

YPhase=angle(Y(1:fix(end/2)+1,:)); %Noisy Speech Phase

Y=abs(Y(1:fix(end/2)+1,:)).^Gamma;%Specrogram

numberOfFrames=size(Y,2); FreqResol=size(Y,1);

N=mean(Y(:,1:NIS)')'; %initial Noise Power Spectrum mean

NoiseCounter=0;

NoiseLength=9;%This is a smoothing factor for the noise updating

Beta=.03; minalpha=1; maxalpha=3; minSNR=-5; maxSNR=20; alphaSlope=(minalpha-maxalpha)/(maxSNR-minSNR); alphaShift=maxalpha-alphaSlope*minSNR; BN=Beta*N; X=zeros(FreqResol,numberOfFrames); for i=1:numberOfFrames

[NoiseFlag, SpeechFlag, NoiseCounter,

Dist]=vad(Y(:,i).^(1/Gamma),N.^(1/Gamma),NoiseCounter); %Magnitude Spectrum Distance VAD

if SpeechFlag==0

N=(NoiseLength*N+Y(:,i))/(NoiseLength+1); %Update and smooth noise

BN=Beta*N; end

SNR=10*log(Y(:,i)./N);

alpha=alphaSlope*SNR+alphaShift;

alpha=max(min(alpha,maxalpha),minalpha);

X(:,i)=max(D,BN); %if BY>D X=BY else X=D which sets very small values of subtraction result to an attenuated

%version of the input power spectrum.

end SigOverLapAdd=OverlapAdd2(X.^(1/Gamma),YPhase,W,SP*W); signalOut = signal; L=length(SigOverLapAdd); signalOut(1:L) = SigOverLapAdd(1:L); end function ReconstructedSignal=OverlapAdd2(XNEW,yphase,windowLen,ShiftLen) if nargin<2 yphase=angle(XNEW); end if nargin<3 windowLen=size(XNEW,1)*2; end if nargin<4 ShiftLen=windowLen/2; end if fix(ShiftLen)~=ShiftLen ShiftLen=fix(ShiftLen); end [FreqRes FrameNum]=size(XNEW); Spec=XNEW.*exp(1i*yphase);

if mod(windowLen,2) %if FreqResol is odd

Spec=[Spec;flipud(conj(Spec(2:end,:)))]; else Spec=[Spec;flipud(conj(Spec(2:end-1,:)))]; end sig=zeros((FrameNum-1)*ShiftLen+windowLen,1); for i=1:FrameNum start=(i-1)*ShiftLen+1; spec=Spec(:,i); xx=real(ifft(spec,windowLen)); xxx=sig(start:start+windowLen-1); for j=1:windowLen sig(start+j-1) = xxx(j) + xx(j);

end end

ReconstructedSignal=sig; end

function [NoiseFlag, SpeechFlag, NoiseCounter,

Dist]=vad(signal,noise,NoiseCounter,NoiseMargin,Hangover) if nargin<4 NoiseMargin=3; end if nargin<5 Hangover=8; end if nargin<3 NoiseCounter=0; end FreqResol=length(signal); SpectralDist= 20*(log10(signal)-log10(noise)); SpectralDist(find(SpectralDist<0))=0; Dist=mean(SpectralDist); if (Dist < NoiseMargin) NoiseFlag=1; NoiseCounter=NoiseCounter+1; else NoiseFlag=0; NoiseCounter=0; end

% Detect noise only periods and attenuate the signal

if (NoiseCounter > Hangover) SpeechFlag=0; else SpeechFlag=1; end end.

MATLAB thuật toán SW

function varargout = tangcuongamthanh(varargin)

% TANGCUONGAMTHANH, by itself, creates a new TANGCUONGAMTHANH or raises the existing

% singleton*. %

% H = TANGCUONGAMTHANH returns the handle to a new TANGCUONGAMTHANH or the handle to

% the existing singleton*. %

% TANGCUONGAMTHANH('CALLBACK',hObject,eventData,handles,...) calls the local

% function named CALLBACK in TANGCUONGAMTHANH.M with the given input arguments.

%

% TANGCUONGAMTHANH('Property','Value',...) creates a new TANGCUONGAMTHANH or raises the

% existing singleton*. Starting from the left, property value pairs are

% applied to the GUI before tangcuongamthanh_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to tangcuongamthanh_OpeningFcn via varargin. %

% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".

%

% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help tangcuongamthanh % Last Modified by GUIDE v2.5 21-Sep-2014 00:35:18

% Begin initialization code - DO NOT EDIT

gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @tangcuongamthanh_OpeningFcn, ... 'gui_OutputFcn', @tangcuongamthanh_OutputFcn, ... 'gui_LayoutFcn', [] , ...

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 initialization code - DO NOT EDIT

% --- Executes just before tangcuongamthanh is made visible.

function tangcuongamthanh_OpeningFcn(hObject, eventdata, handles, varargin)

% This function has no output args, see OutputFcn. % hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% varargin command line arguments to tangcuongamthanh (see VARARGIN) % Choose default command line output for tangcuongamthanh

handles.output = hObject;

% Update handles structure

guidata(hObject, handles);

% UIWAIT makes tangcuongamthanh wait for user response (see UIRESUME) % uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line.

function varargout = tangcuongamthanh_OutputFcn(hObject, eventdata, handles)

% varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure

Một phần của tài liệu Tìm hiểu một số phương pháp tăng cường chất lượng tiếng nói (Trang 48)

Tải bản đầy đủ (PDF)

(76 trang)