1

後で使用するために、大きくて (おそらく非常に) pickle 化できないオブジェクトをファイルにレンダリングしようとしています。

側に苦情はありませんdill.dump(file)

In [1]: import echonest.remix.audio as audio

In [2]: import dill

In [3]: audiofile = audio.LocalAudioFile("/Users/path/Track01.mp3")
en-ffmpeg -i "/Users/path/audio/Track01.mp3" -y -ac 2 -ar 44100 "/var/folders/X2/X2KGhecyG0aQhzRDohJqtU+++TI/-Tmp-/tmpWbonbH.wav"
Computed MD5 of file is b3820c166a014b7fb8abe15f42bbf26e
Probing for existing analysis

In [4]: with open('audio_object_dill.pkl', 'wb') as f:
   ...:     dill.dump(audiofile, f)
   ...:  

In [5]: 

しかし、ファイルをロードしようとしてい.pklます:

In [1]: import dill

In [2]: with open('audio_object_dill.pkl', 'rb') as f:
   ...:     audio_object = dill.load(f)
   ...:  

次のエラーを返します。

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-203b696a7d73> in <module>()
      1 with open('audio_object_dill.pkl', 'rb') as f:
----> 2     audio_object = dill.load(f)
      3 

/Users/mikekilmer/Envs/GLITCH/lib/python2.7/site-packages/dill-0.2.2.dev-py2.7.egg/dill/dill.pyc in load(file)
    185     pik = Unpickler(file)
    186     pik._main_module = _main_module
--> 187     obj = pik.load()
    188     if type(obj).__module__ == _main_module.__name__: # point obj class to main
    189         try: obj.__class__ == getattr(pik._main_module, type(obj).__name__)

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.pyc in load(self)
    856             while 1:
    857                 key = read(1)
--> 858                 dispatch[key](self)
    859         except _Stop, stopinst:
    860             return stopinst.value

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.pyc in load_newobj(self)
   1081         args = self.stack.pop()
   1082         cls = self.stack[-1]
-> 1083         obj = cls.__new__(cls, *args)
   1084         self.stack[-1] = obj
   1085     dispatch[NEWOBJ] = load_newobj

TypeError: __new__() takes at least 2 arguments (1 given)

class objectAudioObject は、上記の呼び出しが行われるよりもはるかに複雑 (かつ大きい) であり( SO answerから)、2 番目の引数を 経由dillで送信する必要があるかどうかは不明です。または、この特定のオブジェクトに対して酸洗いへのアプローチが実行可能かどうかを判断する方法。

オブジェクト自体を少し調べます。

In [4]: for k, v in vars(audiofile).items():
...:     print k, v
...: 

戻り値:

is_local False
defer False
numChannels 2
verbose True
endindex 13627008
analysis <echonest.remix.audio.AudioAnalysis object at 0x103c61bd0>
filename /Users/mikekilmer/Envs/GLITCH/glitcher/audio/Track01.mp3
convertedfile /var/folders/X2/X2KGhecyG0aQhzRDohJqtU+++TI/-Tmp-/tmp9ADD_Z.wav
sampleRate 44100
data [[0 0]
 [0 0]
 [0 0]
 ..., 
 [0 0]
 [0 0]
 [0 0]]

そして、これを含む(または明らかに指し示す)audiofile.analysisという属性が含まれているようですaudiofile.analysis.sourceaudiofile.analysis.source.analysis

4

1 に答える 1

1

この場合、答えはモジュール自体にありました。

クラスは独自のメソッドを提供します (そのLocalAudioFileため、そのインスタンスのそれぞれが利用できます) 。saveLocalAudioFile.savethe_audio_object_instance.save

.mp3ファイルの場合、インスタンスは、の解凍バージョンであるLocalAudioFile一時ファイルへのポインタと、(インターネットとのインターフェース後に最初のオーディオファイルから返される一連の分析データ全体とともに) で構成されます。ベース)。.wav.mp3Echonest API

LocalAudioFile.saveは、オーディオ オブジェクトにリンクされた元のファイルと同じ名前とパスでファイルshutil.copyfile(path_to_wave, wav_path)を保存するために呼び出し、ファイルが既に存在する場合はエラーを返します。分析データをファイルに保存するために、最初のオーディオ オブジェクト ファイルが呼び出されたディレクトリにも呼び出されます.wavpickle.dump(self, f)

オブジェクトは、LocalAudioFileを介して簡単に再導入できますpickle.load()

これは、ほとんどの標準メソッドに加えてさらに多くのメソッドを提供する非常に便利なラッパーまたはインターフェイスである を使用したiPythonセッションです。dillpickle

audiofile = audio.LocalAudioFile("/Users/mikekilmer/Envs/GLITCH/glitcher/audio/Track01.mp3")

In [1]: import echonest.remix.audio as audio

In [2]: import dill
# create the audio_file object
In [3]: audiofile = audio.LocalAudioFile("/Users/mikekilmer/Envs/GLITCH/glitcher/audio/Track01.mp3")
en-ffmpeg -i "/Users/path/audio/Track01.mp3" -y -ac 2 -ar 44100 "/var/folders/X2/X2KGhecyG0aQhzRDohJqtU+++TI/-Tmp-/tmp_3Ei0_.wav"
Computed MD5 of file is b3820c166a014b7fb8abe15f42bbf26e
Probing for existing analysis
#call the LocalAudioFile save method
In [4]: audiofile.save()
Saving analysis to local file /Users/path/audio/Track01.mp3.analysis.en
#confirm the object is valid by calling it's duration method
In [5]: audiofile.duration
Out[5]: 308.96
#delete the object - there's probably a "correct" way to do this
in [6]: audiofile = 0
#confirm it's no longer an audio_object
In [7]: audiofile.duration
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-04baaeda53a4> in <module>()
----> 1 audiofile2.duration

AttributeError: 'int' object has no attribute 'duration'


#open the pickled version (using dill)
In [8]: with open('/Users/path/audio/Track01.mp3.analysis.en') as f:
   ....:     audiofile = dill.load(f)
   ....:     
#confirm it's a valid LocalAudioFile object
In [8]: audiofile.duration
Out[8]: 308.96

Echonestは非常に堅牢な API であり、リミックス パッケージは多くの機能を提供します。ここにまとめられた関連リンクの小さなリストがあります。

于 2014-09-02T20:07:56.373 に答える