Aunque hasta ahora me había resistido a trabajar con grabaciones de audio, dado los proyectos en los que estamos trabajando en el Grupo Golem he terminado con la necesidad de procesar una gran cantidad de grabaciones. Ya sea para hacer scripts de evaluación, identificar actividad o para extraer caracteristicas del audio. Como es esperarse en mi caso he estado utilizando python, sobretodo por la necesidad de automatizar las tareas.
Python tiene varias librerías y herramientas para trabajar con
audio1
. Uno de los requisitos que rápido surgió fue que la librería
debería ser compatible con ScyPy y NumPy, inmediatamente identificamos a
Audiolab
. Esta es un librería que puede leer de muchos formatos y lo
más importante nos entrega una estructura numpy
directamente!
A continuación describimos alguna información sobre la documentación, la instalación y un ejemplo de uso que encontramos útil.
Documentación
En un principio estaba algo confundido sobre que era Audiolab .
- Audiolab es un wrapper sobre la librería libsndfile originalmente escrita en C
- Audiolab es uno de los SciPy Toolkits mejor conocidos como scikits
- Audiolab fue desarrollado por David Cournapeau
- La documentación de audiolab puede ser localizada en aquí
- Audiolab tiene una minipágina en el sitio de Cournapeau
- La librería la pueden descargar aquí
Instalación
Requisitos:
- NumPy, libsndfile, libasound
En ubuntu podemos instalar este software de la siguiente manera:
sudo apt-get install python-dev python-numpy python-setuptools
sudo apt-get install libsndfile-dev libasound2-dev
La instalación la podemos hacer con easy_install
ya que se instaló
python-setuptools
de la siguiente forma:
sudo easy_install scikits.audiolab
Alternativamente se puede bajar el paquete e instalarlo de la siguiente forma:
tar -xzvf scikits.audiolab-0.11.0.tar.gz
cd scikits.audiolab-0.11.0/
python setup.py build
sudo python setup.py install
Ejemplo
Para el siguiente ejemplo se necesita un archivo de audio con más de un
segundo de duración, sino tienes uno a la mano puedes bajar uno de nuestro canal de
SoundCloud
. En el siguiente código
nos vamos a referir al archivo como audio.wav
si tu archivo no se llama
así sustituye por el nombre correcto.
La idea del ejemplo es dibujar el
espectograma
del primer
segundo del archivo audio.wav
, para lo cual será necesaria la librería
matplotlib
. El código lo puedes copiar y
ejecutar como un script de python o de manera interactiva con ipython
.
import numpy as np
import matplotlib.pyplot as plt
import scikits.audiolab as audiolab
sound=audiolab.sndfile('audio.wav','read')
data=sound.read_frames(sound.get_samplerate())
spectogram=plt.specgram(data)
plt.show()
sound.close()
En el momento de ejecutarse plt.show()
se desplegará el espectograma,
para terminar basta con cerrar la imagen. Un ejemplo de imagen a esperar
es:
Vamos a revisar línea por línea del código. La línea
import numpy as np
carga la librería numpy
y le asigna el alias de np
,
import matplotlib.pyplot as plt
carga la librería matplotlib
y le asigna el alias de plt
,
import scikits.audiolab as audiolab
finalmente, esta línea carga la librería scikits.audiolab
y le asigna el
alias de audiolab
.
sound=audiolab.sndfile('audio.wav','read')
Una vez con las librerías cargadas, se sbre el archivo de audio para
lectura y guarda la referencia en la variable sound
.
data=sound.read_frames(sound.get_samplerate())
Esta línea, lee del archivo el equivalente a sample rate
de muestras. El sample rate
dice cuantas muestras de audio se tomaron por segundo, como pedimos exactamente ésta
cantidad, únicamente leéremos el primer segundo del archivo. Esta
información se guarda en la variable data
.
spectogram=plt.specgram(data)
Generamos el spectograma con la información guardadá en la variable data
plt.show()
Mostramos el espectograma.
sound.close()
Y finalmente, se cierra el archivo.
Y listo, de esa forma podemos abrir archivos de audio en python y procesarlos con numpy.
1 Estos son algunos sitios donde pueden encontrar una lista de las librerías y herramientas disponibles Wiki audio in Python y Music software written in Python