Как проще всего читать wav-файлы с помощью Python [summary]? - PullRequest
7 голосов
/ 14 января 2010

Я хочу использовать Python для доступа к wav-файлу и записи его содержимого в форме, которая позволяет мне анализировать его (скажем, массивы).

  1. Я слышал, что "audiolab" является подходящим инструментом для этого (он превращает массивы в wav и наоборот).
  2. Я установил «audiolab», но у меня была проблема с версией numpy (я не мог «из numpy.testing import Tester»). У меня был 1.1.1. версия numpy.
  3. Я установил более новую версию на numpy (1.4.0). Но потом я получил новый набор ошибок:

    Traceback (последний вызов был последним): Файл "test.py", строка 7, в импорт scikits.audiolab Файл "/usr/lib/python2.5/site-packages/scikits/audiolab/init.py", строка 25, в из pysndfile импортировать formatinfo, sndfile Файл "/usr/lib/python2.5/site-packages/scikits/audiolab/pysndfile/init.py", строка 1, в из _sndfile import Sndfile, Format, available_file_formats, available_encodings Файл "numpy.pxd", строка 30, в файле scikits.audiolab.pysndfile._sndfile (scikits / audiolab / pysndfile / _sndfile.c: 9632). ValueError: numpy.dtype не является объектом правильного типа

  4. Я отказался от использования audiolab и подумал, что могу использовать пакет "wave" для чтения в wav-файл. Я задал вопрос об этом, но люди рекомендовали вместо этого использовать scipy. Хорошо, я решил сосредоточиться на scipy (у меня версия 0.6.0.)

  5. Но когда я попытался сделать следующее:

    из scipy.io import wavfile
    x = wavfile.read ('/ usr / share / sounds / purple / receive.wav')

Я получаю следующее:

Traceback (most recent call last):
  File "test3.py", line 4, in <module>
    from scipy.io import wavfile
  File "/usr/lib/python2.5/site-packages/scipy/io/__init__.py", line 23, in <module>
    from numpy.testing import NumpyTest
ImportError: cannot import name NumpyTest
  1. Итак, я отказался от использования scipy. Могу ли я использовать только волновой пакет? Мне не нужно много. Мне просто нужно иметь содержимое wav-файла в удобочитаемом для человека формате, и тогда я пойму, что с этим делать.

Ответы [ 8 ]

11 голосов
/ 08 апреля 2010

Вы пробовали волновой модуль? У него меньше зависимостей:

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
6 голосов
/ 06 декабря 2012

Я написал простую обертку над волновым модулем в std lib. он называется pydub и имеет метод для чтения сэмплов из аудиоданных в виде целых чисел.

>>> from pydub import AudioSegment
>>> song = AudioSegment.from_wav("your_song.wav")
<pydub.audio_segment.AudioSegment at 0x1068868d0>

>>> # 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

Надеюсь, это поможет

5 голосов
/ 22 апреля 2011

Это достаточно хорошо для меня

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

Он игнорирует первые 24 значения, потому что это не аудио, а заголовок.

Кроме того, если файл был стереофоническим, ваши каналы будут иметь чередующиеся индексы, поэтому я обычно просто уменьшаю его до моно с Audacity.

4 голосов
/ 20 июня 2014

Вы также можете использовать волновой модуль вместе с функцией numpy.fromstring (), чтобы преобразовать его в массив

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))
2 голосов
/ 23 сентября 2010

Попробовав так много вещей, которые не работают, я использовал библиотеку декодирования из Используйте (Python) Gstreamer для декодирования аудио (в данные PCM) и собрал функцию для анализа необработанных данных PCM в scipy массив.

Это приятно и может открыть любой аудиофайл, который может открыть gstreamer: http://gist.github.com/592776 (см. Тест и конец файла для информации об использовании)

1 голос
/ 17 сентября 2015

audiolab , похоже, больше не поддерживается, попробуйте PySoundFile .

Установка проста:

pip install PySoundFile --user

И чтение звукового файла:

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

Просмотрите этот обзор различных библиотек Python для обработки звуковых файлов .

1 голос
/ 17 марта 2010

audiolab - лучший способ, но он работает не во всех средах, и разработчик не работает над ним. Я все еще использую Python 2.5, поэтому я могу его использовать.

Вы установили libsndfile ?

0 голосов
/ 18 августа 2017

pydub обеспечивает еще более простое решение без необходимости установки каких-либо зависимостей (для файлов wav). В настоящее время я использую этот метод в производстве без каких-либо проблем.

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