• No se han encontrado resultados

3.2.1.- Grabación

El software de reconocimiento de voz desarrollado en esta tesis, requiere de una base de datos, debido a que sin la existencia de esta no podría contar con la información necesaria para realizar las comparaciones pertinentes y tomar una decisión.

Los comandos que van a ser reconocidos son “A”, “Afuera”, “Usuario”, “Llamada”, “Luces” y “Cajuela”. Cada uno de ellos fue grabado veinte veces, con lo que se obtuvo un total de ciento veinte archivos. A estas grabaciones se les calculó sus coeficientes de predicción lineal, para así obtener un promedio de LPC por cada comando.

El procedimiento de grabación fue el siguiente, se seleccionó un aula común como recinto de grabación. Utilizando la tarjeta de audio de la Laptop Compaq, modelo CQ43-405LA y el micrófono de esta, se hicieron las ciento veinte grabaciones con una frecuencia de muestreo de 22050 Hz con lo cual se abarca todo el ancho de banda de la voz humana, una tasa de cuantización de 16 bits para no tener un error de redondeo significativo, formato monofónico debido a que no es de interés realizar una vista panorámica de la fuente de

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 44 sonido, y finalmente guardado con el formato de archivo “.wav”, para así, obtener una mayor cantidad de información de la señal de voz y este no utiliza compresión.

Para realizar el procedimiento de grabación anteriormente mencionado, se desarrolló un programa auxiliar en MATLAB llamado “grabadora”. En la Fig. 3.13 se aprecia el algoritmo de este mediante un diagrama de flujo.

Fig. 3.13.- Diagrama de flujo para programa de grabación.

A continuación se muestra el código utilizado, basado en el diagrama de flujo de la Fig. 3.13, para realizar las ciento veinte grabaciones.

En dicho código, se asigna a la variable Fs, el valor de 22050, el cual es la frecuencia de muestreo a la que se pretende grabar. La variable y recibe las muestras grabadas durante tres segundos wavrecord(3*Fs,”,”), en formato monofónico wavrecord(“,”,1). Finalmente se guarda la grabación con la función wavwrite donde se especifica, la variable que contiene

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 45 las muestras a guardar wavwrite(y,”,”,”), la frecuencia de muestreo a la que se grabó

wavwrite(“,Fs,”,”), la tasa de bits a la que se desea guardar wavwrite(“,”,16,”), y el nombre

del archivo wavwrite(“,”,”,’nombre_del_archivo.wav’).

3.2.2.- Normalización

Una vez grabados todos los archivos es necesario normalizarlos, debido a que algunos tienen amplitudes muy pequeñas con respecto a otros, pues durante la grabación, variables como la distancia respecto al micrófono y la amplitud de voz no son constantes, de esta manera se asegura que todas las grabaciones tengan la amplitud máxima igual a 1. Para llevar a cabo el proceso de normalización se utilizó otro programa auxiliar igualmente desarrollado en MATLAB llamado “normalizador”. El programa lee los veinte archivos de cada comando, y encuentra para cada uno de ellos el valor absoluto mayor, el cual se asigna a la variable d. Las muestras del archivo son divididas entre esta variable para llevar la amplitud máxima a 1. Esta modificación se guarda en un archivo “.wav” con el mismo nombre (se sobrescribe). En la Fig. 3.14 se muestra el algoritmo de dicho proceso mediante un diagrama de flujo.

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 46 El código implementado para lograr normalizar los archivos es el siguiente.

Si bien, los programas “grabadora” y normalizador”, no son parte del reconocedor de comandos como tal, sirven para desarrollar con mayor facilidad la base de datos.

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 47 3.2.3.- Segmentación

Debido a que el archivo que se guarda no utiliza en su totalidad los tres segundos de grabación, se decidió segmentarlos. Para eliminar estos espacios de silencio y el poco ruido que pueda existir en ellos, se utilizó un software especializado en la edición de audio digital llamado Audacity.

Para segmentar los archivos es necesario abrirlos dentro del programa, para esto se accede al menú “Archivo” “Abrir…”, tal cual como se puede observar en la Fig. 3.15.

Fig. 3.15.- Modo de abrir un archivo en Audacity.

Una vez abierto el archivo, aparece la forma de onda dentro de la interfaz de trabajo de Audacity, como se muestra en la Fig. 3.16.

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 48 Para segmentar se selecciona con el mouse la parte de la señal que se desea eliminar y se presiona la tecla supr o delete (ver Fig. 3.17).

Fig. 3.17.- Selección de una parte de la señal de onda.

Después de este proceso se obtiene una señal como la mostrada a continuación en la Fig. 3.18.

Fig. 3.18.- Forma de onda después de ser segmentada.

Al final se guarda el archivo con las características de formato anteriormente expuestas. Para realizar esto se accede al menú “Archivo” “Exportar…”.

Este proceso se realiza en las ciento veinte grabaciones, para tener en la base de datos las señales de la manera más limpia y representativa posible. Con este paso, se comprendería en su totalidad el proceso de grabación y edición de la base de datos.

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 49

3.3.- Programación del reconocedor de comandos

En esta sección del desarrollo se explican a detalle las dos secciones del programa que son medulares para el funcionamiento de este: caracterizar y reconocer. Caracterizar se dedica a obtener los promedios de los LPC de cada comando de la base de datos, mientras que reconocer realiza la comparación de estos promedios con la señal de entrada producida por el usuario. A pesar de que el programa contiene otras funciones secundarias, estas no serán explicadas en esta sección, sin embargo pueden encontrarse en el anexo A de esta tesis en el que se presenta el programa completo.

3.3.1.- Caracterizar

La sección caracterizar comienza inicializando dos variables, una que contiene la extensión de los archivos (.wav) y una segunda que corresponderá a la matriz que contenga los promedios de los LPC de la base de datos. Después entra en un ciclo para elegir uno de los seis comandos grabados, en el que por cada ronda que se realice cambiará el comando del que se obtendrá el promedio. Cada ronda el programa preguntará si ya se han obtenido los coeficientes de cada comando. Por ejemplo, suponiendo que fuese la segunda ronda, el programa preguntará si el primer comando obtuvo el promedio de sus LPC, como se han obtenido lo saltará y preguntará lo mismo para el segundo comando, como este no ha pasado por dicho proceso, el programa entrará en una nueva etapa, en la que a la variable

“nom” se le asignará la cadena correspondiente al nombre con el que se guardaron

los archivos de audio para dicho comando. Después ingresará en un nuevo bucle del que no saldrá hasta que no se hayan leído los veinte audios de dicho comando. Para que esto suceda el programa debe de convertir el número de la grabación en una cadena de caracteres para posteriormente concatenarla con las cadenas que contienen la extensión y el nombre del comando. Por dar un ejemplo, en la primera

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 50

ronda del primer comando, el número de la grabación es “1”, este se convierte en cadena y se concatena con las de “ha” y “.wav”, dando como resultado la cadena

“ha1.wav”. Una vez realizada esta concatenación se lee el archivo con dicho

nombre e inmediatamente se obtienen los LPC de dicha señal. Una vez que se han terminado de obtener los LPC de los veinte archivos y se han sumado estos valores en un vector, se le divide a este entre veinte para así obtener el promedio de los LPC del comando. Todo este proceso puede visualizarse en el diagrama de flujo de la Fig. 3.19 a y 3.20 b.

La programación de la función caracterizar está dividida en dos diferentes apartados, cada uno enfocado en una función específica. El primer apartado está dedicado a la inicialización de variables.

La primera línea de este apartado es una asignación directa a una variable, ex=’.wav’, con la que se trabajará después para acceder a todos los archivos de la base de datos mediante un for que será explicado posteriormente.

Las siguientes cuatro líneas corresponden a la inicialización de la matriz que será utilizada durante la obtención de los promedios de LPC de la base de datos. Dicha matriz es handles.prom, con un tamaño de 6 líneas por 19 columnas, que corresponden a los seis comandos y a los diecinueve LPC que se obtendrán de cada archivo. Cabe destacar que se toma la decisión de obtener sólo diecinueve LPC (se pueden obtener tantos como las muestras que se tengan en caso de no ser especificado en el programa), debido a que son estos los de mayor relevancia y los que muestran una mayor cantidad de información, con esto es posible visualizar una mayor diferencia entre los LPC de cada comando lo que hace más sencilla la comparación entre estos. De igual manera es importante agregar que las variables

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 51 (en este caso matrices) del tipo handles pueden utilizarse en todas las secciones del programa y no sólo en la que se está declarando, en este caso se decide esto debido a que la sección reconocer necesita de los datos que se produzcan en caracterizar para realizar las comparaciones pertinentes.

El segundo apartado de caracterizar corresponde a la obtención del promedio de los LPC por comando. Para realizar esto se construyó un for que comprendiera los seis comandos existentes dentro de la base de datos. Donde la variable i representará cada uno de los comandos.

Y una serie de if’s que seleccionan la parte de la base de datos correspondiente a un comando en especifico. Con estos if’s por cada ciclo que se cumpla en el for la cadena de caracteres asignada a la variable nom cambiará y así se asegurará que sólo se le de lectura a los archivos correspondientes a dicho comando.

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 52 Para obtener los LPC de los veinte archivos de cada comando, se creó un for anidado.

Las primeras líneas dentro de este, dan lectura del archivo correspondiente al ciclo. La línea un=num2str (x) convierte a la variable x (que corresponde al número de ciclo), en una cadena de caracteres, para después concatenarla con las variables nom y ex y así poder leer el archivo correspondiente y asignarlo a la variable ar.

Inmediatamente después de darle lectura al archivo, se obtienen sus LPC con la función lpc (ar,18), en donde se especifica que se calcularán sólo dieciocho coeficientes después del primero, que corresponde a la energía (y su valor siempre

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 53 es uno), con lo que se obtienen los diecinueve propuestos desde un principio. Al mismo tiempo estos coeficientes son asignados a la variable coef, como se expresa en la siguiente línea.

La función lpc() trabaja con el método de autocorrelación para obtener la matriz de los coeficientes de un filtro lineal de orden p y esta se resuelve con la recursión de Levinson-Durbin. En la sintaxis, el primer argumento especifica la variable (que contiene las muestras de la señal) a la que se le calculará los LPC, y el segundo especifica el orden del filtro p.

Por último, los LPC del archivo son sumados a la matriz handles.prom (en el vector correspondiente a su comando i).

Una vez que se han sumado los veinte archivos que corresponden al comando en turno, se divide entre veinte el vector correspondiente de la matriz handles.prom, para así, obtener los valores promedio de los LPC de dicho comando.

Con este proceso se obtienen los valores necesarios para poder realizar la comparación entre los LPC de la base de datos, con los de la señal de entrada. Esto se explicará a en la siguiente sección, que corresponde a la función reconocer, en la que se realiza la obtención de los LPC de entrada y la comparación de estos.

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 54 Fig. 3.19.- a) Diagrama de flujo sección caracterizar.

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 55

Fig. 3.19.- b) Complemento del diagrama de flujo sección caracterizar.

3.3.2.- Reconocer

Esta sección del programa es la encargada de realizar el procedimiento de reconocimiento de voz, este se estructura de la siguiente manera. Primero se hace la petición al usuario de que diga el comando que desee activar, posteriormente verifica si la grabación es un silencio o contiene información de voz. Si es el primer caso el programa termina la función, sino se calculan los LPC de la grabación e inmediatamente se hace una comparación de dichos coeficientes con los de la base de datos aplicando el error cuadrático medio. Finalmente, el programa da como resultado el reconocimiento del comando que presenta un menor error. Toda esta

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 56 estructura trabaja a la par con un menú de opciones en forma de árbol que son habilitadas por cada comando. Este menú puede observarse en la Fig. 3.20.

Fig. 3.20.- Menú de opciones en forma de árbol.

Como puede apreciarse, se espera que el código de programación resultará muy extenso. Por otro lado, esta sección es uno de los pilares del programa, así que la explicación de su funcionamiento se realizará a partir de la estructura general (ver Fig. 3.21) en cinco partes: petición y grabación del comando, cálculo de la energía, normalización y cálculo de los LPC, cálculo del error cuadrático medio y la determinación del comando, en donde esta última se incluye la explicación del menú de opciones en forma de árbol.

Fig. 3.21.- Estructura general del proceso de reconocimiento.

3.3.2.1.- Petición y grabación del comando

En esta parte de la sección reconocer, al ser presionado el botón “Reconocer”, el

programa reproducirá un mensaje previamente grabado que dice “ingrese comando después del tono”, siendo la petición del programa al usuario para que este diga el comando deseado. Durante este proceso, el software graba durante cinco segundos en formato .wav monofónico, con una frecuencia de muestreo de 22050 Hz y una tasa de 16 bits la voz del usuario. La razón por la que se graban

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 57 cinco segundos es porque cuando se ejecuta la instrucción sound(), MATLAB continúa con las instrucciones que le siguen, sin esperar a que termine la reproducción, por lo que hay que compensar la duración del mensaje con lo que se desee grabar. En consecuencia, es necesario eliminar las muestras de la grabación que comprenden las muestras del mensaje previamente grabado, para así obtener solamente las muestras de la voz del usuario. Utilizando la función length() es posible determinar el número de muestras del mensaje. Lo descrito anteriormente se aprecia el diagrama de flujo de la Fig. 3.22.

Fig. 3.22.- Diagrama de flujo para la sección de petición y grabación del comando.

El código funciona de la siguiente manera. La primera línea utiliza la función wavread() con el objetivo de asignar las muestras y la frecuencia de muestreo del

mensaje previamente grabado (con el nombre “ingrese.wav”) a las variables

mensaje y fmen respectivamente. Utilizando estas últimas, con la instrucción sound() el mensaje es reproducido. Inmediatamente la función wavrecord() entra en acción con lo que inicia la grabación del comando durante cinco segundos, a una frecuencia de muestreo de 22050 Hz en formato monofónico (5*fmen, fmen,1) y las muestras resultantes son asignadas a la variable mgra. Finalmente mgra es segmentada desde la última muestra del mensaje previamente grabado hasta la última muestra del comando mgra(length(mensaje):5*fmen), posteriormente esta

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 58 modificación es reasignada a mgra. El código que realiza lo anteriormente mencionado es el que sigue:

3.3.2.2.- Cálculo de la energía

Para averiguar si el usuario no ha dicho algún comando y ha guardado silencio, se hará uso de la teoría explicada en la sección 2.4.2.1, en las que se menciona el uso de ventanas para calcular la energía de una señal de voz.

Para esta función, el programa realiza el siguiente proceso. Como en otras secciones del programa, el primer paso es inicializar un grupo de variables para realizar los cálculos pertinentes. En esta ocasión se utilizarán cinco variables:

inc.- Es el punto desde donde inicia la ventana.

delta.- Representa la distancia de traslapamiento que habrá entre cada

ventana.

nvent.- Muestra el número de la ventana en la que se está trabajando.

tvent.- Designa el tamaño de la ventana que se utilizará.

E.- Asignada como el vector que guardará los valores de energía de cada

una de las ventanas.

sum.- Variable a la que se le asignará la suma de los valores de cada

muestra.

Una vez inicializadas estas variables comienza el proceso de ventaneo y cálculo de la energía. Durante este, el programa analiza doscientas cincuenta y seis muestras

Reconocedor automático de comandos por medio del habla para las funciones de un automóvil 59 de la grabación (ventaneo) y por medio de la Ec. 2.12 calcula la energía en dicha ventana, la cual es de tipo rectangular. Este resultado se asigna al vector E que contendrá los valores de energía de cada ventana. Una vez que se hayan analizado todas las muestras de la señal por este método, el programa comparará el resultado con un umbral de energía con valor de 0.01, que produce una señal de silencio o de ruido bajo y basado en esta comparación se determinará si se ha dicho algo o se ha guardado silencio durante el periodo de reconocimiento de comandos. El proceso anterior se explica por medio del diagrama de flujo que se muestra en la Fig. 3.23.

La programación de esta sección se explica a detalle a continuación.

La inicialización de variables corresponde a las primeras cinco líneas del código correspondiente al cálculo de la energía.

La variable inc se inicializa en cero para analizar la señal desde la primera muestra, delta toma el valor de 150, que será la distancia de traslapamiento que existirá entre cada ventana, a nvent se le asigna el valor de 185 pues sólo es necesaria esta cantidad de ventanas para cubrir toda la señal a analizar. Para calcular este valor se realizó la siguiente operación:

Donde:

 El valor 27965 corresponde al total de muestras que comprenden la señal de entrada.

Documento similar