Informe DSP Reconocedor de Voz
Informe DSP Reconocedor de Voz
Informe DSP Reconocedor de Voz
El procesamiento digital de señales de voz tiene una gran variedad de aplicaciones, existe una base para
el tratamiento digital de señales, que puede ser implementada para lograr obtener lo que nos interese
según la aplicación.
El Sistema de Reconocimiento de Voz es una de las aplicaciones del procesamiento digital de señales de
voz.
El sistema consiste en obtener una señal de voz que permita reconocer qué palabra se esta hablando.
Consta de una interfaz gráfica que permite la interacción del usuario por medio de un micrófono con la
computadora, la que procesa automáticamente los datos adquiridos.
Basado en los resultados de este sistema, se puede ver como se plantea la base del procesamiento digital
de señales de voz y queda a la libre imaginación como puede ser utilizado para otras aplicaciones, a
demás del de reconocimiento de voz.
1. DIAGRAMA DE BLOQUES
El identificador de voz a desarrollar esta orientado a implementar un sistema de reconocimiento de voz
basado en parámetros LPC como medida de la señal de entrada, como muestra la figura. 1, el proyecto
total constaría de varias etapas, por ello se muestra el diagrama de bloques correspondiente:
Dada la magnitud del proyecto total de reconocimiento de voz, éste fue dividido en proyectos más
pequeños. Nuestro proyecto consiste en la obtención de los parámetros LPC, que luego serían
comparados con los patrones de referencia, para la implementación de dicho identificador de voz se
utilizara el método de obtención de parámetros LPC.
En en2 (m) sn (m) k i ak sn (m k )
p
Los parámetros LPC que buscamos son aquellos que minimizan esta ecuación. Por tanto, serán aquellos
P
que cumplan:
𝑑𝐸𝑛
𝑑𝑎𝑖
= 0 obteniendo s
m
n ( m i ) s n ( m) a k s n ( m i ) s n ( m k )
k i m
Notando que esos términos son términos de corto termino de la covariancia de Sn(m) lo notaremos como
n (i, k ) para compactar las condiciones a cumplir, finalmente obtenemos una notación compacta
P
n (i,0) a k n (i, k ) que implica un set de p ecuaciones con p incógnitas (los parámetros mismos).
k i
Las soluciones, pues, minimizan la señal de error mínimo cuadrado definida anteriormente, utilizando la
función de covariancia se convertirá en una función de auto correlación, donde se podrá decir que esta
es simétrica, finalmente podemos expresarla en forma matricial de la siguiente forma:
Esta matriz p*p de valores de auto correlación es una matriz de Toeplitz, la cual se puede resolver
mediante el conocido método de Durbin obteniendo los parámetros LPC, los cuales permiten aproximar
la señal original minimizando el error cuadrático medio.
E. ANÁLISIS LPC
El siguiente paso en el proceso es el análisis LPC, el cual convierte cada trama de p+1 auto correlaciones
en un set de parámetros LPC. El método formal para esta conversión es el conocido método de
Durbin. Este método resuelve la matriz de Toeplitz anteriormente vista.
F. IMPLEMENTACIÓN
Como verificación del método y de los algoritmos previamente descriptos, se implementaron funciones
en Matlab para cada uno de los bloques del procesador LPC de voz. Utilizando una señal wav de entrada
(señal roja), y utilizando la función de Matlab que simula el procesador, se obtuvo otro archivo wav (señal
azul), reconstruida con los parámetros LPC (Fig. 3).
5. PRE PROCESADO
Convertir la entrada de voz a una forma que el reconocedor pueda procesar o que la señal sea más
accesible para procesar luego.
6. MUESTREO Y CUANTIFICACIÓN
Muestreo consiste en el proceso de conversión de señales continuas a señales discretas en el
tiempo, es un paso para digitalizar una señal analógica, este proceso se realiza midiendo la señal
en momentos periódicos del tiempo.
Cuantificación en la cuantificación el valor de cada muestra de la señal se representa como un
valor elegido de entre un conjunto finito de posibles valores, se conoce como error de
cuantificación (o ruido), a la diferencia entre la señal de entrada (sin cuantificar) y la señal de
salida (ya cuantificada), interesa que el ruido sea lo más bajo posible.
9. SEGMENTACIÓN
La segmentación consiste en cortar la señal en segmentos de análisis. La señal de voz es asumida como
estacionaria en estos segmentos, durante la segmentación los segmentos son guardados cada uno como
la columna de una matriz, para el posterior procesamiento de la señal de voz, para el proceso una ventana
de Hamming de 30ms es aplicada a la señal de voz, enfatizada previamente con el filtro de preénfasis, con
un desplazamiento típico 10ms entre cada ventaneo.
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Outputs from this function are returned to the command line.
function varargout = Rec_voz_jbcc_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)
case 2
y1=wavread('Muestra1')
y1 = fft (y1); % se obtiene la transformada de fourier de la
segunda grabacion %
voz1 = y1.*conj(y1); % se obtiene el conjugado%
voz1f = voz1 (1:600); % Solo acepta las Frecuencias arriba de 600
HZ %
voz1fn = voz1f/sqrt(sum (abs (voz1f).^2)); % se normaliza el
vector %
voz2=fft(voz1fn)
plot(handles.axes1,voz1,'b')
otherwise
y1 = wavread('Muestra1');
handles.g1=plot(handles.axes1,y1,'b');
end
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
case 2
y1=wavread('Muestra2')
y1 = fft (y1); % se obtiene la transformada de fourier de la
segunda grabacion %
voz1 = y1.*conj(y1); % se obtiene el conjugado%
voz1f = voz1 (1:600); % Solo acepta las Frecuencias arriba de 600
HZ %
voz1fn = voz1f/sqrt(sum (abs (voz1f).^2)); % se normaliza el
vector %
plot(handles.axes2,voz1,'b')
otherwise
y1 = wavread('Muestra2');
plot(handles.axes2,y1,'b');
end
% hObject handle to popupmenu2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
case 2
y1=wavread('Muestra3')
y1 = fft (y1); % se obtiene la transformada de fourier de la
segunda grabacion %
voz1 = y1.*conj(y1); % se obtiene el conjugado%
voz1f = voz1 (1:600); % Solo acepta las Frecuencias arriba de 600
HZ %
voz1fn = voz1f/sqrt(sum (abs (voz1f).^2)); % se normaliza el
vector %
plot(handles.axes3,voz1,'b')
otherwise
y1 = wavread('Muestra3');
plot(handles.axes3,y1,'b');
end
% hObject handle to popupmenu3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = get(hObject,'String') returns popupmenu3 contents as
cell array
% contents{get(hObject,'Value')} returns selected item from
popupmenu3
case 2
y1=wavread('Muestra4')
y1 = fft (y1); % se obtiene la transformada de fourier de la
segunda grabacion %
voz1 = y1.*conj(y1); % se obtiene el conjugado%
voz1f = voz1 (1:600); % Solo acepta las Frecuencias arriba de 600
HZ %
voz1fn = voz1f/sqrt(sum (abs (voz1f).^2)); % se normaliza el
vector %
plot(handles.axes4,voz1,'b')
otherwise
y1 = wavread('Muestra4');
plot(handles.axes4,y1,'b');
end
% hObject handle to popupmenu4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
b=[1-0.95];
y=filter(b,1,y);
v=hamming(240);
v=rot90(v);
n=(length(y)/240);
m=[length(y)/n];
t=length(v)/2;
a=length(v)-t;
ini=0;
k=0;
for j=ini:n,
for i=1:m,
r(i)=y(i+k);
end
k=k+120;
w=r.*v;
c=xcorr(w);
ak=levinson(c,12);
Patron=ak
maximo=max(abs(Patron));
n=length(Patron);
sonidoN=zeros(1,n);
for i=1:1:n;
sonidoN(i)=Patron(i)/maximo
handles.result=ak
guidata(hObject,handles)
set(handles.s_222,'String',handles.result);
plot(handles.axes3,c);
end
prom=mean(ak);
set(handles.prom3,'string',prom)
b=[1-0.95];
y=filter(b,1,y);
v=hamming(240);
v=rot90(v);
n=(length(y)/240);
m=[length(y)/n];
t=length(v)/2;
a=length(v)-t;
ini=0;
k=0;
for j=ini:n,
for i=1:m,
r(i)=y(i+k);
end
k=k+120;
w=r.*v;
c=xcorr(w);
ak=levinson(c,12);
Patron=ak
maximo=max(abs(Patron));
n=length(Patron);
sonidoN=zeros(1,n);
for i=1:1:n;
sonidoN(i)=Patron(i)/maximo
handles.result=ak
guidata(hObject,handles)
set(handles.s_2222,'String',handles.result);
plot(handles.axes4,c);
end
prom=mean(ak);
set(handles.prom4,'string',prom)
end
% hObject handle to pushbutton8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
b=[1-0.95];
y=filter(b,1,y);
v=hamming(240);
v=rot90(v);
n=(length(y)/240);
m=[length(y)/n];
t=length(v)/2;
a=length(v)-t;
ini=0;
k=0;
for j=ini:n,
for i=1:m,
r(i)=y(i+k);
end
k=k+120;
w=r.*v;
c=xcorr(w);
ak=levinson(c,12);
Patron=ak
maximo=max(abs(Patron));
n=length(Patron);
sonidoN=zeros(1,n);
for i=1:1:n;
sonidoN(i)=Patron(i)/maximo
handles.result=ak
guidata(hObject,handles)
set(handles.s_22,'String',handles.result);
plot(handles.axes2,c);
end
prom=mean(ak);
set(handles.prom2,'string',prom)
end
% hObject handle to pushbutton6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
b=[1-0.95];
%figure;subplot(2,1,1);plot(y)
y=filter(b,1,y);
%subplot(2,1,2);plot(y)
v=hamming(240);
v=rot90(v);
n=(length(y)/240);
m=[length(y)/n];
t=length(v)/2;
a=length(v)-t;
ini=0;
k=0;
for j=ini:n,
for i=1:m,
r(i)=y(i+k);
end
k=k+120;
w=r.*v;
c=xcorr(w);
ak=levinson(c,12);
Patron=ak
maximo=max(abs(Patron));
n=length(Patron);
sonidoN=zeros(1,n);
prom=mean(sonidoN)
for i=1:1:n;
sonidoN(i)=Patron(i)/maximo
handles.result=ak
guidata(hObject,handles)
set(handles.s_2,'String',handles.result);
plot(handles.axes1,c);
end
prom=mean(ak);
set(handles.prom1,'string',prom)
end
t = 1:nFrames;
t = 20 * t;
if m==1
freq_prom = 0;
else
freq_prom = freq_prom/(m-1);
end
i23 = 2 * len/3;
maxi2 = max(abs(xseg(i23:len)));
if maxi1>maxi2
CL=0.68*maxi2;
else
CL= 0.68*maxi1;
end
engy = norm(clip,2)^2;
RR = xcorr(clip);
m = len;
% Encontrar el máximo en la autocorrelación en el rango de 60 <= f <= 320
% Hz
LF = floor(fs/320);
HF = floor(fs/60);
Rxx = abs(RR(m+LF:m+HF));
[rmax, imax] = max(Rxx);
silencio = 0.4*engy;
if (rmax > silencio) && (f0 > 60) && (f0 <= 320)
f0 = fs/imax;
else % -- segmento mudo (sin audio) ---------
f0 = 0;
end
% hObject handle to pushbutton10 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)