¿Cuál es la forma más fácil de leer archivos wav usando Python ?

Quiero usar Python para acceder a un archivo wav y escribir su contenido en una forma que me permita analizarlo (digamos arrays).

  1. Escuché que “audiolab” es una herramienta adecuada para eso (transforma numerosos arreglos en wav y vica versa).
  2. He instalado el “audiolab” pero tuve un problema con la versión de numpy (no pude “desde numpy.testing import Tester”). Yo tenía 1.1.1. versión de numpy.
  3. He instalado una versión más nueva en numpy (1.4.0). Pero luego tengo un nuevo conjunto de errores:

    Seguimiento (última llamada más reciente): archivo “test.py”, línea 7, en importación scikits.audiolab Archivo “/usr/lib/python2.5/site-packages/scikits/audiolab/ init .py”, línea 25, in from pysndfile import formatinfo, sndfile Archivo “/usr/lib/python2.5/site-packages/scikits/audiolab/pysndfile/ init .py”, línea 1, desde _sndfile import Sndfile, Format, available_file_formats, available_encodings File “numpy .pxd “, línea 30, en scikits.audiolab.pysndfile._sndfile (scikits / audiolab / pysndfile / _sndfile.c: 9632) ValueError: numpy.dtype no parece ser el objeto de tipo correcto

  4. Me di por vencido para usar audiolab y pensé que podía usar el paquete “wave” para leer en un archivo wav. Hice una pregunta sobre eso, pero la gente recomendó usar scipy en su lugar. OK, decidí enfocarme en scipy (tengo la versión 0.6.0.).

  5. Pero cuando intenté hacer lo siguiente:

      desde scipy.io import wavfile
      x = wavfile.read (‘/ usr / share / sounds / purple / receive.wav’)

    Me sale lo siguiente:

    Traceback (most recent call last): File "test3.py", line 4, in  from scipy.io import wavfile File "/usr/lib/python2.5/site-packages/scipy/io/__init__.py", line 23, in  from numpy.testing import NumpyTest ImportError: cannot import name NumpyTest 
    1. Por lo tanto, me di por vencido para usar Scipy ¿Puedo usar solo el paquete wave? No necesito mucho. Solo necesito tener el contenido de wav-file en un formato legible por humanos y luego descubriré qué hacer con eso.

    ¿Has probado el módulo wave? Tiene menos dependencias:

    http://docs.python.org/library/wave.html

     def everyOther (v, offset=0): return [v[i] for i in range(offset, len(v), 2)] def wavLoad (fname): wav = wave.open (fname, "r") (nchannels, sampwidth, framerate, nframes, comptype, compname) = wav.getparams () frames = wav.readframes (nframes * nchannels) out = struct.unpack_from ("%dh" % nframes * nchannels, frames) # Convert 2 channles to numpy arrays if nchannels == 2: left = array (list (everyOther (out, 0))) right = array (list (everyOther (out, 1))) else: left = array (out) right = left 

    Escribí un envoltorio simple sobre el módulo de wave en la publicación estándar. se llama pydub y tiene un método para leer muestras de los datos de audio como ints.

     >>> from pydub import AudioSegment >>> song = AudioSegment.from_wav("your_song.wav")  >>> # This song is stereo >>> song.channels 2 >>> # get the 5000th "frame" in the song >>> frame = song.get_frame(5000) >>> sample_left, sample_right = frame[:2], frame[2:] >>> def sample_to_int(sample): return int(sample.encode("hex"), 16) >>> sample_to_int(sample_left) 8448 >>> sample_to_int(sample_right) 9984 

    Esperemos que esto ayude

    Esto es suficiente para mí

     import numpy as np x = np.fromfile(open('song.wav'),np.int16)[24:] 

    Ignora los primeros 24 valores, porque eso no es audio, es el encabezado.

    Además, si el archivo era estéreo, sus canales tendrán índices alternos, por lo que generalmente solo lo reduzco a mono con Audacity primero.

    También puede usar el módulo wave junto con la función numpy.fromstring () para convertirlo en una matriz

     import wave import numpy fp = wave.open('test.wav') nchan = fp.getnchannels() N = fp.getnframes() dstr = fp.readframes(N*nchan) data = numpy.fromstring(dstr, numpy.int16) data = numpy.reshape(data, (-1,nchan)) 

    Después de probar tantas cosas que no funcionan, utilicé la biblioteca de deencoding de Use (Python) Gstreamer para decodificar audio (para datos PCM) y construí una función para analizar los datos de pcm sin procesar en una matriz de caracteres.

    Es bueno y puede abrir cualquier archivo de audio que gstreamer pueda abrir: http://gist.github.com/592776 (consulte Prueba y el final del archivo para obtener información de uso)

    Audiolab es la mejor manera, pero no funciona en todos los entornos y el desarrollador no está trabajando en ello. Todavía estoy usando Python 2.5, así que puedo usarlo.

    ¿ Instalaste libsndfile ?

    Parece que el audiolab ya no se mantiene, debes probar PySoundFile .

    La instalación es simple:

     pip install PySoundFile --user 

    Y leyendo un archivo de sonido también:

     import soundfile as sf x, fs = sf.read('/usr/share/sounds/purple/receive.wav') 

    Eche un vistazo a esta descripción general sobre las diferentes bibliotecas de Python para manejar archivos de sonido .

    pydub proporciona una solución aún más sencilla sin necesidad de instalar dependencias (para archivos wav). Actualmente estoy usando este método en producción sin ningún problema.

     from pydub import AudioSegment awesome_song = AudioSegment.from_wav('awesome_song.wav') print('Duration in seconds is {}'.format(awesome_song.duration_seconds))