Búscalo aquí:

Lectura y graficación de señales de audio en Java [código]

El Procesamiento Digital del Habla es un tipo de procesamiento digital de señales que se encarga del tratamiento de las señales de audio. De esta manera, una palabra o una conversación que sea grabada y digitalizada, puede ser procesada para por ejemplo, poder reconocer y aislar las palabras que se encuentan en dicha grabación, para reconocer que palabras son, para poder comprimirlas y evitar que ocupen demasiado espacio de almacenamiento, entre otras aplicaciones.


Para llevar a cabo el procesamiento digital de las señales de habla, el primer paso que debemos realizar, una vez capturada y digitalizada la señal de habla (o señal de voz) que deseamos procesar, es leer dicha señal para poder graficarla. La graficación de una señal es muy importante puesto que nos permitirá observar los patrones que sigue la señal de habla, así como también, los cambios surgidos en ella debido al procesamiento que realicemos.

En este post compartiré con ustedes el código fuente en Java para la lectura de un archivo de audio y su graficación. Lo primero que debemos tener en cuenta son las especificaciones y o características de los audios a procesar. Debido a que este trabajo se realizó con fines de investigación y no comerciales se optó por el uso de archivos en formato WAV (Waveform audio format), de esta manera, un archivo de audio en formato .wav a procesar deberá tener el siguiente formato:

tipo : PCM_SIGNED
frecuencia : 16000 Hz
nº de bits : 16 bit
sonido : mono
bytes/frame: 2 bytes/frame

Pueden descargar el archivo dominaiting.wav y hacer sus pruebas.

Ahora, el archivo de audio que deseam0s procesar deberá ser leido. La representación de dicho archivo de audio será un vector de elementos de tipo double, el cual contiene los valores de amplitud de un determinado audio y será definido como atributo en la clase principal de la siguiente manera: private double[] datosVoz = null;

Luego, en la clase principal colocamos un menu para la lectura de archivos de audio .wav, el código fuente en Java para que dicho menu realice la lectura de un archivo de audio y obtenga su equivalente al vector de audio, es el siguiente:

  1. private void menuAbrirActionPerformed(java.awt.event.ActionEvent evt) {
  2. if (evt.getSource() == menuAbrir)
  3. {
  4. int valorRetorno = fc.showOpenDialog(null);
  5. if (valorRetorno == JFileChooser.APPROVE_OPTION)
  6. {
  7. File archivoEntrada = fc.getSelectedFile();
  8. rutaAudio = archivoEntrada.getPath();
  9. System.out.println("Ruta del audio = "+rutaAudio);
  10. int totalFramesLeidos = 0;
  11. int totalBytesLeidos = 0;
  12. /* 1. flujoEntradaAudio
  13. El objeto flujoEntradaAudio trata el archivo de entrada como un
  14. archivo de audio y es util para establecer y leer propiedades
  15. de los archivos de audio
  16. 2. los archivos de audio se guardan con unidades minimas llamadas
  17. frames, el valor de cada frame determina la amplitud del sonido,
  18. un frame puede tener 1 byte 2 bytes 4 bytes, etc
  19. 3. se utilizara un buffer especificado por el arreglo audioBytes
  20. para leer los datos del archivo de audio a memoria
  21. */
  22. try
  23. {
  24. AudioInputStream flujoEntradaAudio =
  25. AudioSystem.getAudioInputStream(archivoEntrada);
  26. int bytesPorFrame = flujoEntradaAudio.getFormat().getFrameSize();
  27. int numBytes = 1024 * bytesPorFrame;
  28. byte[] audioBytes = new byte[numBytes];
  29. // longitud de archivo de audio en bytes
  30. int longitudArchivoBytes=
  31. (int)flujoEntradaAudio.getFormat().getFrameSize()*
  32. (int)flujoEntradaAudio.getFrameLength();
  33. // objeto datos mas informacion ver clase Datos.java
  34. Datos datos = new Datos(longitudArchivoBytes,
  35. flujoEntradaAudio.getFormat().isBigEndian());
  36. //arreglo temporal de bytes
  37. byte[] datosTemporal=new byte[longitudArchivoBytes];
  38. int pos=0;
  39. //procedimiento que lee los bytes del archivo de audio a memoria
  40. try
  41. {
  42. int numeroBytesLeidos = 0;
  43. int numeroFramesLeidos = 0;
  44. while((numeroBytesLeidos=flujoEntradaAudio.read(audioBytes))!=-1)
  45. {
  46. numeroFramesLeidos = numeroBytesLeidos/bytesPorFrame;
  47. totalFramesLeidos += numeroFramesLeidos;
  48. System.arraycopy(audioBytes, 0, datosTemporal,
  49. pos, numeroBytesLeidos);
  50. pos=pos+numeroBytesLeidos;
  51. }
  52. datos.llenarByte(datosTemporal);
  53. /* datosVoz : contiene los valores de amplitud del archivo de
  54. audio es decir nuestros algoritmos de procesamiento digital
  55. de voz lo haremos en este arreglo
  56. */
  57. datosVoz=new double[longitudArchivoBytes/bytesPorFrame];
  58. datosVoz=datos.convertirByteADouble();
  59. //preparamos para graficar la señal de audio en el panel
  60. graficarSeñal();
  61. //obtenemos informacion del archivo de las propiedades
  62. //del archivo de audio
  63. Informe = "";
  64. Informe+="Abriendo: "+archivoEntrada.getName()+".\n";
  65. Informe+="Ruta: "+rutaAudio+"\n\n";
  66. Informe+=" NroBytes Frames BigEndian \n";
  67. Informe+=" "+longitudArchivoBytes+" "+
  68. flujoEntradaAudio.getFrameLength()+" "+
  69. flujoEntradaAudio.getFormat().isBigEndian()+" \n";
  70. Informe+="\n Formato: "+flujoEntradaAudio.getFormat().toString();
  71. Informe+="\n\n Tamaño del arreglo: "+datosVoz.length+"\n";
  72. //hallamos la frecuencia de sampleo
  73. FrecuenciaDeSampleo=
  74. (int)flujoEntradaAudio.getFormat().getSampleRate();
  75. Informe+=" Frecuencia de sampleo: "+FrecuenciaDeSampleo+"m/s\n";
  76. audioR = new Reproducir(rutaAudio);
  77. audioR.playAudio();
  78. }
  79. catch (Exception ex)
  80. {
  81. Informe = "No se pudo leer \n";
  82. }
  83. }
  84. catch (Exception e)
  85. {
  86. Informe = "Tipo incompatible\n";
  87. }
  88. }
  89. else
  90. {
  91. Informe = "Acción de abrir cancelada por el usuario\n";
  92. }
  93. }
  94. }


Los paquetes de Java que se deben importar son:

import java.awt.*;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.io.*;
import javax.sound.sampled.*;
import javax.swing.*;
import Audio.*;


La variable Informe, es una variable de tipo String que almacena la información de las propiedades del archivo de audio leido.

La variable datos es de tipo Datos y se usa para obtener el vector de los elementos de amplitud de un archivo de audio. El código fuente en Java de la clase Datos se encuentra en el post: Obtener el vector de amplitud de una señal de audio.

La variable audioR es de tipo Reproducir y se encargará de la reproducción sonora del archivo leido. El código fuente en Java de la clase Reproducir se encuentra en el post: Reproducir Audio en Java.

Finalmente, el método llamado para realizar la graficación es graficarSeñal() y se encuentra tambien en la clase principal, y su código es el siguiente:

  1. private void graficarSeñal()
  2. {
  3. //graficamos en el panel principal
  4. panelSeñal.setDatosVoz(datosVoz);
  5. panelSeñal.setAccionGraficar(true);
  6. panelSeñal.setGraficarOnda(!panelSeñal.getGraficarOnda());
  7. panelSeñal.setIntervalo((finterv*datosVoz.length)/Grafico.getWidth());
  8. panelSeñal.setFactorEX(fex);
  9. panelSeñal.setFactorEY(fey);
  10. panelSeñal.setTY(0);
  11. panelSeñal.repaint();
  12. }

Donde panelSeñal es una variable de tipo GuiSeñal. El código fuente de la clase GuiSeñal lo pueden encontrar en el post: Graficar una señal de audio en coordenadas de dispositivo.

De esta manera, las variables que usaremos en la clase principal son:

private double[] datosVoz = null; //vector de amplitud de la señal
private double fex; //factor de escalamiento en las abscisas
private double fey; //factor de escalamiento en las coorenadas
private int FrecuenciaDeSampleo; //frecuencia de muestras de la señal
private int finterv; //factor de intervalo de muestreo de la señal
private String Informe; //informacion de las propiedades de la señal
private String NameAudio; //nombre del archivo de audio
private String rutaAudio; //ruta del archivo de audio
private GuiSeñal panelSeñal; //JPanel para la graficación

Finalmente, los resultados se podrán observar de la siguiente manera:


Y la visualización de sus propiedades:


Una vez construido este entorno básico, se podrán realizar sobre el cualquier tipo de métodos de procesamiento digital de audio y visualizar los resultados que se obtengan.

Si deseas enterarte y/o conocer más sobre el área de Procesamiento Digital del Habla sigue este blog en su TEMA de Procesamiento Digital del Habla. Espero que les sea de mucha utilidad, saludos.


Quieres leer más post como éste???...suscribete aquí!!!

93 comentarios:

  1. Hola, he realizado una aplicacion en java donde capturo sonido atraves de un microfono y tengo por objetivo convertir dicho sonido en un arreglo de Bytes, la función que provees en este post realiza esta tarea? o hay una restricción para el formato de audio??

    ResponderEliminar
  2. PCM [pulse code modulation] es un mecanismo que se usa simplemente para volcar las muestras de una señal de audio como llegan, en un arreglo de bytes

    ResponderEliminar
  3. El método que se muestra en este post realiza la tarea de conversión de los elkementos de sonido (de un archivo de audio) a un arreglo de bytes (posteriormente ese arreglo de bytes es convertido a un areglo de doubles).

    El método es independiente al formato de audio. En este post estoy usando archivos de tipo WAV que es un formato sencillo provisto por Microsoft que almacena las muestras usando un mecanismo que se llama PCM [pulse code modulation].

    Si tu aplicación lee los audios en un formato no soportado por Java, tal vez ahi pueda surgir el problema, pues el método que presento se encarga de convertir a Bytes la señal de audio ya leida,

    WinZor, espero te sea de utilidad a ti y a todos los lectore, saludos.

    ResponderEliminar
  4. Hola que tal buen dia.

    Quisiera hacerte una consulta, respecto al codigo que tenes subido en tu blog para el procesamiento digital de señales. Te paso a comentar:

    Lo que yo hago es crear un JFrame al cual le hago un menu y le agrego una componete GuiSeñal (para ver laonda), el temaes ques me abre el archivo...pero en el momento de graficar (utilizo el codigo que esta en tu blog) no me grafica nada y prosigue con la ejecucion de las instrucciones, finalizando con la reproduccion del archivo de audio (un .WAV). Si me podrias decir en que estoy fallando, ya que solo utilizo el codigo que vos creaste para el manejo del sonido y para graficarlo, te estaria muy agradecido.

    ResponderEliminar
  5. Hola Manuel, debes de asegurarte que el archivo de audio este en el formato WAV y con las características que menciono en este post. Si el formato del audio es el corecto, entonces asegurate de estar haciendo la conversión de la señal de audio a su señal digital (valores de amplitud de la onda) que muestro en este post. si todo eso se encuentra bien, entonces tal vez tu error se encuentra en el módulo de graficación, asegurate de seguir los pasos dados en este post y de actualizar (con repaint) cada vez que ordenes graficar la onda.

    Espero haber podido ayudarte, saludos

    ResponderEliminar
  6. Hola, estoy intentando hacer funcionar el código completo que facilitas, pero se ve que al pegarlos al web faltó algo. Me salen muchos errores, ¿hay alguna posibilidad de que me mandes los ficheros en una carpeta y funcionando? MIL GRACIAS. Estoy muy interesado en tenerlos.

    ResponderEliminar
  7. Se me olvidó poner el mail, por si pudieses mandarlo: victorfdezbau@gmail.com
    Gracias de nuevo

    ResponderEliminar
  8. Saludos, el código que adjunto es el necesario para lograr la lectura y graficación de un archivo de audio y su respectiva señal, el código a sido implementado y testeado, si te aparecen algunos errores, deben referirse a la integración entre tu interfaz y el código que adjunto, dependerá de los componentes que estes usando, saludos

    ResponderEliminar
  9. Buenas, ¿podrías facilitar la declaración de "menuAbrir", "fc", "Grafico" y "audioR"? Gracias.

    ResponderEliminar
  10. Saludos, menuAbrir es un JButton, fc es un JFileChooser, Grafico es un JPanel contenedor del panel en el que se monta la onda a graficar; todos estos elementos son componentes de interfaz.

    Por otro lador, audioR es un elemento de tipo Reproducir que se define en la clase Reproducir. Espero este claro, saludos

    ResponderEliminar
  11. Gracias por tu respuesta, ya he logrado hacer que ande el programa con tu codigo, desde ya muchas gracias

    Saludos

    Manuel

    ResponderEliminar
  12. Saludos,
    la variable finterv, del método graficarSeñal(), tiene el valor de 0. Por lo que obseve no cambia este valor en ninguna parte del código.Y por lo tanto el valor enviado en la linea 7 a panelSeñal.seIntervalo es siempre 0, es asi como debe ser?, o debo modificar el valor de la variable en alguna parte del código.

    Agradeciendo tu colaboración me despido.

    ResponderEliminar
  13. En la clase en la que se encuentra tu interfaz, al crear el JPanel debes de capturar el ancho y alto respectivamente del panel sobre el cual se realizará la graficación, esos valores debes de enviarlos como parametros a estas funciones que mencionas, saludos

    ResponderEliminar
  14. Disculpa no entiendo a que se refiere el Factor de intervalo de muestreo de la señal (finterv), a que es igual , como calculo estew valor?, y tb a que se refire fex (facor de escalamiento de las abscisas)y fey (factor de escalamiento de coordenadas) y como se calculan.
    Muchisimas gracias por la colaboración!!

    ResponderEliminar
  15. El factor de intervalo de muestreo (finterv) indica cada que cantidad de muestras se tomará una muestra, por ejm, si mi factor de intervalo es 5, tomo una muestra en la posicion i y la siguiente muestra es al de la psoición i+5.

    El factor de escalamiento de abscisas (fex) es un valor que indica que tan separados estarán las posiciones de las coordenadas en el eje de las abscisas (X's), entre mas pequeño sea este valor, la señal se verá mas pegada (angosta), entre más grande sea este valor, la señal se verá mas ancha.

    De manera similar para el factor de escalamiento de las ordenadas (fey)

    Saludos

    ResponderEliminar
  16. hola ...porfavor podria alguien ayudarme ....donde declaro o q es graficarPeriodo y colorPitch q no me reconose... garcias

    ResponderEliminar
  17. Esas son variables que para esta primera parte no se usarán, lo que puedes hacer es eliminarlas (junto con todas las referencias que se le hagan) o simplemente comentarlas.

    ResponderEliminar
  18. hola de nuevo ..... la primera parte del programa(private void menuAbrirActionPerformed)
    va en clase main...o tengo q crear otra clase porq ....me sale un error (ilegal inicio de expresion)...

    ResponderEliminar
  19. Hola, la función menuAbrirActionPerformed puede ir dónde tu gustes, si te percatas el parámetro es un evento: java.awt.event.ActionEvent evt, puesto que en mi caso, coloco un menu desde donde puedo elegir el archivo de audio que deseo leer. Ese evento se activa cuando se accede a dicho menu, para luego capturar la ruta del archivo de audio a procesar.

    Si deseas abstraer esta parte, puedes oviar eso, colocando directamente la ruta del audio que procesaras en la variable rutaAudio.

    Saludos.

    ResponderEliminar
  20. Hola tengo un proyecto en la escuela donde basicamente tengo que hacer una aplicacion que modifique la voz de entrada por medio de un microfono, es decir, que entre la voz de un adulto y salga la de una niño, todo esto en java, estoy utilizando la API de JavaSound y ya tengo la senial muestreada ( que es una arreglo de bytes)ahora es cuention de sacar el espectro de freciencias para poder desplazarlo segun he investigado, alguien sabe como hacer esto... como graficar el espectro de frecuencias si bien se que es la magnitud de la FFT no se como interpretar los parametros del espectro todo esto es en tiempo real, y todo esto es para que una voz gruesa se oiga mas fina bueno gracias

    ResponderEliminar
  21. hola, disculpa le estaba probando tu codigo para dibujar la señal pero me salen algunos errores que no tengo ni idea como eliminarlos....
    estoy intentando desde el viernes y no logro descifrarlo, no se si me puedas ayudar con el codigo o las clases en java hachas para ver en que me estoy eqivocando.... Si me puedes ayudar me escribes a kiever_17@hotmail.com
    gracias de antemano

    ResponderEliminar
  22. Hola estaba intentando usar el codigo pero nunca he programado en java y quisiera sabrer que tipo de parametro es el que recibe la funcion java.awt.event.ActionEvent evt no se que es exactamente lo que se le debe mandar a esta funcion cuando se le llama

    ResponderEliminar
  23. Hola muy interesante lo de tu proyecto de modificación de la voz. Para trabajar sobre el espectro de la voz, y precisamente para lo que que mencionas de graficar el espectro de frecuencias (espectograma) tienes que darle una revisada al algoritmo Radix2 con decimación en frecuencia y reordenamiento en la salida de bits mezclados para el calculo de la FFT ventaneada a partir del cual es sencillo construior el espectograma.

    Para la modificación de la voz, tal vez con un filtro de enfásis se podría lograr tu objetivo.

    ResponderEliminar
  24. Hola Jorge Carlos, me llamo Nerea y estoy realizando un trabajo sobre tratamiento de señales de audio para la universidad.
    Quería saber si podrías subir el código de tu clase que defina el main() ya que estoy teniendo algunos problemas a la hora de realizar el panelGrafico.

    Mi correo es orchrist_86@hotmail.com por si pudieras enviarme el codigo.
    Muchas gracias.

    ResponderEliminar
  25. Hola estuve tratando de usar el codigo pero tengo un error en la la variable fc de tipo JFileChooser, lo que estuve haciendo en el main es darle a esta varible fc la ruta del archivo mediante el constructor de la clase JFileChooser(String courrentDirecPath) que recibe un string ahi le mandaba la ruta del archivo de audio que quiero graficar pero tengo un error de puntero nulo NullPointerException cuando ejecuto el programa porque complila bien pero en la ejecucion en la instruccion int valorRetorno = fc.showOpenDialog(null); no se cual es mi error porfavor podrias indicarme donde y de que forma debo asignarle la ruta del archivo de audio que quiero graficar o que otra funcion debo usar con la variable fc o si es que es eso lo que estoy haciendo mal porfavor muchas gracias de antemano

    ResponderEliminar
  26. Hola Nerea, el main dependerá exclusivamente de ti, si tienes problemas con la graficación en el panel grafico dale una revisada a este post saludos

    ResponderEliminar
  27. profavor podias ayudarme ...como espesifico la ruta de audio para no poner un JFileChooser,....directamente..

    ResponderEliminar
  28. una duda, con la amplitud de esta señal que estas obteniendo o representando, un voltaje, Decibeles,

    ResponderEliminar
  29. La amplitud de una señal acústica representa la variación del desplazamiento de las moléculas de aire en la onda, y normalmente son medidas en decibeles, saludos

    ResponderEliminar
  30. Hola que tal... Espero me ayudes Jorge Carlos estoy haciendo un proyecto en el que me es de gran utilidad tu trabajo pero tengo un problema
    en la parte:

    while((numeroBytesLeidos=flujoEntradaAudio.read(audioBytes))!=-1)

    {

    numeroFramesLeidos = numeroBytesLeidos/bytesPorFrame;

    totalFramesLeidos += numeroFramesLeidos;

    System.arraycopy(audioBytes, 0, datosTemporal,

    pos, numeroBytesLeidos);

    pos=pos+numeroBytesLeidos;

    }
    necesito el valor que retorna datos temporal me supongo que debe ser un valor de tipo bit pero el imprimir me sale un caracter ASCII al parecer o algo asi; en fin lo que quiero es obtener los valores de la amplitud de la musica.. Espero me ayudes....

    ResponderEliminar
  31. Si deseas obtener los valores de la amplitud del audio, pues los tendrás al finalizar ese bucle que citas, y dichos valores se encontrarán en el arreglo datosVoz que almacena valores de tipo double.

    Saludos

    ResponderEliminar
  32. hola me puedes decir porfa como descargar import javax.sound.sampled.*; gracias

    ResponderEliminar
  33. Buenas Jorge Carlos,

    Estoy intentando mediante tu ejemplo obtener los picos de amplitud del audio, pero no lo consigo.

    Por si no queda claro, me refiero a los puntos en los que la onda tiene un cierto valor en el eje Y (graficamente).

    ¿Se te ocurre algo?

    Gracias por tu ayuda, eres un fenómeno.

    ResponderEliminar
  34. javax.sound es un paquete que viene por defecto en el JDK v6. Tambien puedes revisar Java MEdia Framework - JMF para el trabajo con archivos multimedia.

    saludos

    ResponderEliminar
  35. hola estube probando tu codigo y me manda el siguiente error dice que este paquete import Audio.*; no existe y tengo las librerias de JMF

    ResponderEliminar
  36. Hola, por si no te has percatado, lo que mencionas no es error por falta de la libreria JMF puesto que el paquete Audio es un paquete que tambien estoy creadno y lo comento en el parrafo: El código fuente en Java de la clase Reproducir se encuentra en el post: Reproducir Audio en Java. La clase Reproducir se en cuentra en el paquete Audio.

    El post mencionado se encuentra aqui

    Saludos

    ResponderEliminar
  37. Hola Pablo, para obtener los picos, tambien concoidos como máximos, puedes darle un vistazo al post: determinacion del periodo de pitch ahi encontrarás una manera de determinar los picos de una señal de habla. Saludos

    ResponderEliminar
  38. hola Jorge Carlos espero que estes muy bien.
    el motivo por el cual escribo es que tengo un incoveniente con el codigo que tenes montado disculpa mi innorancia pero es que no me aparencen errores pero no ejecuta nada ya tengo los cuatro archivos compilados y no aparencen errores Reproducir,GuiSeñal,menuAbrir,Datos entoces no se sime falta algo en el main o en la clase principal para la graficacion

    ResponderEliminar
  39. si me podes ayudar mi email es hoansistem@gmail.com
    me gustaria que me enviaras todo el proyecto para compilarlo y estudiarlo para realizar la tesis de mi Universidad de ante mano muchas gracias.

    ResponderEliminar
  40. Soy stalin estoy culminando mi tesis de pregrado de un sintetizador de señales de audio usando el modelo ANFIS, necesito saber si existe la posibilidad de que teniendo la matriz de los valores de amplitud pueda yo reproducir el sonido osea el proceso inverso al que estas haciendo

    ResponderEliminar
  41. jose eduardo fernandez rivera18 de noviembre de 2009, 02:45

    hola jorge soy nuevo en la programacion en java, pero me encargaron un proyecto que sea un juez de vos tu programa nos sirve de gran apollo pero lo que pasa es que nos genera un erro en la importacion de audio de es de mucha molestia de que paquete de java la importas o si es externa, tambien si es que nos proporciones mas datos tullos para englobarlos en nuestro proyecto es decir mencinarte dandote las prespectivas gracias que te mereces con esta aportacion
    por lo pronto es todo espero tu respuesta mi correo es sek-je@hotmail.com

    ResponderEliminar
  42. Hola el paquete que se necesita para la importación de archivos de audio en java es: import javax.sound.sampled...el cual menciono en el post.

    Con respecto a mis datos, que es lo que necesitarías especificamente, o te refieres a informacion sobre el tema?

    saludos

    ResponderEliminar
  43. jose eduardo fernandez rivera18 de noviembre de 2009, 23:26

    garcias con respecto a tus datos es para mencinarte en nuestro proyecto es decir en los anexos del mismo, mencionarte como aportaciones que nos ayudaron a realizar este proyecto juez de voz si no es mucha molestia
    por lo pronto es todo saludos

    ResponderEliminar
  44. Hola Jorge mira estoy haciendo un trabajo sobre mejorar señales producidas por celular pero necesito la fuente es decir una base de datos de este tipo para las pruebas sabes donde puedo conseguir esa informacion gracias
    saludos

    ResponderEliminar
  45. Te refieres para mejorar las frecuencias de las ondas de comunicación de los celulares? o las señales de audio de la voz que llegan al celular a traves de las frecuencias que usa el celular y que son desempaquetadas y emitidas para que el usuario las escuche?

    Bueno, sea cual fuese, el 1º tipo de señales (de frecuencia de ondas) es un poco dificil, al menos desconozco, pero si necesitas una base de datos de voz hay varias BD de acceso libre, otras que cuestan, y hasta de diferentes tamanios (cantidad de archivos de audio).

    Saludos

    ResponderEliminar
  46. Hola nuevamente me referia a lo segundo las señales de audio de la voz que llegan al celular a traves de las frecuencias que usa el celular, si lo que pasa es que mi inconveniente es la fuente de informacion y no e podido encontrar base de
    datos de ese tipo si conoces de alguna de acceso libre te agradeceria que me referencias al link
    gracias saludos

    ResponderEliminar
  47. Hola quisieras que me ayudes con algo,,Tu obtienes de un archivo .wav un vector de amplitudes para posteriormente realizar la grafica de la señal,Se podrá dado un vector de amplitud hecho, modificar el archivo de audio original para que en vez de de reproducir el audio original reproduzca un audio modificado

    ResponderEliminar
  48. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  49. Hola Jorge Carlos lo que sucede es q probamos tu codigo pero no funciona bien es decir abrimos el archivo y se reproduce pero no se grafica creemos q el problema esta en añadir los elementos al panel podrias ayudarnos es urgente gracias por lo q nos puedas colaborar

    ResponderEliminar
  50. hola q tal a mi asa algo similiar no me grafica :s creo el problema como agregar el panel señalPanel al panel Grafico podrias ayudarnme en esa parte, y porfa podrias decirnos q propiedades debe tener el panel grafico.

    Gracias de antemano, sigue asi (Y)

    ResponderEliminar
  51. Hola soy paulina de México e intento hacer lo mismo Que tu hiciste pero en J2ME y hasta ahora no me ha ido del todo bien desearia saber si tu sabes como puedo implementarlo. ya grabo la voz pero me falta el filtrado y mas. si sabes algo por favor escribe si no es mucha molestia a: pergamo_lunanegra@hotmail.com

    ResponderEliminar
  52. Hola que tal. Gracias por la ayuda. Solo un pequeño detalle... como mando llamar la función...

    menuAbrirActionPerformed(java.awt.event.ActionEvent evt).

    Gracias, SALUDOS...

    ResponderEliminar
  53. Hola, estoy queriendo iniciar a trabajar con audio, en java, y me gustaría saber si hay alguna forma mas o menos sencilla de capturar audio desde estaciones de radio transmitidas por internet. Saludos!

    ResponderEliminar
  54. Omar, depende de como quieras trabajar, puede der off-line (grabando las señales de audio y luego procesarlas) u on-line (tomando los frames e ir procesándolos en tiempo real).

    saludos

    ResponderEliminar
  55. mira necesito el archivo de audio para hacer las pruebas ya que ha sido borrado por favor me lo puedes enviar a mi correo jaracamilo@gmail.com

    muchas gracias.....

    ResponderEliminar
  56. Hola, me preguntaba si tambien tienes el codigo para mostrar señales de audio, pero para celulares, es decir usando el java J2ME, si no es mucha molestia, saludos!

    ResponderEliminar
  57. Hola que tal, tu codigo me esta sirviendo bastante, sin emabargo tengo un problema: ya he colocado todos los paquetes que necesita, y cada linea de codigo esta correcta, ahora tengo creado una clase llamada ver_audio, donde estan los metodos private menuAbrirActionPerformed(event), y el metodo private graficarSeñal(), ahora quiero que el codigo corra, aqui es donde esta el problema: en el metodo main, que debo de poner??, hago el constructor de un elemento ver_audio? y despues uso el metodo menuAbrir.., si es asi que parametro le debo de pasar en el evento??, de antemano gracias por la respuesta, suerte en Brasil!!

    ResponderEliminar
  58. Hola jorge. Excelente aporte. Tengo una pequeña pregunta.De que manera específica podria alterar tu código para que grafique por frames, es decir, para simular una recepción en "tiempo real"? gracias.

    ResponderEliminar
  59. Hola Oscar, si deseas hacer graficación por frames, algo práctico sería enviar la señal de un determinado tiempo t y graficar, luego la del tiempo t + 1,....

    Para hacerlo óptimo podrias enviar un frame de un 1 segundo por ejemplo, y limitar el tamaño del mismo para evitar sobrecarga de memoria.

    saludos

    ResponderEliminar
  60. Hola Jorge. Me parece muy interesante el tratamiento de audio en java. Mi duda es la siguiente, es posible obtener los bits de la codificación PCM del archivo de audio? De ser así, podrías darme una idea de cómo se podría hacer? Gracias de antemano!

    ResponderEliminar
  61. el PCM es un procedimiento de modulación utilizado para transformar una señal analógica en una secuencia de bits (señal digital). Los bits de un archcivo de audio al ya haber sido digitalizados entiendo que ya han pasado por el procedimiento de PCM, y si quieres obtener el valor de esos bits, el código que muestro en este post lo hace. Espero no estar equivocándome,

    saludos

    ResponderEliminar
  62. hola deseo que me envies el codigo compilado en una carpeta por favor mirebe_1@hotmail.com

    ResponderEliminar
  63. Hola Jorge. Antes de nada te felicito por tu excelente trabajo. Tengo un problema. Tu código me funciona perfectamente con algunos archivos .wav pero no con todos. Siempre se carga el audio pero no siempre el gráfico. ¿A qué puede ser debido? No lo entiendo.
    Un saludo, gracias.

    ResponderEliminar
  64. Hola, soy Martin, me sirve tu proyecto para un desarrollo de la facultad pero no logro compilarlo correctamente ya que me está faltando la definicion de algunas clases(EJ:Datos.java).
    Podrías facilitarme el codigo fuente del proyecto para asegurarme el correcto funcionamiento de todo a mi correo personal lm.saavedra86@gmail.com.
    Muchas gracias.
    Saludos!

    ResponderEliminar
  65. Hola Jorge:
    Mi nombre es Gary me interezó la manipulacion del sonido y encontré tu foro, te comento que al principio existia un error en el JPanel Grafico.getWith el cual mencionaba que se trataba de comparar este tamaño con un valor nulo ( < With) "algo asi", no importo porque con una asignación de tamaño al JPanel Grafico (Grafico.setSize(700,600)) fue suficiente, pero ahora que ya no existe la falla del JPanel note que en ningún momento ingresa a los metodos de la clase "GuiSeñal" ni a otro método que no sea un getter o setter de esta misma clase, y por obvia razón no esta graficando la señal, hice mal al dar una dimensión al JPanel?? o por qué causa no ingresa a dichos métodos ?? algo más me falto?.

    Espero tu pronta respuesta y muchas gracias de ante mano.

    ResponderEliminar
    Respuestas
    1. Hola Gary, lo que hiciste con el getWidth() esta correcto y no creo que generé el otro problema. Lo que podría estar pasando es que no se estan encontrando los valores exactos para realizar la graficación en el canvas de Java, para eso te recomiendo que le des una leída a este otro post: graficar en coordenadas de dispositivo

      saludos

      Eliminar
  66. Hola Jorge, tengo unos problemas con el codigo ya que no entiendo muy bien la estructura que tomaste, trabajaste con un JPanel o JFrame y dentro de el insertaste otro JPanel y que nombre de variables le diste.
    Y creo algunas declaraciones de variables no salen en el codigo.

    panelSeñal.setIntervalo((finterv*datosVoz.length)/Grafico.getWidth());

    es esa parte del codigo me marca error la parte donde dice grafico queria ver si era algun panel??

    O si habia la posibilidad de que me mandaras el proyecto de netbeans a mi correo para poder despejar las dudas y correjir los problemas

    mi correo es IrvEru@hotmail.com

    ResponderEliminar
    Respuestas
    1. efectivamente existe un error, pero puedes modificarlo por algo constante, por ejemplo, yo le puse 1, y lo grafica perfecto :)

      Eliminar
  67. Amigo, ojala puedas ayudarme como podría hacer para una vez que amplifique el vector, pueda escribirlo a un archivo .wav de nuevo?, lo he intentado de varias formas pero no logro que funcione, ojala me puedas ayudar.

    ResponderEliminar
    Respuestas
    1. Los archivos .wac, como cualquier otro archivo multimedia, además del campo de datos (que vendría a ser la información del vector que mencionas), tiene otro tipo de campos importantes que también tienen que tener valores.

      Para eso, te recomendaría que revises la estructura de un archivo .wav para que puedas realizar efectivamente la creación de un nuevo archivo en este formato.

      sds

      Eliminar
  68. tengo una duda en cuestion la variable Grafico es un JPanel o un JFrame??
    lo pongo en la interfaz?? o lo pongo diracto para k se cree solo??
    es mi unica duda ya que diske estan resolviendo eso y no dan respuestras claras

    ResponderEliminar
  69. Hola podrias mandarme el codigo a mi correo por favor, es que no logro hacerlo funcionar, Gracias seatfr13@hotmail.com

    ResponderEliminar
    Respuestas
    1. Hola Francisco, el código disponible aqui y en los posts relacionados son los únicos necesarios para hacer arramcar la aplicación,

      sds

      Eliminar
  70. Hola buenas una pregunta, la libreria Javax.Sound se puede integrar con el SDK de Android?, es decir, se puede integrar esta librería para hacer una aplicación en Android para manejar todo lo referente con el sonido, saludos.

    ResponderEliminar
    Respuestas
    1. Hola Kleyvert, para eso tendrías que revisar las especificaciones de Javax.Sound, no sé si haya actualizado la libería, es por eso que tendrías que asegurarte antes de empezar a usar Javax.Sound en Android

      sds

      Eliminar
  71. Hola Jorge,

    Me llamo Manuel y estoy realizando mi proyecto final de carrera y tus posts me estan siendo de gran utilidad, pero me surgen algunas dudas, como por ejemplo hasta que punto el intervalo con que se seleccionan los puntos a representar y el factor fex deberian estar relacionados entre si de manera proporcional para obtener un gráfica correcta.

    Me explico, en mi caso, había pensado en que en mi gráfica se visualizaran 5 segundos sin necesitad de que aparezca el scroll (si la grabación fuera mas larga ya presentaría el scroll) y en función de eso escalar. Entiendo que para ello deberia tener en cuenta la cantidad de fps de la grabación ya que cada frame se representaría como un punto ¿no?. Si mi panel tiene 800 pixels de largo, ¿el fex debería ser 5/800? ¿el finterv fps/800? Si no lo ajusto de manera proporcional, los puntos se pegan tanto que la señal acaba siendo defectuosa.

    Muchs gracias

    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Manuel,

      Eso va a depender grandemente de la dimensión que le des a cada punto que grafiques, así, con una dimensión dada podrías obtener una mejor gráfica que con otra dimensión ... además ya también se podrían considerar otras cuestiones que tiene que ver con computación gráfica, como por ejemplo, lo referente al tema de interpolación,

      sds

      Eliminar
    2. Hola Jorge,

      En primer lugar gracias por responder. ¿Con la dimensión del punto te refieres al tamaño del "punto dibujado"? En un principio lo estoy haciendo como en tu ejemplo, que entiendo es el menor tamaño posible y que mas o menos sera un pixel ¿no?.

      Saludos

      Manu

      Eliminar
  72. Hola:

    Quisiera saber donde descargar los codigos fuente, o si es posible enviarmelos a mi correo snk.10_@hotmail.com

    Tengo un proyecto que realizar de fin de semestre de señales y tu trabajo me ayudaría mucho ya que posteriormente debo convolucionar, encontrar la FFT, etc... saludos

    ResponderEliminar
    Respuestas
    1. Todo el código fuente esta disponible en los diferentes posts de este blog, los cuales a su vez se indican en este mismo post

      sds

      Eliminar
  73. Buenas Jorge,

    Tengo una pregunta a ver si me puedes ayudar, tengo implementado una especie de VOIP que pasa de digital a analogico y viceversa por el protocolo UDP, pero a la hora de difusión este difunde el audio añadiendo como si fuese un tono que desconozco, lo se por los aplicativos audicity y wireshark pero no llego a saber este "tono" como puedo capturarlo en JAVA hacerle la inversa y que me anule ya que reproduce un "BRBRBR" + el audio que viene, has de tener en cuenta que la parte que añade ese "tono" por llamarlo así viene de un equipo hecho en C y que no dispongo de su source fuente.

    ¿Sabrías como podría resolverlo? tengo la inversa del "tono" en audicity y había pensado de exportarlo y rewproducirlo al mismo tiempo que reproduzco el audio que me venga de UDP, pero dudo que resulte.

    ResponderEliminar
    Respuestas
    1. Dámaso, técnicamente podría decir que la manera más simple de resolver esto es encontrando el problema que genera el tono "BRBRBR" que no se desea ... tal vez sea un ruido producido por el ambiente en el que se encuentra el dispositivo.

      Otra manera que se me ocurre es tener la señal del tono indeseable y la señal del audio, luego hacer una "substracción" y obtener la señal del audio ya limpia, sin el "BRBRBR".

      sds

      Eliminar
  74. Muy buen buen post!!! lo hice funcionar para wav. Pero te quería consultar si se prodria adaptar para mp3? utilizando la misma clase datos. Lo que estaba viendo es que los mp3 no especifican el largo del frame y la cantidad de frame del archivo mp3. Esto sería un impedimento para graficarlo correctamente?

    MPEG1L3 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, 38.28125 frames/second,

    ResponderEliminar
  75. Hola Jorge, oye tengo un programa en eclipse de Comparación de sonidos, el problema que tengo es que cuando grabo desde un micrófono y gráfico lo grabado no puedo hacer la comparación.

    Algún ejemplo de algún método de Comparación de sonidos..

    si me pueden ayudar se los agradecería.

    ResponderEliminar
  76. hola, disculpen pero es la primera ves q entro a este blog y estoy un poko perdido, me podrian explicar como hacer la parte visual o decirme donde esta explicado, asi como los componentes q tengo q utilizar..graciasss

    ResponderEliminar
  77. otra cosa donde puedo conseguir el pakete Audio..gracias

    ResponderEliminar
  78. si alguien me puede facilitar el archivo dominaiting.wav enviarmelo a este email ppvaldes@estudiantes.uci.cu se lo voy a agradecer......Salu2

    ResponderEliminar
  79. Un favor, es q no logre q me funcionara, alguien me puede facilitar el codigo para correrlo en netbeans, gracias..

    ResponderEliminar
  80. Hola Jorge,
    Estoy tratando de usar tu codigo sin la interfaz grafica ya que lo necesito para obtener solo las frecuencias o decibeles por los que pasa mientras lle el audio. Es decir el fin de esto es para poder obtener en que momento de la reproduccion del audio existen silencios, e identificarlos con los decibles o frecuencias bajas.
    El PERO, esta, en que no logro obtener las frecuencias o decibeles del audio. imagino que esta en el ciclo while que existe. pero no logro obtenerlo.
    Favor si me puedes ayudar.
    Desde ya agradecido, Saludos!

    ResponderEliminar
  81. totalFramesLeidos += numeroFramesLeidos; esta linea esta mal.
    tiene documentacion de sonido, y el estudio de la frecuencia, me encantaria estudiar.

    ResponderEliminar
  82. Jorge muy interesante, sin embargo me gustaria un poco de ayuda en particular mi duda es la siguiente.
    de un archivo *.wav como puedo estraer la informacion (matrices o valores ) de ese archivo para despues hacer algun otro tipo de procesamiento.
    gracias Israel

    ResponderEliminar

Bienvenido a jcGeorge's Blog!!!

Por favor deja tu comentario, consulta o sugerencia, procura mantener habilitado tu perfil de Blogger o deja un enlace a tu blog o web.

Gracias por leer este blog!!!

Related Posts Plugin for WordPress, Blogger...