You are on page 1of 24

IDENTIFICADOR 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:

Figura 1 Diagrama de bloques de un Identificador de voz

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.

2. ANÁLISIS DE ECUACIONES LPC


Haremos un análisis respecto de las ecuaciones que nos permiten un criterio para la elección de los
parámetros LPC, la idea básica del modelo LPC es que una muestra de voz dada en un tiempo n, se puede
aproximar mediante una combinación lineal de las últimas p muestras de voz, de manera que:
s (n)  a1 s(n  1)  a 2 s(n  2)  ...  a p s(n  p)
~
donde los coeficientes LPC a1, a2, a3,...an se asumen constantes para el análisis de cada trama de voz, ahora,
definimos el error de predicción como: Sn(m)=s(n+m) en(m)=e(n+m)
y buscamos minimizar la señal de error mínimo cuadrado en un tiempo n, o sea que:

 

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.

3. PROCESADOR LPC PARA RECONOCIMIENTO DE VOZ


El método se puede estudiar dividiéndolo en 5 bloques principales como muestra la fig. 2.

Figura 2. Diagrama de bloques para un procesador LPC para reconocimiento de voz


A. PREÉNFASIS
Se filtra la señal de voz mediante un FIR de primer orden para “suavizarla” y hacerla menos susceptible
a los efectos de precisión finita que luego tienen lugar en el proceso.
H(z)=1-a.z-1 s(n)=s(n)-a,s(n-1) con 0.9<a<1.0, típicamente a=15/16
B. FRAME BLOCKING
En esta etapa la señal pre enfatizada s(n) es separada en tramas de N muestras con los comienzos de las
tramas adyacentes separadas M muestras (M<N).
Los valores usados en este proyecto son: N=480, M=160 Como M<N, tramas adyacentes se superponen,
resultando en estimaciones espectrales LPC correlacionadas de trama a trama
C. WINDOWING
El próximo paso es aplicarle una ventana a cada trama de manera de minimizar las discontinuidades de
la señal en los extremos de la trama, se utilizará, una ventana de Hamming de la forma:

D. ANÁLISIS DE AUTO CORRELACIÓN


Cada trama de la señal resultante del bloque anterior, es auto correlacionada, obteniendo:

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).

Figura 3. Señales de voz de prueba


4. DESARROLLO DE UN IDENTIFICADOR DE VOZ
Obtención de información mediante micrófono
Micrófono.- El micrófono es un transductor electroacústica. Su función es la de transformar (traducir) la
presión acústica ejercida sobre su capsula por las ondas sonoras en energía eléctrica.
El audio es un fenómeno analógico. Para grabar una señal de voz se hace la conversión de la señal
analógica del micrófono en una señal digital por medio del conversor A/D en la tarjeta de sonido, cuando
un micrófono está operando las ondas de sonido hacen que vibre el elemento magnético del micrófono
causando una corriente eléctrica hacia la tarjeta de sonido, donde el conversor A/D básicamente graba
los voltajes eléctricos en intervalos específicos, dado a que el habla es relativa mente de bajas frecuencias
(entre 100Hz-8kHz), una frecuencia de muestreo de 16000 muestras/seg provee una mayor exactitud
en la adquisición de la información, la frecuencia de nyquist, la obtención de la información mediante
micrófono en MATLAB se realiza con la función wavrecord(n,Fs) graba n muestras de la señal de audio,
muestreadas a una frecuencia de Fs, utilizamos la frecuencia de 11025 Hz ya que se adapta bien a
muestro algoritmo y no se pierde información. La señal obtenida es de canal mono, que es el valor
predeterminado en la función, 1 para mono y 2 para estéreo.

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.

7. ELIMINACIÓN DEL RUIDO


La señal digitalizada es escaneada y las zonas de silencio son removidas por medio del cálculo de energía
en corto tiempo. Segmentos de 10ms se escogieron para este propósito. En un segmento la energía
promedio es menor que un valor umbral proporcional a la energía promedio de la señal entera es
descartado.
8. FILTRO DE PREÉNFASIS
Se aplica un filtro digital pasa altas de primer orden a la señal, para enfatizar las frecuencias altas de los
formantes por dos razones, primero para que no se pierda información durante la segmentación, ya que
la mayoría de la información está contenida en las frecuencias bajas, en segundo remueve la componente
DC de la señal, aplanando espectralmente la señal.

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.

10. EXTRACCIÓN DE CARACTERÍSTICAS


En el reconocimiento del habla, la señal de voz pre procesada se ingresa a un nuevo procesamiento para
producir una representación de la voz en forma de secuencia de vectores o agrupaciones de valores que
se denominan parámetros, que deben representar la información contenida en la envolvente del espectro
Hay que tener en cuenta que el número de parámetros debe ser reducido, para no saturar la base de
datos, ya que mientras más parámetros tenga la representación menos fiables son los resultados y más
costosa la implementación.

11. MEDIDA DE DISTANCIA


Una característica fundamental de los sistemas de reconocimiento es la forma en que los vectores
característicos son combinados y comparados con los patrones de referencia, para poder realizar estas
operaciones es necesario definir una medida de distancia entre los vectores característicos. Algunas de
las medidas de distancia más utilizadas son las distancias o métricas inducidas por las normas en
espacios Lp, en el algoritmo de reconocimiento en MATLAB se utiliza una distancia Euclidea.

12. RESULTADOS DE EVALUACIÓN


La base de datos de entrenamiento consiste en muestras almacenadas en un archivo .mat de cuatro
nombres distintos, todas estas muestreas fueron tomadas con un mismo hablante. La base de datos se
almacena una vez y puede ser modificada o ampliada según sea la necesidad ya que posee su propio M-
file.
Para evaluar el sistema, se obtiene una señal de muestra y se sacan las características de esta señal para
ser comparada con cada una de las características almacenadas en la base de datos. Para esta
comparación se utiliza una medida de distancia Euclidiana. La menor medida de distancia representa la
de mayor similitud.
13. PROGRAMA DE RECONOCIMIENTO DE VOZ
El sistema de reconocimiento de voz se puede resumir en el siguiente diagrama esquemático

Figura 4. Diagrama de bloques del programa para Identificador de voz


function varargout = Rec_voz_jbcc(varargin)
% REC_VOZ_JBCC M-file for Rec_voz_jbcc.fig
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Rec_voz_jbcc_OpeningFcn, ...
'gui_OutputFcn', @Rec_voz_jbcc_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 initialization code - DO NOT EDIT

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


function Rec_voz_jbcc_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 Rec_voz_jbcc (see VARARGIN)

% Choose default command line output for Rec_voz_jbcc


handles.output = hObject;

% Update handles structure


guidata(hObject, handles);

% UIWAIT makes Rec_voz_jbcc wait for user response (see UIRESUME)


% uiwait(handles.figure1);

% --- 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)

% Get default command line output from handles structure


varargout{1} = handles.output;

% --- Executes on button press in pushbutton3.


function pushbutton3_Callback(hObject, eventdata, handles)
Fs = 11025; % Sampling Frequency (Hz)
n = 20;
Nseconds = 2; % largo de la señal de voz
y3 = wavrecord(Nseconds*Fs, Fs, 1)';
sound(y3,Fs)
handles.g3=plot(handles.axes3,y3,'g');
wavwrite(y3,Fs,16,'D:\DSP_VOZ_CAMARA\Muestra3.wav');
msgbox('Grabacion terminada');% hObject handle to pushbutton3 (see
GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% --- Executes on button press in pushbutton4.


function pushbutton4_Callback(hObject, eventdata, handles)
%
Fs = 11025; % Sampling Frequency (Hz)
n = 20;
Nseconds = 2; % largo de la señal de voz
y4 = wavrecord(Nseconds*Fs, Fs, 1)';
sound(y4,Fs)
handles.g4=plot(handles.axes4,y4);
wavwrite(y4,Fs,16,'D:\DSP_VOZ_CAMARA\Muestra4.wav');
msgbox('Grabacion terminada');

% eventdata reserved - to be defined in a future version of MATLAB


% handles structure with handles and user data (see GUIDATA)

% --- Executes on button press in pushbutton2.


function pushbutton2_Callback(hObject, eventdata, handles)
%
Fs = 11025; % Sampling Frequency (Hz)
n = 20;
Nseconds = 2; % largo de la señal de voz
y2 = wavrecord(Nseconds*Fs, Fs, 1)';
sound(y2,Fs)
handles.g2=plot(handles.axes2,y2,'r');
wavwrite(y2,Fs,16,'D:\DSP_VOZ_CAMARA\Muestra2.wav');
msgbox('Grabacion terminada');

% eventdata reserved - to be defined in a future version of MATLAB


% handles structure with handles and user data (see GUIDATA)

% --- Executes on button press in pushbutton1.


function pushbutton1_Callback(hObject, eventdata, handles, canalvideo)

Fs = 11025; % Sampling Frequency (Hz)


n = 20;
Nseconds = 2; % largo de la señal de voz
y1 = wavrecord(Nseconds*Fs, Fs, 1)';
sound(y1,Fs)
handles.g1=plot(handles.axes1,y1,'b');
wavwrite(y1,Fs,16,'D:\DSP_VOZ_CAMARA\Muestra1.wav');
msgbox('Grabacion terminada');
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% --- Executes on selection change in popupmenu1.


function popupmenu1_Callback(hObject, eventdata, handles)
v1=get(handles.popupmenu1,'value');
set(handles.s_1,'String',v1);
switch v1
case 1
Fs=11025;
y1=wavread('Muestra1');
L=length(y1); % Longitud de la señal
NFFT = 2^nextpow2(L); % Siguiente potencia de 2 de la long de y
Y1 = fft(y1,NFFT)/L; % FFT de la señal
f = Fs/2*linspace(0,1,NFFT/2+1); % Rango de frecuencia
ana=2*abs(Y1(1:NFFT/2+1));
% Plot single-sided amplitude spectrum.
% subplot(313)
plot(handles.axes1,f,ana,'b');
set(handles.axes1,'xgrid','on','ygrid','on')

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)

% Hints: contents = get(hObject,'String') returns popupmenu1 contents as


cell array
% contents{get(hObject,'Value')} returns selected item from
popupmenu1

% --- Executes during object creation, after setting all properties.


function popupmenu1_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called

% Hint: popupmenu controls usually have a white background on Windows.


% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end

% --- Executes on selection change in popupmenu2.


function popupmenu2_Callback(hObject, eventdata, handles)
v1=get(handles.popupmenu1,'value');
set(handles.s_1,'String',v1);
switch v1
case 1
Fs=11025;
y1=wavread('Muestra2');
L=length(y1); % Longitud de la señal
NFFT = 2^nextpow2(L); % Siguiente potencia de 2 de la long de y
Y1 = fft(y1,NFFT)/L; % FFT de la señal
f = Fs/2*linspace(0,1,NFFT/2+1); % Rango de frecuencia
ana=2*abs(Y1(1:NFFT/2+1));
% Plot single-sided amplitude spectrum.
% subplot(313)
plot(handles.axes2,f,ana,'b');

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)

% Hints: contents = get(hObject,'String') returns popupmenu2 contents as


cell array
% contents{get(hObject,'Value')} returns selected item from
popupmenu2
% --- Executes during object creation, after setting all properties.
function popupmenu2_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called

% Hint: popupmenu controls usually have a white background on Windows.


% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end

% --- Executes on selection change in popupmenu3.


function popupmenu3_Callback(hObject, eventdata, handles)
v1=get(handles.popupmenu1,'value');
set(handles.s_1,'String',v1);
switch v1
case 1
Fs=11025;
y1=wavread('Muestra3');
L=length(y1); % Longitud de la señal
NFFT = 2^nextpow2(L); % Siguiente potencia de 2 de la long de y
Y1 = fft(y1,NFFT)/L; % FFT de la señal
f = Fs/2*linspace(0,1,NFFT/2+1); % Rango de frecuencia
ana=2*abs(Y1(1:NFFT/2+1));
% Plot single-sided amplitude spectrum.
% subplot(313)
plot(handles.axes3,f,ana,'b');

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

% --- Executes during object creation, after setting all properties.


function popupmenu3_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called

% Hint: popupmenu controls usually have a white background on Windows.


% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end

% --- Executes on selection change in popupmenu4.


function popupmenu4_Callback(hObject, eventdata, handles)
v1=get(handles.popupmenu1,'value');
set(handles.s_1,'String',v1);
switch v1
case 1
Fs=11025;
y1=wavread('Muestra4');
L=length(y1); % Longitud de la señal
NFFT = 2^nextpow2(L); % Siguiente potencia de 2 de la long de y
Y1 = fft(y1,NFFT)/L; % FFT de la señal
f = Fs/2*linspace(0,1,NFFT/2+1); % Rango de frecuencia
ana=2*abs(Y1(1:NFFT/2+1));
% Plot single-sided amplitude spectrum.
% subplot(313)
plot(handles.axes4,f,ana,'b');

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)

% Hints: contents = get(hObject,'String') returns popupmenu4 contents as


cell array
% contents{get(hObject,'Value')} returns selected item from
popupmenu4

% --- Executes during object creation, after setting all properties.


function popupmenu4_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called

% Hint: popupmenu controls usually have a white background on Windows.


% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end

% --- Executes on button press in pushbutton7.


function pushbutton7_Callback(hObject, eventdata, handles)
s=wavread('Muestra3');
sound(s,11025)
len = length(s); % length del vector
avg_e = sum(s.*s)/len; %promedio señal entera
THRES = 0.2;
y = [];
for i = 1:80:len-80 % cada 10ms
seg = s(i:i+79); % segmentos
e = sum(seg.*seg)/80; % promedio de cada segmento
if( e> THRES*avg_e) % si el promedio energetico es mayor que la señal
%completa por el valor umbral
y=[y,seg(1:end)]; % almacena en y sino es eliminado como espacio en
blanco
end;
end

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)

end% hObject handle to pushbutton7 (see GCBO)

% --- Executes on button press in pushbutton8.


function pushbutton8_Callback(hObject, eventdata, handles)
s=wavread('Muestra4');
sound(s,11025)
len = length(s); % length del vector
avg_e = sum(s.*s)/len; %promedio señal entera
THRES = 0.2;
y = [];
for i = 1:80:len-80 % cada 10ms
seg = s(i:i+79); % segmentos
e = sum(seg.*seg)/80; % promedio de cada segmento
if( e> THRES*avg_e) % si el promedio energetico es mayor que la señal
%completa por el valor umbral
y=[y,seg(1:end)]; % almacena en y sino es eliminado como espacio en
blanco
end;
end

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)

% --- Executes on button press in pushbutton6.


function pushbutton6_Callback(hObject, eventdata, handles)
s=wavread('Muestra2');
sound(s,11025)
len = length(s); % length del vector
avg_e = sum(s.*s)/len; %promedio señal entera
THRES = 0.2;
y = [];
for i = 1:80:len-80 % cada 10ms
seg = s(i:i+79); % segmentos
e = sum(seg.*seg)/80; % promedio de cada segmento
if( e> THRES*avg_e) % si el promedio energetico es mayor que la señal
%completa por el valor umbral
y=[y,seg(1:end)]; % almacena en y sino es eliminado como espacio en
blanco
end;
end

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)

% --- Executes on button press in pushbutton5.


function pushbutton5_Callback(hObject, eventdata, handles)
s=wavread('Muestra1');
sound(s,11025)
len = length(s); % length del vector
avg_e = sum(s.*s)/len; %promedio señal entera
THRES = 0.2;
y = [];
for i = 1:80:len-80 % cada 10ms
seg = s(i:i+79); % segmentos
e = sum(seg.*seg)/80; % promedio de cada segmento
if( e> THRES*avg_e) % si el promedio energetico es mayor que la señal
%completa por el valor umbral
y=[y,seg(1:end)]; % almacena en y sino es eliminado como espacio en
blanco
end;
end

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

% hObject handle to pushbutton5 (see GCBO)


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

% --- Executes on button press in grabar_b.


function grabar_b_Callback(hObject, eventdata, handles)
set(handles.grabar_b,'Enable','off')
set(handles.genero,'String','Abriendo')
pause(0.1)
Fs=11025;%22.5KHz
handles.voz= wavread('Muestra2');
set(handles.grabar_b,'Enable','on')
handles.Fs=Fs;
guidata(hObject, handles);% hObject handle to grabar_b (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% --- Executes on button press in pushbutton10.


function pushbutton10_Callback(hObject, eventdata, handles)
if ~isempty(handles.Fs)
set(handles.genero,'String','Procesando')
set(handles.grabar_b,'Enable','off')
set(handles.reconocer_b,'Enable','off')
pause(0.1)
set(handles.grabar_b,'Enable','on')
set(handles.reconocer_b,'Enable','on')
else
warndlg('Debe grabar primero una voz','Mensaje')
end

function [t, f0, freq_prom] = tono(x, fs)


% Obtiene la información del tono de la señal de entrada. El tono se
% obtiene tomando el pico de autocorrelación. Por lo general, el audio
% original (voz) es segmentado en tramas y el contorno del tono se puedo
% derivar por medio de graficar los picos de las tramas.
%
% Entrada:
% x: señal de audio
% fs: frecuencia de muestreo
%
% Salida:
% t: trama de tiempo
% f0: contorno del tono
% freq_prom: frecuencia promedio del tono
% - -
% Número de muestras
ns = length(x);

% Detección de errores en el nivel de la señal, remover nivel DC


mu = mean(x);
x = x - mu;

% Tomar segmentos de 30ms, tomados cada 20 ms de tal modo que el


% solapamiento entre segmentos es 10ms.
fRate = floor(120*fs/1000);
updRate = floor(110*fs/1000);
nFrames = floor(ns/updRate)-1;

% El contorno del tono es 1 x nFrames.


f0 = zeros(1, nFrames);
f01 = zeros(1, nFrames);

% Obtener el tono de cada segmento


k = 1;
freq_prom = 0;
m = 1;
for i=1:nFrames
xseg = x(k:k+fRate-1);
f01(i) = tono_corr(fRate, fs, xseg);
% Aplicar filtro de mediana, menos afectadas por el ruido
if i>2 && nFrames>3
z = f01(i-2:i);
md = median(z);
f0(i-2) = md;
if md > 0
freq_prom = freq_prom + md;
m = m + 1;
end
elseif nFrames<=3
f0(i) = a;
freq_prom = freq_prom + a;
m = m + 1;
end
k = k + updRate;
end

t = 1:nFrames;
t = 20 * t;

if m==1
freq_prom = 0;
else
freq_prom = freq_prom/(m-1);
end

function [f0] = tono_corr(len, fs, xseg)


% Estimación del tono usando el método de autocorrelation.

% Filtro pasa bajas a 900Hz


[bf0, af0] = butter(4, 900/(fs/2));
xseg = filter(bf0, af0, xseg);

% Encontrar el nivel de recorte


i13 = len/3;
maxi1 = max(abs(xseg(1:i13)));

i23 = 2 * len/3;
maxi2 = max(abs(xseg(i23:len)));

if maxi1>maxi2
CL=0.68*maxi2;
else
CL= 0.68*maxi1;
end

% Centrar la onda recortada y calcular la autocorrelación.


clip = zeros(len,1);
ind1 = find(xseg>=CL);
clip(ind1) = xseg(ind1) - CL;

ind2 = find(xseg <= -CL);


clip(ind2) = xseg(ind2)+CL;

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);

imax = imax + LF;


f0 = fs/imax;

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)

% --- Executes on button press in reconocer_b.


function reconocer_b_Callback(hObject, eventdata, handles)
if ~isempty(handles.Fs)
fs_h=handles.Fs;
x_h=handles.voz;
[t_h, f0_h, avgF0_h] = tono(x_h, fs_h);
if avgF0_h>280%179.4139
set(handles.genero,'String','MUJER')
else
set(handles.genero,'String','HOMBRE')
end
else
warndlg('Debe grabar primero una voz','Mensaje')
end

% hObject handle to reconocer_b (see GCBO)


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

% --- Executes on button press in pushbutton14.


function pushbutton14_Callback(hObject, eventdata, handles)
set(handles.pushbutton14,'Enable','off')
set(handles.text15,'String','Abriendo')
pause(0.1)
Fs=11025;%22.5KHz
handles.voz= wavread('Muestra1');
set(handles.pushbutton14,'Enable','on')
handles.Fs=Fs;
guidata(hObject, handles);% hObject handle to grabar_b (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% hObject handle to pushbutton14 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% --- Executes on button press in pushbutton15.


function pushbutton15_Callback(hObject, eventdata, handles)
if ~isempty(handles.Fs)
set(handles.text15,'String','Procesando')
set(handles.pushbutton14,'Enable','off')
set(handles.pushbutton15,'Enable','off')
pause(0.1)
set(handles.pushbutton14,'Enable','on')
set(handles.pushbutton15,'Enable','on')
else
warndlg('Debe grabar primero una voz','Mensaje')
end% hObject handle to pushbutton15 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% --- Executes on button press in pushbutton16.


function pushbutton16_Callback(hObject, eventdata, handles)
if ~isempty(handles.Fs)
fs_h=handles.Fs;
x_h=handles.voz;
[t_h, f0_h, avgF0_h] = tono(x_h, fs_h);
if avgF0_h>280%179.4139
set(handles.text15,'String','MUJER')
else
set(handles.text15,'String','HOMBRE')
end
else
warndlg('Debe grabar primero una voz','Mensaje')
end

% hObject handle to pushbutton16 (see GCBO)


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

% --- Executes on button press in pushbutton17.

% --- If Enable == 'on', executes on mouse press in 5 pixel border.


% --- Otherwise, executes on mouse press in 5 pixel border or over
text15.
Manejo de señal
Comprobando el programa

You might also like