Descripción.
Como requisito de evaluación en la materia de Sistemas Adaptativos, se solicitó la creación de un programa, el cual implemente soluciones eficaces en base a parámetros de entrada, dando como resultado salidas o "respuestas" en base a la lógica del programa.
Los requisitos son los siguientes:
Descarga de la presentación en PDF.
Los requisitos son los siguientes:
- Herramientas a Utilizar.
- Planeación inicial.
- Roles de los integrantes.
En el siguiente documento se encuentra la Primera presentación del proyecto, posteriormente se seguirán subiendo las otras entregas y un video final para mostrar su funcionamiento.
Descarga de la presentación en PDF.
La aplicación consiste en la entrada
de un patrón de voz al sistema, en este caso, para su identificación
con una serie de redes neuronales artificiales; se trata de un
sistema que autentifica si el usuario es Hombre o Mujer. y en base al
resultado, convertir las ondas sonoras en su versión opuesta, si es
Hombre en Mujer (grave – agudo) si es Mujer en Hombre (agudo –
grave) reproduciendo el resultado.(queda pendiente la implementación de esta funcionalidad).
Avance.
Realizamos la investigación de el uso de Redes Neuronales Artificiales con Java para lograr un mejor entendimiento de este tipo de tecnologías, enfocándonos en el uso de Frameworks como JOONE, JCORTEX y JGAP que nos faciliten el uso y creación de la misma. (Decidimos utilizar el Framework Nuroph para crear las Redes Neuronales).
Dentro de la planeación de la estructura, tenemos la idea básica de generar un archivo de audio, el cual sera "obtenido" por el programa y por medio de una simple interfaz le diremos si corresponde al sonido de la voz de un hombre o de una mujer. Después de mínimo 5 interacciones con el sistema, pretendemos que la red neuronal funcione automáticamente y nos arroje el resultado de tipo de voz obtenido, así mismo tendremos la opción de recibir la voz modificada por el programa de tal manera que se escuche el tono de voz inverso (Si es hombre, escuchar la voz de una mujer y viceversa).
Realizamos la investigación de algoritmos de computación de voz como el DTW (Alineamiento Temporal Dinámico) con lo cual pretendemos obtener los resultados más óptimos enfocándonos en la intención de nuestro proyecto.
Se tomara en cuenta otro tipo de algoritmo el de Código de Predicción Lineal LPC, dado que es capaz de extraer la información lingüística
y eliminar la correspondiente a la persona en particular. La predicción lineal modela
la zona vocal humana como una respuesta al impulso infinita, que produzca la señal
de voz.
El término predicción lineal se refiere al método para predecir ó aproximar una
muestra de una señal en el dominio del tiempo s[n] basada en varias muestras
anteriores s[n - 1], s[n - 2], s[n -M].
donde s[n] es llamada señal muestreada, y ai, i = 1,2,...,M son los predictores ó
coeficientes LPC. Un pequeño número de coeficientes LPC a1, a2,...,aM pueden ser usados para representar eficientemente una señal s[n][3,6].
Cabe mencionar que durante nuestra investigación sobre el manejo de voz, encontramos métodos como el MFCC y el MODGDF los cuales están más enfocados a identificar palabras, existe la posibilidad de su uso mas no necesariamente utilizados para nuestro proyecto.
Desarrollo.
Manejo de Archivos de Audio con Java.
Para el manejo de Archivos de Audio con Java, tenemos una librería (javax.sound.sampled) el cual cuenta con métodos que obtienen un archivo de audio (principal mente en formato ".wav").
Un archivo de sonido ".wav" maneja el siguiente formato:
Tipo : PCM_SIGNED
Frecuencia : 16000 Hz
Nº de bits : 16 bit
Sonido : mono
Bytes/Frame : 2 bytes/frame
Utilizando el Software Audacity, podemos copiar un archivo de audio y guardarlo en el formato que queramos(imagen A1, A2), incluso podemos editar el archivo de audio de tal manera que podemos acotar el mismo, quitando el inicio y fin del archivo para poder concentrarnos en la frecuencia de la voz.
Imagen A1
(sonido grabado)
Imagen A2
(Guardando sonido en formato ".wav")
Nota: Es recomendable acotar lo mejor posible los archivos de audio para que, al trabajar con estos, nuestro programa obtenga datos correctos de la señal de voz.
Una vez que tenemos nuestro archivo de audio, creamos un programa que recibe el archivo, lo abre, coloca los bytes del archivo en un vector, lo transforma a "Double" y con estos datos podemos crear una gráfica y por consiguiente observar los patrones del mismo.
Para esto utilizamos un programa en Java que se compone principal mente de 4 clases, las cuales son:
- AdaptaVox.java (Clase principal que contiene el main y obtiene el vector principal del archivo de audio, genera el JFrame, JPanel y JButtons de la aplicación).
- Datos.java (Clase que convierte el array de bytes a double para el manejo de la gráfica).
- Reproducir.java (Clase que recibe el archivo y lo reproduce generando el sonido del mismo).
- GuiSenal.java (Clase que genera la gráfica del sonido).
Como resultado de lo anterior obtenemos una ventana que contiene los botones que ejecutan las acciones de cargar el archivo de audio, generar la gráfica, reproducir el sonido, así como acercarnos o alejarnos en la gráfica para tener una mejor perspectiva de como se comporta el vector del sonido.
Imagen G1
(Pantalla con opciones para carga de sonido, zoom y reproducir).
Imagen G2
(Al presionar el botón "Cargar Sonido" nos muestra la ventana de búsqueda de archivos).
Imagen G3
(Al cargar el archivo, genera la gráfica y reproduce el sonido al mismo tiempo).
Imagen G4
(Haciendo uso del zoom podemos observar detenidamente el comportamiento de la gráfica).
Todo esto es con el fin de tener una visión gráfica de lo que estamos haciendo y hacerlo mas entendible de cara a la parte adaptativa de nuestro proyecto.
Algoritmo para el procesamiento del archivo de sonido.
Como se observa en nuestra gráfica generada en el programa anterior, tenemos el dilema de que la gráfica se dispara sin un limite en especifico que podamos utilizar como base para sacar los valores que ingresaremos en la red neuronal, por lo cual es necesario tomar en cuenta los siguientes aspectos:
- 1.- Aplicar Wavelets/Transformada Rápida de Fourier: Esto con la intención de generar una gráfica con menos ruido, esto quiere decir que buscamos una gráfica con una forma sin tanto escalamiento (Imagen G4). En este caso utilizaremos el API de JWave, que nos da múltiples opciones para transformar un arreglo de tipo de dato "Double".(agregamos el siguiente codigo en la clase "GuiSenal.java")
- 2.- Normalizar la Muestra: Consiste en ajustar los parámetros a una sola escala para que, al momento de ser utilizados por la Red Neuronal, sea mas sencillo hallar aproximaciones al entrenamiento de esta. Basta con tener el Máximo valor y en Mínimo para realizar la Normalización de la muestra; con esto tenemos la ventaja de que nuestro rango máximo y mínimo en la muestra queda entre 0 y 1, de esta manera, la red neuronal puede trabajar de mejor forma evitando problemas con desbordamientos de números. En caso de no estar familiarizados con la normalizacion, es sencillo obtener información y formulas de fácil manejo en internet.
- 3.- Toma de muestras en secciones del Archivo de Audio: Esto con la intención de enviar N muestras a la red neuronal y que esta la procese para así poder generar un resultado en base a lo ingresado. Existen métodos como el LPC (Código de Predicción Lineal) que sirve para determinar si el patrón de voz corresponde a una persona en especifico, basándonos en este, realizaremos el muestreo con el cuál entrenaremos la Red Neuronal y así mismo, sera el método que utilizaremos para enviar las entradas a la Red Neuronal.(Pretendemos utilizar N neuronas en base a las N muestras y obtener una sola salida).
Creación de la Red Neuronal Artificial.
Para la Red Neuronal, utilizaremos una API en Java de nombre Neuroph, el cual contiene muchas clases que utilizan varios tipos de "Neuronas Artificiales", en nuestro caso uilizaremos el Backpropagation, el cual se compone de la siguiente manera:
Un ejemplo utilizado el la documentación de Neuroph nos sera de mucha utilidad para crear nuestra clase que puede ser modificada en abse a lo que especifiquemos (anexo codigo modificado según nuestras necesidades).
Actualmente ya implementamos el botón de nombre ("Determinar Sexo") el cual crea el llamado al metodo dentro del archivo "AdaptaVox.java" para genera un pop-up que nos dice el resultado obtenido.
Problemas a la Fecha.
- El wavelet no esta generando el resultado esperado, o al menos no es visible. Indagareos más en la funcionalidad del framework buscando solucionar esto o, en su defecto, crear nuestro propio wavelet e implementarlo.
- Entrenamiento de la Red Neuronal. Se tenia pensado para detectar dos sexos, pero haciendo del problema algo más sencillo, podemos crear un solo entrenamiento para detectar solo un tipo de voz (de Mujer o de Hombre) y en caso de que la red neuronal no de positivo, sera su contrario automático.
- Cantidad de Neuronas a utilizar. Si tenemos muchas, el proceso podría ser muy tedioso, y si tenemos pocas, puede que el resultado no sea el correcto, así que en base a la investigación que realizamos, tendremos que hacer varias sesiones de prueba y error.
- Tamaño de las muestras. Podemos tomar una muestra del array en cualquier sección, por esto crearemos una mejor abstracción del archivo buscando encontrar los picos mas notorios en el mismo para que la red neuronal tenga un margen de error menor.
- Cantidad de archivos de audio a utilizar para el correcto entrenamiento. Se pretenden utilizar 5 muestras de voz de un mismo sexo pero existe la posibilidad de utilizar más en base a resultados obtenidos.
Recursos.
Lenguaje de Programación, Librerias, API's y Frameworks.
NOTA: Las versiones del desarrollo de la aplicación pueden ser vistas en el repositorio GitHub en la siguiente dirección: https://github.com/marioalverto/AdaptaVox.git
Lenguaje de programación:
- Java 2SE
Librerías:
Software:
- Audacity (Software de edición de Sonido).
- SublimeText 2 (editor de texto enfocado a la programación).
- Eclipse (IDE para programar).
Libros:
- Java Como programar 7ª Edición, por Deitel
- Tratamiento Digital de voz e imagen y aplicación a la multimedia, por Marcos Faúndez
Internet:
- Speech recognition (Reconocimiento del habla).
- Transformada rápida de Fourier
- TalkingJava SDK
- Lectura y Graficación de Señales de Audio con Java
La aplicación consiste en la entrada
de un patrón de voz al sistema, en este caso, para su identificación
con una serie de redes neuronales artificiales; se trata de un
sistema que autentifica si el usuario es Hombre o Mujer. y en base al
resultado, convertir las ondas sonoras en su versión opuesta, si es
Hombre en Mujer (grave – agudo) si es Mujer en Hombre (agudo –
grave) reproduciendo el resultado.(queda pendiente la implementación de esta funcionalidad).
Avance.
Realizamos la investigación de el uso de Redes Neuronales Artificiales con Java para lograr un mejor entendimiento de este tipo de tecnologías, enfocándonos en el uso de Frameworks como JOONE, JCORTEX y JGAP que nos faciliten el uso y creación de la misma. (Decidimos utilizar el Framework Nuroph para crear las Redes Neuronales).
Dentro de la planeación de la estructura, tenemos la idea básica de generar un archivo de audio, el cual sera "obtenido" por el programa y por medio de una simple interfaz le diremos si corresponde al sonido de la voz de un hombre o de una mujer. Después de mínimo 5 interacciones con el sistema, pretendemos que la red neuronal funcione automáticamente y nos arroje el resultado de tipo de voz obtenido, así mismo tendremos la opción de recibir la voz modificada por el programa de tal manera que se escuche el tono de voz inverso (Si es hombre, escuchar la voz de una mujer y viceversa).
Se tomara en cuenta otro tipo de algoritmo el de Código de Predicción Lineal LPC, dado que es capaz de extraer la información lingüística y eliminar la correspondiente a la persona en particular. La predicción lineal modela la zona vocal humana como una respuesta al impulso infinita, que produzca la señal de voz.
El término predicción lineal se refiere al método para predecir ó aproximar una
muestra de una señal en el dominio del tiempo s[n] basada en varias muestras
anteriores s[n - 1], s[n - 2], s[n -M].
donde s[n] es llamada señal muestreada, y ai, i = 1,2,...,M son los predictores ó
coeficientes LPC. Un pequeño número de coeficientes LPC a1, a2,...,aM pueden ser usados para representar eficientemente una señal s[n][3,6].
Cabe mencionar que durante nuestra investigación sobre el manejo de voz, encontramos métodos como el MFCC y el MODGDF los cuales están más enfocados a identificar palabras, existe la posibilidad de su uso mas no necesariamente utilizados para nuestro proyecto.
Desarrollo.
Manejo de Archivos de Audio con Java.
Para el manejo de Archivos de Audio con Java, tenemos una librería (javax.sound.sampled) el cual cuenta con métodos que obtienen un archivo de audio (principal mente en formato ".wav").
Un archivo de sonido ".wav" maneja el siguiente formato:
Tipo : PCM_SIGNED
Frecuencia : 16000 Hz
Nº de bits : 16 bit
Sonido : mono
Bytes/Frame : 2 bytes/frame
Utilizando el Software Audacity, podemos copiar un archivo de audio y guardarlo en el formato que queramos(imagen A1, A2), incluso podemos editar el archivo de audio de tal manera que podemos acotar el mismo, quitando el inicio y fin del archivo para poder concentrarnos en la frecuencia de la voz.
Imagen A1
(sonido grabado)
Imagen A2
(Guardando sonido en formato ".wav")
Nota: Es recomendable acotar lo mejor posible los archivos de audio para que, al trabajar con estos, nuestro programa obtenga datos correctos de la señal de voz.
Una vez que tenemos nuestro archivo de audio, creamos un programa que recibe el archivo, lo abre, coloca los bytes del archivo en un vector, lo transforma a "Double" y con estos datos podemos crear una gráfica y por consiguiente observar los patrones del mismo.
Para esto utilizamos un programa en Java que se compone principal mente de 4 clases, las cuales son:
- AdaptaVox.java (Clase principal que contiene el main y obtiene el vector principal del archivo de audio, genera el JFrame, JPanel y JButtons de la aplicación).
- Datos.java (Clase que convierte el array de bytes a double para el manejo de la gráfica).
- Reproducir.java (Clase que recibe el archivo y lo reproduce generando el sonido del mismo).
- GuiSenal.java (Clase que genera la gráfica del sonido).
Como resultado de lo anterior obtenemos una ventana que contiene los botones que ejecutan las acciones de cargar el archivo de audio, generar la gráfica, reproducir el sonido, así como acercarnos o alejarnos en la gráfica para tener una mejor perspectiva de como se comporta el vector del sonido.
Imagen G1
(Pantalla con opciones para carga de sonido, zoom y reproducir).
Imagen G2
(Al presionar el botón "Cargar Sonido" nos muestra la ventana de búsqueda de archivos).
Imagen G3
(Al cargar el archivo, genera la gráfica y reproduce el sonido al mismo tiempo).
Imagen G4
(Haciendo uso del zoom podemos observar detenidamente el comportamiento de la gráfica).
Todo esto es con el fin de tener una visión gráfica de lo que estamos haciendo y hacerlo mas entendible de cara a la parte adaptativa de nuestro proyecto.
Un ejemplo utilizado el la documentación de Neuroph nos sera de mucha utilidad para crear nuestra clase que puede ser modificada en abse a lo que especifiquemos (anexo codigo modificado según nuestras necesidades).
Actualmente ya implementamos el botón de nombre ("Determinar Sexo") el cual crea el llamado al metodo dentro del archivo "AdaptaVox.java" para genera un pop-up que nos dice el resultado obtenido.Algoritmo para el procesamiento del archivo de sonido.
Como se observa en nuestra gráfica generada en el programa anterior, tenemos el dilema de que la gráfica se dispara sin un limite en especifico que podamos utilizar como base para sacar los valores que ingresaremos en la red neuronal, por lo cual es necesario tomar en cuenta los siguientes aspectos:- 1.- Aplicar Wavelets/Transformada Rápida de Fourier: Esto con la intención de generar una gráfica con menos ruido, esto quiere decir que buscamos una gráfica con una forma sin tanto escalamiento (Imagen G4). En este caso utilizaremos el API de JWave, que nos da múltiples opciones para transformar un arreglo de tipo de dato "Double".(agregamos el siguiente codigo en la clase "GuiSenal.java")
- 2.- Normalizar la Muestra: Consiste en ajustar los parámetros a una sola escala para que, al momento de ser utilizados por la Red Neuronal, sea mas sencillo hallar aproximaciones al entrenamiento de esta. Basta con tener el Máximo valor y en Mínimo para realizar la Normalización de la muestra; con esto tenemos la ventaja de que nuestro rango máximo y mínimo en la muestra queda entre 0 y 1, de esta manera, la red neuronal puede trabajar de mejor forma evitando problemas con desbordamientos de números. En caso de no estar familiarizados con la normalizacion, es sencillo obtener información y formulas de fácil manejo en internet.
- 3.- Toma de muestras en secciones del Archivo de Audio: Esto con la intención de enviar N muestras a la red neuronal y que esta la procese para así poder generar un resultado en base a lo ingresado. Existen métodos como el LPC (Código de Predicción Lineal) que sirve para determinar si el patrón de voz corresponde a una persona en especifico, basándonos en este, realizaremos el muestreo con el cuál entrenaremos la Red Neuronal y así mismo, sera el método que utilizaremos para enviar las entradas a la Red Neuronal.(Pretendemos utilizar N neuronas en base a las N muestras y obtener una sola salida).
Creación de la Red Neuronal Artificial.
Para la Red Neuronal, utilizaremos una API en Java de nombre Neuroph, el cual contiene muchas clases que utilizan varios tipos de "Neuronas Artificiales", en nuestro caso uilizaremos el Backpropagation, el cual se compone de la siguiente manera:
Para la Red Neuronal, utilizaremos una API en Java de nombre Neuroph, el cual contiene muchas clases que utilizan varios tipos de "Neuronas Artificiales", en nuestro caso uilizaremos el Backpropagation, el cual se compone de la siguiente manera:
Problemas a la Fecha.
- El wavelet no esta generando el resultado esperado, o al menos no es visible. Indagareos más en la funcionalidad del framework buscando solucionar esto o, en su defecto, crear nuestro propio wavelet e implementarlo.
- Entrenamiento de la Red Neuronal. Se tenia pensado para detectar dos sexos, pero haciendo del problema algo más sencillo, podemos crear un solo entrenamiento para detectar solo un tipo de voz (de Mujer o de Hombre) y en caso de que la red neuronal no de positivo, sera su contrario automático.
- Cantidad de Neuronas a utilizar. Si tenemos muchas, el proceso podría ser muy tedioso, y si tenemos pocas, puede que el resultado no sea el correcto, así que en base a la investigación que realizamos, tendremos que hacer varias sesiones de prueba y error.
- Tamaño de las muestras. Podemos tomar una muestra del array en cualquier sección, por esto crearemos una mejor abstracción del archivo buscando encontrar los picos mas notorios en el mismo para que la red neuronal tenga un margen de error menor.
- Cantidad de archivos de audio a utilizar para el correcto entrenamiento. Se pretenden utilizar 5 muestras de voz de un mismo sexo pero existe la posibilidad de utilizar más en base a resultados obtenidos.
Recursos.
Lenguaje de Programación, Librerias, API's y Frameworks.
NOTA: Las versiones del desarrollo de la aplicación pueden ser vistas en el repositorio GitHub en la siguiente dirección: https://github.com/marioalverto/AdaptaVox.git
Lenguaje de programación:
- Java 2SE
Librerías:
Software:
- Audacity (Software de edición de Sonido).
- SublimeText 2 (editor de texto enfocado a la programación).
- Eclipse (IDE para programar).
- Java Como programar 7ª Edición, por Deitel
- Tratamiento Digital de voz e imagen y aplicación a la multimedia, por Marcos Faúndez
- Speech recognition (Reconocimiento del habla).
- Transformada rápida de Fourier
- TalkingJava SDK
- Lectura y Graficación de Señales de Audio con Java
OK. Suena muy interesante el proyecto; vayan checando las librerías/paquetes que utilizarán para el mismo (procesamiento de audio, redes neuronales).
ResponderEliminarPropuesta--50
Planeación y roles--30
Recursos--10
Organización--5
========================
Total: 100 (5 de 5)