10 Haziran 2010 Perşembe

MATLAB ile Voice/Unvoice

Bir arkadaşa yardım için basitçe hazırladığım matlab programı. Wav uzantılı sesi alarak 2 tür işlemden geçiriyor ve Ses'te konuşma olup olmadığını tespit ediyor.Bu 2 yöntem Zero Crossing Rate ve Short-Time Energy. Bu konularla ilgili internette pek çok kaynak bulunmakta. Matlab ile amatörce geliştirdiğim kod ise şöyle:

% İlk Giriş Wav Dosyasının Alınması
fn=input('\nWav dosyası ismi girin : ','s'); 
[x,Fs]=wavread(fn);   % wav dosyası okunuyor
                         % x:giriş    fs:frekans
x=x.';
fprintf('Frekans : %g\n',Fs);
%----------------------------------------------------------------
% Zero Crossing Rate - Sınır Kesit Oranı
M = length(x) - 1;               
x1 = x(1:end-1);
x2 = x(2:end);
xp = x1 .* x2;
I = (xp < 0);
zc = sum(I) / M;
fprintf('Zero Crossing Rate : %g\n',zc);
if(zc>0.07)
    fprintf('ZCR ye göre İnsan Sesi Var(Voice)\n');
else
    fprintf('ZCR ye göre İnsan Sesi Yok(Unvoice)\n');
end
%----------------------------------------------------------------
% Shortime-Energy - Kısa Süreli Enerji Hesabı
N=length(x);
s=cos(2*pi*N/N-1*[0:N-1]');
h=0.54-0.46*s;
E=x*h.^2;
fprintf('Short-Time Energy : %g\n',E);
if E>3
    fprintf('STE ye göre İnsan Sesi Var(Voice)\n');
else
    fprintf('STE ye göre İnsan Sesi Yok(Unvoice)\n');
end
%----------------------------------------------------------------
% Giriş Sesi, Zero Crossing Rate ve Short-time Energy Grafikleri
t=(0:length(x)-1)/Fs;
subplot(3,1,1);
plot(t,x);
title('Kontrol Edilecek Olan Ses Dalgasının Genlik-Zaman Grafiği')
legend('Dalga Şekli');
xlabel('Zaman (s)');
ylabel('Genlik');
subplot(3,1,2);
plot(t,zc);
title('Zero Crossing Rate Grafiği');
legend('ZCR');
xlabel('Zaman (s)');
subplot(3,1,3);
plot(t,E);
title('Short-time Energy Grafiği');
legend('STE');
xlabel('Zaman (s)');