Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 32 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
32
Dung lượng
1,23 MB
Nội dung
1
SPEECH ENHENCEMENT ALGORITHMS
FINAL PROJECT JUN-2012, DUT
ELECTRONICS AND TELECOMMUNICATION ENGINEERING
DIGITAL SIGNAL PROCESSING
MAIN REPORT
Author
Hoàng Minh Thảo
langtu2790@gmail.com
Thao M. Hoang
2
1. Tổng quan về nâng cao chấtlượngtiếng nói:
Tiếngnói đóng vai trò rất quan trọng trong thông tin liên lạc. Quá trình truyền
tín hiệu tiếngnói được truyền đi qua các phương tiện thông tin bị các loại nhiễu tác động
nên chấtlượng bị suy giảm. Vì vậy, các thuật toán Speech Enhancement và các kĩ thuật
làm giảm nhiễu được ra đời. Trong bài Lab này ta sẽ đi nghiên cứu 2 thuật toán ước lượng
phổ để khử nhiễu kinh điển là Spectral Subtraction [1] và Wiener Filter [2]. Việc ước
lượng phổ nhiễu đòi hỏi một thuật toán VAD ( Voice Activity Detection ) để tìm khoảng
thời gian không có tiếngnói hoạt động. Ta sẽ đi phân tích từng phần theo sự phát triển của
các thuật toán và đánh giá kết quả mà các thuật toán mang lại.
1.1. Phân tích tín hiệu có nhiễu thành các segment/frame :
Tín hiệu có nhiễu được chia ra thành nhiều Segment ( hay Frame ) có chiều dài
bằng 25 ms với độ dịch là 40% của Window trên suốt chiều dài tín hiệu. Cửa sổ có thể
chọn Rectangle, Hanning, Hamming, Blackman … Việc chọn loại cửa sổ sẽ ảnh hưởng
tới việc khôi phục tín hiệu đã tăng cường sau này. Ở đây, cửa sổ được lựa chọn là
Hamming. Do Hamming là cửa sổ phi tuyến nên khi thực hiện biến đổi FFT thì vô tình đã
làm suy giảm tín hiệu , vì thế yêu cầu đặt ra là các Segment phải sắp xếp chồng lên nhau
theo 1 tỉ lệ dịch (SP) thích hợp , vùng xếp chồng giữa 2 Segment liên tục gọi là “overlap”.
Thao M. Hoang
3
Minh họa quá trình Segmenting bằng cửa sổ rectwin
y(n) : tín hiệu có nhiễu cộng vào.
SP : shift percentage
W : Window Length
o : số mẫu ở vùng overlap ( o = fix(W*(1-SP)) ) .
L :≜ Noisy Signal Length
Số Segment có thể được tính dựa vào công thức sau:
Number of noisy signal Segments =
(LengthSignal - WindowLength)/(Shift Percentage* WindowLength) + 1 (1)
Dấu ▪ để chỉ là lấy giá trị nguyên nhỏ hơn và gần kết quả nhất.
Khi tín hiệu được phân tích thành các Segment liên tục, thì trong từng Segment, tín
hiệu của chúng ta sẽ biến đổi chậm và nó được xem là tĩnh ( trạng thái dừng ). Khi đó các
thuật toán xử lý triệt nhiễu trong tín hiệu mới có thể thực hiện được một cách hiệu quả.
Cách phân tích tín hiệu được sử dụng là nhân với hàm cửa sổ , mỗi vector Segment có
kích thước WindowLength sau khi phân tích sẽ được lưu vào 1 cột của ma trận, vậy ma
trận Segment sẽ có kích thước WindowLength x NumberOfSegments.
Thao M. Hoang
4
Thuật tốn phân đoạn tín hiệu:
Segment
Window,signal > Vector cột
#SP samples: #SP = [ W * SP ]
#Segments: N = [ (L-W)/ (#SP)+ 1 ]
[.] : lấy phần nguyên
Copy [1:W] > M1 = [(1:W);(1:W); ;(1:W)]NxW
Copy [1:(N-1)]' > M2 = #SP *[(0:N-1)',(0:N-1)', ,(0:N-1)']NxW
Copy [1:W] > hw = [(1:W)',(1:W)', ,(1:W)']WxN
Tính ma trận Index
IndexWxN =( M1 + M2 )'
Tính ma trận segment
Seg = signal(Index).*hw
End
Matlab Code:
function Seg=segment(signal,W,SP,Window)
% SEGMENT chops a signal to overlapping windowed segments
% A= SEGMENT(X,W,SP,WIN) returns a matrix which its columns are segmented
% and windowed frames of the input one dimentional signal, X. W is the
% number of samples per window, default value W=256. SP is the shift
% percentage, default value SP=0.4. WIN is the window that is multiplied by
% each segment and its length should be W. the default window is hamming
% window.
% 06-Sep-04
% Esfandiar Zavarehei
if nargin<3
SP=.4;
end
if nargin<2
W=256;
end
if nargin<4
Thao M. Hoang
5
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
1.2. Initial Silence Segments: (khoảng im lặng ban đầu: IS )
Khoảng im lặng ban đầu hay là giai đoạn không có tiếngnói hoạt động trong mỗi file
âm thanh được gán mặc định là 250ms (dựa vào đặc điểm của tín hiệu thoại biến đổi
chậm – ví dụ như sự thay đổi của thanh quản người thường sau 10 → 100 ms ), thể hiện
bước chuyển tiếp giữa hai trạng thái có mặt và không có mặt của tiếngnói . Điều này cho
phép cung cấp một lượng thông tin vừa đủ trong việc ước lượng phổ nhiễu hay phương
sai nhiễu. Nếu số segment của tín hiệu nhỏ hơn số segment trong khoảng im lặng thì có
thể lờ đi thuật toán VAD.
Ta có thể xác định số segments nằm trong khoảng im lặng ban đầu bằng công thức sau:
Number of Initial Silence Segments:
NIS = (IS * FreqSampling - WindowLength)/(Shift Percentage* WindowLength) + 1
(2)
Thao M. Hoang
6
Ví dụ: Giả sử các Frame/segment được chia có chiều dài 25ms/frame. Tần số lấy mẫu Fs
= 8000 samples/s, SP = 40% .
WindowLength = 0.025s * 8000 samples/s = 200 samples
NIS = (0.25s * 8000 samples/s - 200 samples)/0.4*200 samples = 22
1.3. Voice activity detection ( VAD )
Quá trình xử lý để phân biệt khi nào có tiếngnói hoạt động, khi nào không có tiếng
nói (im lặng) được gọi là sự thăm dò hoạt động của tiếngnói – Voice Activity Detection
(VAD). Thuật toán VAD có tín hiệu ra ở dạng nhị phân quyết định trên một nền tảng
Segment-by-Segment, khi đó Segment có thể xấp xỉ 20-40 ms. Một đoạn tín hiệu có chứa
tiếng nói hoạt động thì VAD = 1, còn nếu đoạn tín hiệu chứa nhiễu thì VAD = 0.
Có một vài thuật toán VAD được đưa ra dựa trên nhiều đặc tính của tín hiệu. Các
thuật toán VAD được đưa ra sớm nhất thì dựa vào các đặc tính như mức năng lượng, soft-
decision VAD, zero-crossing, đặc tính cepstral, LPC (Linear Prediction Code) , phép đo
chu kỳ…
Phần lớn các thuật toán VAD đều phải đối mặt với vấn đề là điều kiện SNR thấp, đặc
biệt khi nhiễu bị thay đổi. Một thuật toán VAD có độ chính xác trong môi trường thay đổi
không thể đủ trong các ứng dụng của Speech Enhancement, nhưng việc ước lượng nhiễu
một cách chính xác là rất cần thiết tại mọi thời điểm khi tiếngnói hoạt động.
Thao M. Hoang
7
VAD
Tính khoảng cách phổ của segment/frame đang xét
SpectralDist = max( 20*lg(signal) - 20*lg(noise)), 0 )
Tính giá trò trung bình của SpectralDist
Dist = SpectralDist / length(SpectralDist)
Dist < khoảng cách phổ ngưỡng ?
NoiseFlag = 1
NoiseCounter + +
NoiseFlag = 0
NoiseCounter = 0
Đ
NoiseCounter > Số segment liên
tiếp (ngưỡng) để quy đònh là nhiễu ?
SpeechFlag = 0 SpeechFlag = 1
End
S
Đ
S
Matlab Code:
function [NoiseFlag, SpeechFlag, NoiseCounter,
Dist]=vad(signal,noise,NoiseCounter,NoiseMargin,Hangover)
%[NOISEFLAG, SPEECHFLAG, NOISECOUNTER,
DIST]=vad(SIGNAL,NOISE,NOISECOUNTER,NOISEMARGIN,HANGOVER)
%Spectral Distance Voice Activity Detector
%SIGNAL is the the current frames magnitude spectrum which is to labeld as
%noise or speech, NOISE is noise magnitude spectrum template (estimation),
Thao M. Hoang
8
%NOISECOUNTER is the number of imediate previous noise frames, NOISEMARGIN
%(default 3)is the spectral distance threshold. HANGOVER ( default 8 )is
%the number of noise segments after which the SPEECHFLAG is reset (goes to
%zero). NOISEFLAG is set to one if the the segment is labeld as noise
%NOISECOUNTER returns the number of previous noise segments, this value is
%reset (to zero) whenever a speech segment is detected. DIST is the
%spectral distance.
%Saeed Vaseghi
%edited by Esfandiar Zavarehei
%Sep-04
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
1.4. Ước lượng, cập nhật nhiễu và các thông số khác:
Phương thức ước lượng nhiễu có thể ảnh hưởng lớn đến chấtlượng của tín hiệu sau
khi được tăng cường. Nếu nhiễu được ước lượng quá nhỏ thì nhiễu sẽ vẫn còn trong tín
hiệu và nó sẽ được nghe thấy, còn nếu như nhiễu được ước lượng quá lớn thì tiếngnói sẽ
bị méo, và làm sẽ làm tính dễ nghe của tiếngnói bị ảnh hưởng. Cách đơn giản nhất để ước
lượng và cập nhật phổ của nhiễu trong đoạn tín hiệu không có mặt của tiếngnói sử dụng
thuật toán thăm dò hoạt động của tiếngnói (voice activity detection - VAD). Tuy nhiên
phương pháp đó chỉ thoả mãn đối với nhiễu không thay đổi (nhiễu trắng), nó sẽ không
Thao M. Hoang
9
hiệu quả trong các môi trường thực tế (ví dụ như nhà hàng), ở những nơi đó đặc tính phổ
của nhiễu thay đổi liên tục. Trong bài Lab này chúng ta sẽ đề cập đến thuật toán ước lượng
nhiễu thay đổi liên tục và thực hiện trong lúc tiếngnói hoạt động, thuật toán này sẽ phù
hợp môi trường có nhiễu thay đổi cao.
Chú ý rằng trong thuật toán khử nhiễu Spectral Subtraction (SS), việc trừ phổ sẽ làm
cho biên độ phổ âm, tuy nhiên biên độ phổ thì không thể âm, do đó phải chỉnh lưu nửa
sóng ( nếu giá trị biên độ trừ phổ âm thì cho bằng O ).
∧
(ω) = (ω).
(ω) với
(
ω
)
=
(
)
|()|
= max(G
(
ω
)
,0) (3)
Khi chỉnh lưu nửa sóng, xuất hiện thành phần nhiễu dư NR = N -
∧
.e
jɸ
n
(4)
với biên độ thay đổi từ 0 đến giá trị maximun của tín hiệu trong suốt thời gian không có
tiếng nói hoạt động. Việc giảm nhiễu dư thực hiện như sau:
|
∧
(
ω
)
| =
|
∧
(
ω
)
|, nếu|
∧
(
ω
)
| ≥|NR
(ω)|
min|
∧
(
ω
)
|j = i −1,i,i + 1, nếu|
∧
(
ω
)
| <|NR
(ω)|
(5)
Trong đó: |NR
(ω)| là giá trị lớn nhất của nhiễu dư đo được khi không có tiếng nói.
Trong giai đoạn không có tiếngnói hoạt động, việc cần làm nữa là nén nhiễu. Ta
định nghĩa tỉ số tín hiệu trên nhiễu:
= 20.lg(
∫
()
()
)
Nếu T < -12 dB, thì có thể xem segment đang xét là nhiễu. Và khi đó ta nén nhiễu
với hệ số β .
|
∧
(
ω
)
| =
|
∧
(
ω
)
|, ≥12
.|
∧
(
ω
)
|, < 12
(6)
Với: 20.lg(β) = -30 dB hay β = 0.03
1.5. OverlapAdding trong quá trình xử lý tín hiệu tiếngnói
Sau khi các Segment tín hiệu được xử lý triệt nhiễu trong miền tần số, các Segment
này được liên kết lại nhau bằng phương pháp thích hợp với phương pháp phân tích tín
hiệu thành các Segment ở đầu vào gọi là “OverlapAdding”, nhằm khôi phục tín hiệu sạch.
Thao M. Hoang
10
Quá trình xử lý tín hiệu tiếng nóiuá
Mô tả xây dựng phương thức OverlapAdding :
Từ đó ta xây dựng lưu đồ thuật toán như sau:
Thao M. Hoang
[...]... nén triệt để hơn nhưng vẫn giữ được chất lượngtiếngnói .H - Ở phương pháp Wiener Filter 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 6.2 Kết luận - Với mơi trường có SNR càng lớn, chấtlượng tín hiệu sau khi xử lý càng tốt - Trong 2 phương pháp thì thuật tốn Wiener tối ưu hơn so với phương phát trừ phổ M tín hiệu Tàiliệu tham khảo : [1] Steven F.Boll,... output=OverlapAdd2(X.^(1/Gamma),YPhase,W,SP*W); 2.2 Thuật tốn Wiener Filter ( WF ) Nguồn gốc cơ bản của thuật tốn WF là ước lượng tín hiệu tiếngnói bằng cách tối Th ao thiểu hóa sai số bình phương trung bình (Mean Square Error) giữa tín hiệu tiếngnói thực và tín hiệu tiếngnói được ước lượng Giả thiết rằng y[n] là tín hiệu vào đã bị nhiễu, nó là tổng của tín hiệu sạch s[n] và tín hiệu nhiễu n[n]: y[n]=s[n]+n[n]... biên độ phổ ước lượng của nhiễu được tính trong khi "∧" khơng có tiếngnói hoạt động Ký hiệu để chỉ rằng giá trị đó là giá trị ước lượng gần đúng, E{ ▪ } là tốn tử kỳ vọng ( Expectation ) Tín hiệu tiếngnói được tăng cường có thể có được bằng cách biến đổi IFFT của ∧ (ω) 13 Giả thiết nhiễu được xem là biến đổi chậm , thế thì biên độ phổ ước lượng của oa ng nhiễu μ(ω) có thể được ước lượng bởi giá trị... Subtraction – SS ) Thuật tốn trừ phổ dựa trên một ngun tắc cơ bản, thừa nhận sự có mặt của nhiễu, và ước lượng phổ nhiễu rồi lấy phổ của tín hiệu tiếngnói bị nhiễu trừ đi phổ của nhiễu đã ước lượng Phổ của nhiễu có thể được ước lượng, cập nhật trong nhiều chu kỳ khi khơng có mặt của tín hiệu tiếngnói Phương pháp này chỉ được thực hiện đối với nhiễu khơng đổi hoặc có tốc độ biến đổi chậm, và khi đó... sig(start:start+windowLen-1)=sig(start:start+windowLen-1)+ real(ifft(spec,windowLen)); end ReconstructedSignal=sig; 2 Các thuật tốn nâng cao chất lượngtiếng nói: Sơ đồ tổng qt xử lý tiếng nói: Phân tích tín frame Tín hiệu bị nhiễu FFT Hàm xử lý IFFT giảm nhiễu M hiệu thành các Overlap adding Tín hiệu đã xử lý Ước lượng nhiễu Hình 1.1 Sơ đồ khối cho hai thuật tốn SS và WF Th ao Cả 2 thuật tốn Spectral subtraction và Wiener filter... thiện chấtlượng xử lý 4 Các thơng số ảnh hưởng đến hiệu quả chấtlượng của thuật tốn: 4.1 Các thơng số chung ảnh hưởng đến cả 2 thuật tốn: H 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 im lặng ban đầu Nếu IS q lớn thì có thể xảy ra trường hợp tiếng nói. .. alpha: là hệ số làm trơn cho SNRpriori 5 Cải thiện chất lượng: Thay đổi các thơng số chung của cả hai thuật tốn để cải thiện chất lượng thơng qua phương pháp đánh giá cảm quan bằng tai Chọn cửa sổ Hamming SP = 0.5 IS= 0.15 NoiseMargin=3 Hangover=4 30 Gamma=1 oa ng Beta=0.02 alpha=0.95 6 Nhận xét và kết luận 6.1 Nhận xét - Ở 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... (27) Biên độ phổ của nhiễu |N(ω)| khơng xác định được, nhưng có thể thay thế bằng giá trị trung bình của nó được tính trong khi khơng có tiếngnói (tiếng nói bị dừng), và pha của tín hiệu nhiễu có thể thay thế bằng pha của tín hiệu bị nhiễu ϕ (ω) ∧ Ta có thể ước lượng được biên độ của phổ tín hiệu sạch phi tuyến được xác định như sau : ∧ (ω) (ω) (28) H (ω) = (ω) từ Yw(ω) bằng một hàm ∧ (ω) = 1 − (ω)... (ω)} và (ω)|2} được ước lượng khi khơng có tiếngnói (ω)|2 Vì khơng có một sự tương quan nào giữa nhiễu nw[n] và tín hiệu sạch sw[n] [1], nên E{ (ω) ∗ (ω)} và E{ ∗ (ω) (ω)} xem như bằng 0 Khi đó phổ cơng suất của tín hiệu sạch có thể tính được như sau: ^ | (ω)| = | ^ (ω)| − | (ω)| (19) Cơng thức trên biểu diễn thuật tốn trừ phổ cơng suất Theo đó, thì phổ cơng suất ∧ được ước lượng | (ω)| khơng được... thể được thay thế bằng giá trị trung bình của nó và được ước lượng trong khi khơng có tiếngnói hoạt động ; Pha Φn(ω) của nhiễu pha ϕ (ω) của tín hiệu có nhiễu ( ) ; Biên độ phổ nhiễu | giá trị trung bình của nó trên segment đang xét | ( ) được thay thế bằng (ω)| được thay thế bằng ( ) | = ∑ | ( )| (11) ∧ Hoặc: ∧ M Khi đó chúng ta có thể ước lượng được phổ của tín hiệu sạch: ∧ (ω) = [| (ω)| − | (ω) = . quan về nâng cao chất lượng tiếng nói:
Tiếng nói đóng vai trò rất quan trọng trong thông tin liên lạc. Quá trình truyền
tín hiệu tiếng nói được truyền. ước lượng tín hiệu tiếng nói bằng cách tối
thiểu hóa sai số bình phương trung bình (Mean Square Error) giữa tín hiệu tiếng nói thực
và tín hiệu tiếng nói