Proyecto Final Identificador Del Hablante

10
PUCMM Pontificia Universidad Católica Madre y Maestra Facultad de Ciencias de las Ingeniería Departamento de Ingeniería en Sistema Y Telemática Santiago Comunicaciones Digitales April 12 2011 Identificador del Hablante Néstor Díaz Víctor Santos 2004-6233

Transcript of Proyecto Final Identificador Del Hablante

Page 1: Proyecto Final Identificador Del Hablante

PUCMM Pontificia Universidad Católica Madre y Maestra Facultad de Ciencias de las Ingeniería

Departamento de Ingeniería en Sistema Y Telemática

Santiago

Comunicaciones Digitales

April 12

2011 Identificador del Hablante

Néstor Díaz Víctor Santos 2004-6233

Page 2: Proyecto Final Identificador Del Hablante

2

Introduccion

El reconocimiento de voz es el proceso de reconocer automáticamente quien está hablando sobre la base de la información que figura en las ondas de voz. Esta técnica hace posible el uso de la voz del hablante para verificar su identidad y control de acceso a servicios tales como la marcación por voz, banca por teléfono, ir de compras telefónicas, servicios de base de datos de acceso, servicios de información, correo de voz, control de seguridad para las áreas de información confidencial, y la distancia acceso a las computadoras.

El objetivo del proyecto es conocer cómo detectar patrones específicos de la voz y realizar una comparación para determinar cuál persona está hablando, también ponemos en práctica lo aprendido en el laboratorio como fue la transformada rápida de Fourier FFT, la toma de una señal de voz con su respectiva frecuencia, el manejo de la interface gráfica de matlab entre otras cosas.

Este tipo de sistema en un futuro puede tener buenas repercusiones en el mundo, debido a que las personas cada vez prefieren más comodidad y seguridad, por lo que la voz es el método de comunicación más versátil y cómodo que existe ya que gastamos menos energía al utilizarla.

Page 3: Proyecto Final Identificador Del Hablante

3

Desarrollo El sistema puede almacenar ilimitados usuarios pero a medida que los usuarios son aumentados más aumenta el porcentaje de error. Este consta de una base de datos mySQL el cual son simplemente registrado por un usuario donde por medio de este capturamos una imagen, una muestra de voz y por último los datos de la información.

Cómo trabajar con base de datos MySQL en MATLAB

1ro. Una vez que se ha instalado el manejador de base de datos MySQL se procede a la descarga de una librería para Matlab llamada mysql-connector-java-3.0.17

Se puede descargar de esta dirección: http://www.cristiantala.cl/attachments/062_DataBase.m

1. Copiar el conector a la carpeta java/jarext/ que se encuentra en el directorio de Matlab.

2. Incluir en el archivo classpath.txt que se encuentra en toolbox/local el conector

o $matlabroot/java/jarext/mysql-connector-java-3.0.17-ga-bin.jar

o En el caso de que tu conector sea el mysql-connector-java-3.0.17-ga-bin.jar

3. Ahora es el momento de comprobar que esto funciona.

Page 4: Proyecto Final Identificador Del Hablante

4

Fuente: http://www.cristiantala.cl/index.php?option=com_content&view=article&id=62:matlab-mysql&catid=14:matlab&Itemid=5

Una vez conectados a la BD procedemos con la creación de las tablas en este caso se crearon las siguientes:

El sistema captura el nombre, apellido, carrera, identificador el cual se refiere al número en el que la voz fue grabada, estatus, edad.

La función para ingresar los usuarios a la BD es insert.m

function insert(nombre, apellido, carrera, edad, estatus, id) host = 'localhost'; user = 'root'; password = ''; dbase = 'matlab'; %Conexion DB jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbase); jdbcDriver = 'com.mysql.jdbc.Driver'; dbConn = database(dbase, user , password, jdbcDriver, jdbcString); if isconnection(dbConn) exdata = {nombre, apellido, carrera, edad, estatus, id}; colnames = {'Nombre', 'Apellido', 'carrera', 'edad', 'estatus', 'identificador'}; fastinsert(dbConn, 'usuarios', colnames, exdata); else disp(sprintf('Error en la conección a la BdD: %s', dbConn.Message)); end close(dbConn);

Page 5: Proyecto Final Identificador Del Hablante

5

Campo NO EDITABLE para el usuario

El identificador se obtiene haciendo un Query a la base de datos el cual busca el último usuario que hay registrado en la BD y suma 1, esto hace que si existen 2 usuarios registrados en el identificador el sistema coloca un número 3, cuando el usuario graba su voz se guarda con este número, esto es para que el sistema pueda analizar todas las muestras registradas en el sistema.

Función para obtener el valor del próximo identificador es next_id()

function proximo_id=next_id() host = 'localhost'; user = 'root'; password = ''; dbase = 'matlab'; % Datos de la conección jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbase); jdbcDriver = 'com.mysql.jdbc.Driver'; dbConn = database(dbase, user , password, jdbcDriver, jdbcString); if isconnection(dbConn) curs = exec(dbConn, 'select count(nombre) from usuarios'); setdbprefs('DataReturnFormat', 'cellarray') curs = fetch(curs); res = curs.Data(:,1); proximo_id = 1+[res{:}]; proximo_id; else disp(sprintf('Error en la conección a la BdD: %s', dbConn.Message)); end close(dbConn);

Page 6: Proyecto Final Identificador Del Hablante

6

Captura de imagen

Una vez el usuario escribe su nombre en el formulario la imagen se almacena con el nombre de este, con el fin de obtener una organización al almacenar la información.

La función para tomar la imagen al usuario se llama foto.m

function foto(nombre) vid = videoinput('winvideo', 1, 'YUY2_640x480'); src = getselectedsource(vid); vid.FramesPerTrigger = 1; vid.ReturnedColorspace = 'rgb'; preview(vid); myWait(3); a=wavread('sistem_audio\beep.wav'); wavplay(a,11000); data = getsnapshot(vid); stoppreview(vid); name = sprintf('fotos/%s.jpg',nombre); imwrite(data,name);

Al principio presente problemas con la imagen ya que esta capturaba solo blanco y negro y este problema fue resuelto con el cambio de los códec de video.

En esta función hay una función dentro llamada myWait este es un delay para dar tiempo al usuario que se coloque en posición antes de hacer la captura.

Interface de voz del sistema

El sistema posee una interface de voz el cual le indica al usuario cuando debe de hablar, cuando está procesando la información entre otras cosas. Estas voces fueron grabadas con un modulador de voz llamado MorphVOX Pro el cual puedo transformar mi voz en la de una mujer.

Page 7: Proyecto Final Identificador Del Hablante

7

Estas voces son ejecutadas con el siguiente comando

myWait(2); a=wavread('sistem_audio\nombre.wav'); wavplay(a,46000);

Dibujar las señales de voz en el sistema de interface gráfica

Para poder desplegar la señal de voz que introduce el usuario y la señal del patrón que fue encontrado utilizo el siguiente script.

[X, Fs, NBITS] = wavread('audio_temp/s1.wav'); M = 0:(2/(88200-1)):2 ; %Creo la matriz a=wavread('sistem_audio\procesando.wav'); wavplay(a,46000); axes(handles.muestras); % se elige el axes 2 m = plot(M,X,'b','linewidth',1); get( m ) ; grid on; De esta misma forma despliego la imagen de la persona que es reconocida y la imagen del logo.

Page 8: Proyecto Final Identificador Del Hablante

8

Interfacegraficadelsistema

Al presionar el botón de acceso el sistema inicia y le pide que diga su nombre el sistema graba la voz temporal como s1.wav, una vez esta es guardada se llama la función next_id y se le resta un dígito para obtener la cantidad exactas de muestras que tengo almacenadas, esta son pasadas a la función train() el cual analiza todas las muestras y luego se le pasan estos valores muestreados a la función test() el cual se encarga de analizar y realizar las comparaciones, en esta función son llamadas otras como son mfcc() el cual calcula la FFT.

cant_patron= next_id-1; code1=train('train/', cant_patron); m=test('audio_temp/',1,code1);

Page 9: Proyecto Final Identificador Del Hablante

9

Uno de los parámetros modificados para aumentar la rapidez de análisis del sistema fue el incremento de m en la función mfcc() el cual hace que los marcos o frames que inician después del anterior sean más grandes.

function r = mfcc(s, fs) m = 500; n = 256; l = length(s); nbFrame = floor((l - n) / m) + 1; for i = 1:n for j = 1:nbFrame M(i, j) = s(((j - 1) * m) + i); end end h = hamming(n); M2 = diag(h) * M; for i = 1:nbFrame frame(:,i) = fft(M2(:, i)); end t = n / 2; tmax = l / fs; m = melfb(20, n, fs); n2 = 1 + floor(n / 2); z = m * abs(frame(1:n2, :)).^2; r = dct(log(z));

Page 10: Proyecto Final Identificador Del Hablante

10

Conclusiones

El sistema presenta dificultades de reconocimiento dependiendo en qué lugar se tomaron las muestras y esto es debido a la cantidad de ruido que se capturó en el momento.

Ejemplo si una persona tomó su patrón de muestra en un área muy silenciosa, al momento de realizar las comparaciones si se toma en un lugar con más ruido, el sistema falla.

Una de las desventajas de este tipo de sistemas es que la voz humana cambia constantemente, cambia de una forma tal vez imperceptible para el humano pero si perceptible para una máquina. Este problema en teoría puede corregirse realizando varios patrones de voz de una persona grabándolas en determinados tiempos específicos.

También el problema del ruido puede mejorarse, si hacemos un buen filtro de la voz del patrón y la voz tomada para el análisis.

Este proyecto lo considero como una muy buena experiencia ya que desconocía los métodos y software utilizados para la realización de este.