使用Python[summary]读取wav文件最简单的方法是什么?

2024-05-16 06:44:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用Python访问wav文件,并将其内容以允许我分析它的形式(比如说数组)编写。

  1. 我听说“audiolab”是一个合适的工具(它将numpy数组转换成wav,反之亦然)。
  2. 我已经安装了“audiolab”,但是我对numpy的版本有问题(我不能“从numpy.testing导入Tester”)。我得了1.1.1分。纽比的版本。
  3. 我在numpy(1.4.0)上安装了一个新版本。但后来我又犯了一组新的错误:

    回溯(最近一次呼叫时间): 文件“test.py”,第7行,in 导入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行,in 从sndfile导入sndfile,格式,可用的文件格式,可用的编码 文件“numpy.pxd”,第30行,scikits.audiolab.pysndfile.\u sndfile(scikits/audiolab/pysndfile/\u sndfile.c:9632) 值错误:numpy.dtype似乎不是正确的类型对象

  4. 我放弃了使用audiolab,并认为我可以使用“wave”包来读取wav文件。我问了一个问题,但是人们建议用scipy代替。好吧,我决定把重点放在scipy上(我有0.6.0。版本)。

  5. 但当我试着做以下事情时:

    从scipy.io导入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文件的内容,然后我会想出如何处理。

Tags: 文件inpy版本numpylibpackagesusr
3条回答

我在std库中的wave模块上编写了一个简单的包装器。它被称为pydub,它有一个从音频数据中以int形式读取样本的方法。

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

希望这有帮助

你试过波形模块吗?它具有较少的依赖关系:

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

这对我来说已经足够了

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

它忽略前24个值,因为这不是音频,而是标题。

另外,如果文件是立体声的,那么您的频道将有交替索引,所以我通常只是先用Audacity将其还原为mono。

相关问题 更多 >