8

Python を使用して wav ファイルにアクセスし、そのコンテンツを分析できる形式 (配列としましょう) に書き込みたいと考えています。

  1. 「audiolab」はそれに適したツールだと聞きました(numpy配列をwavに、またはその逆に変換します)。
  2. "audiolab" をインストールしましたが、numpy のバージョンに問題がありました ("from numpy.testing import Tester" ができませんでした)。私は1.1.1を持っていました。numpy のバージョン。
  3. numpy (1.4.0) に新しいバージョンをインストールしました。しかし、その後、新しい一連のエラーが発生しました。

    トレースバック (最新の呼び出しが最後): ファイル "test.py"、7 行目、インポート scikits.audiolab ファイル "/usr/lib/python2.5/site-packages/scikits/audiolab/ init .py"、25 行目、 in from pysndfile import formatinfo, sndfile File "/usr/lib/python2.5/site-packages/scikits/audiolab/pysndfile/ init .py", line 1, in from from _sndfile import Sndfile, Format, available_file_formats, available_encodings File "numpy .pxd"、30 行目、scikits.audiolab.pysndfile._sndfile (scikits/audiolab/pysndfile/_sndfile.c:9632) の ValueError: numpy.dtype が正しい型オブジェクトではないようです

  4. 私は audiolab を使用することをあきらめ、「wave」パッケージを使用して wav ファイルを読み込むことができると考えました。私はそれについて質問しましたが、人々は代わりに scipy を使用することを勧めました。OK、私は scipy に集中することに決めました (私は 0.6.0. バージョンを持っています)。

  5. しかし、私が次のことをしようとしたとき:

    from 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の使用をあきらめました。waveパッケージだけでも使えますか?私はあまり必要ありません。人間が読める形式のwavファイルのコンテンツが必要なだけで、それをどうするかを考えます。
4

8 に答える 8

13

ウェーブモジュールを試しましたか?依存関係が少なくなります。

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
于 2010-04-08T18:05:21.490 に答える
6

std lib の 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

うまくいけば、これが役に立ちます

于 2012-12-05T22:58:44.977 に答える
5

私にはこれで十分です

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

最初の 24 個の値は無視されます。これはオーディオではなくヘッダーであるためです。

また、ファイルがステレオの場合、チャンネルにはインデックスが交互に表示されます。そのため、通常は最初に Audacity を使用してモノラルに減らします。

于 2011-04-22T18:10:19.277 に答える
5

Wave モジュールを 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))
于 2014-06-20T01:46:21.857 に答える
2

うまくいかないことをたくさん試した後、Use (Python) Gstreamer のデコード ライブラリを使用してオーディオを (PCM データに) デコードし、生の pcm データを解析して scipy 配列にする関数を作成しました。

これは素晴らしく、gstreamer が開くことができるオーディオ ファイルを開くことができます: http://gist.github.com/592776 (使用方法については、テストとファイルの最後を参照してください)

于 2010-09-22T23:36:04.573 に答える
1

audiolabは最良の方法ですが、すべての環境で機能するとは限らず、開発者も取り組んでいません。私はまだPython 2.5を使用しているので、使用できます。

libsndfileをインストールしましたか?

于 2010-03-17T03:37:45.580 に答える