Manipulación del sonido en Java

Hola, soy nuevo aquí y espero me puedan ayudar. No soy muy experto en Java, pero si me gustaría aprender. Tengo un proyecto en mi facultad de Inteligencia Artificial el cual debo de desarrollar un programa que una persona al cantar ese sistema me arroje qué tono esta cantando. La cosa es que como no soy muy experto en Java no entiendo muchas cosas. Alguien me puede ayudar diciendome qué debo de buscar y que paquetes usar? se los agradecería mucho para ver qué me pude ayudar.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Re: Manipulación del sonido en Java

Primero deberás entender la naturaleza del problema que deseas entender y conceptualizar el modelo que lo representa. Después sólo deberás traducirlo a Java.

Saludos

Javier

Ok, ese paso si lo entiendo

Ok, ese paso si lo entiendo y al parecer todo va con la frecuencia que emite el sonido, ahora ya tengo la idea de que debo usar el Java Media Framework, ya lo instale y ahora no puedo instalar las librerías a NetBeans, alguien sabe como transportar las librerías?

Imagen de iberck

Java speech

Tal vez lo que necesitas es java speech

Imagen de ezamudio

no es speech

No tiene que reconocer palabras y de hecho sospecho que ni siquiera tiene que reconocer voz, simplemente la frecuencia que capta el microfono. Similar a los programas para afinar instrumentos; puedes tocar la guitarra o cantar una nota y te dan la frecuencia (y segun la frecuencia se traduce a una nota y que tan bien o mal afinada esta segun se aproxima a la nota exacta).

Buenos datos

lLo que dice ezamundio es muy cierto, mi proyecto no debe reconocer las palabras y es buen punto lo que maneja: "No reconoce la voz, sino solo la frecuencia!" no me habia puesto a ver en algo muy simple y obvio. el Speech me sería util si en algun momento dijiera que el programa identificará la afinacion y además la dicción de la letra de la canción, pero creo que sigo en pie de utilizar el JMF, de lo que eh buscado es lo más proximo a utilizar. Si alguien tiene una herramienta que me ayude de mejor forma le agradecería la ayuda.

Imagen de ezamudio

JMF...

Ya viste si tiene directamente algo que te diga la frecuencia en Hz? En internet encuentras tablas de conversión para saber qué frecuencia tienen las notas, por ejemplo La medio es 440Hz, etc. Pero sospecho que no vas a encontrar directamente un método o algo que te diga la frecuencia del audio en Hertz. Según yo, lo que necesitas hacer es grabar un poco de audio en memoria, una muestra corta (medio segundo o hasta menos) y analizarla para mostrar en pantalla la frecuencia que estás captando. Eso suponiendo que sea una sola frecuencia; si hay varias personas hablando no vas a poder decir todas las frecuencias que oyes. No sé bien cómo se tenga que hacer eso pero seguramente es pura conversión de números porque el audio ya sabes que normalmente lo obtienes por samples por ejemplo de 16bits a 44.1KHz, eso significa que se digitaliza el audio del micrófono, en muestras de 16 bits, 44 mil 100 veces por segundo. Cada muestra es un número de 16 bits, por lo que un segundo de audio monaural mide 88200 bytes (en stereo es el doble porque son dos canales). Para tu aplicación basta con que grabes en monaural (realmente captas audio nada más pero pues se va a digitalizar y lo vas a almacenar en un buffer pequeño en memoria, así que estás grabando realmente). Y cada número de 16 bits te indica la posición de la onda de sonido en el momento en que fue tomada la muestra. Esto se llama Pulse-Code Modulation.

A partir de eso y algunos otros parámetros podrás determinar la frecuencia del sonido; una onda de audio muy "pareja" (un sonido constante, como una voz haciendo "aaaaaaaa" en la misma nota todo tlempo), va a darte una onda regular; si cuentas el número de crestas y valles que tenga esa onda en un segundo, tienes la frecuencia de la misma. Para saber el número de crestas y valles tienes que ir analizando esos números de 16 bits, pero considera que un hertz es un ciclo por segundo (una cresta, un valle) y en un segundo de audio digital en calidad CD tienes 44mil números de 16 bits.

Gracias!

Muchas gracias por la explicación, entonces ahora me dedicaré a buscar una clase que tenga esta función que me regrese directamente la frecuencia y hacer la converción directamente y como me dices tengo que utilizar la grabación monaural.

Imagen de ezamudio

Todo el punto

Creo que el punto del ejercicio es precisamente hacer el algoritmo que analice el audio y detecte la frecuencia. Si nada más lo buscas y lo copias, ya no aprendiste nada (y por lo que dice tu post original, me parece que es un ejercicio para una clase en la universidad). Los frameworks que tengas que usar y lo que tengas que hacer para grabar el audio usando Java es la talacha solamente.

Si encuentras código que haga eso y es software libre, recuerda respetar la licencia y darle crédito al autor en tu proyecto.

de nuevo gracias!

Si entiendo que es talacha, y solo quería algo de referencia, cualquier cosa que tenga duda vuelvo a publicar, pero de ahora en adelante queda practicar, investigar y programar. Saludos!

Re: de nuevo gracias!

Si entiendo que es talacha, y solo quería algo de referencia

Qué bueno que ya quedó más claro. Pero basado en la experiencia con un amigo que hizo un software para pruebas de audiometría con Java permítaseme insistir en que es importante entender la "naturaleza" o dominio del problema. Documéntate sobre acústica en general. Profundiza en los intensidad, tono y timbre. La excelente explicación de ezamudio acerca de modulación, frecuencias etc. es el desglose de un modelo que representa al sonido (no es el sonido en sí mismo).

Si tu trabajo es para la materia de inteligencia artificial, tal vez el tema no es tanto que programes el modelo que representa el tono, sino la asignación, hasta cierto punto arbitraria, de una posición dentro de una escala, esto es, aunque un tono puede medirse, esta medición no es 100% "objetiva".

Lo importante: no es un tema de Java (ni de manipulación de sonido). Comprende el dominio y el modelo y aquí te podemos ayudar a traducirlo a Java.

Saludos

Javier Castañón

Imagen de javamx

ya vi saludos y gracias

saludos

off-topic

para el amigo que abrio el post, ¿en donde estas estudiando?, me interesa ya que quiero estudiar la maestria en inteligencia artificial pero hasta ahora tengo pocas opciones realmente buenas