4

アプリケーションでSoXを使用しています。アプリケーションはこれを使用して、トリミングなど、オーディオファイルにさまざまな操作を適用します。

これはうまくいきます:

from subprocess import Popen, PIPE

kwargs = {'stdin': PIPE, 'stdout': PIPE, 'stderr': PIPE}

pipe = Popen(['sox','-t','mp3','-', 'test.mp3','trim','0','15'], **kwargs)
output, errors = pipe.communicate(input=open('test.mp3','rb').read())
if errors:
    raise RuntimeError(errors)

read()ただし、完全なファイルをメモリにロードするため、これは大きなファイルで問題を引き起こします。これは遅く、パイプのバッファがオーバーフローする可能性があります。次の回避策があります。

from subprocess import Popen, PIPE
import tempfile
import uuid
import shutil
import os

kwargs = {'stdin': PIPE, 'stdout': PIPE, 'stderr': PIPE}
tmp = os.path.join(tempfile.gettempdir(), uuid.uuid1().hex + '.mp3')

pipe = Popen(['sox','test.mp3', tmp,'trim','0','15'], **kwargs)
output, errors = pipe.communicate()

if errors:
    raise RuntimeError(errors)

shutil.copy2(tmp, 'test.mp3')
os.remove(tmp)

したがって、質問は次のようになります。Sox C API への Python 拡張機能を作成する以外に、このアプローチに代わるものはありますか?

4

1 に答える 1

5

SoX の Python ラッパーは既に存在します: sox。おそらく最も簡単な解決策は、.xml を介して外部の SoX コマンド ライン ユーティリティを呼び出す代わりに、それを使用するように切り替えることsubprocessです。

sox以下は、パッケージを使用して例で必要なものを実現し(ドキュメントを参照)、 Python 2.73.4、および3.5のLinuxおよびmacOSで動作するはずです(Windows でも動作する可能性がありますが、テストできていません。 Windowsボックスにアクセスできません):

>>> import sox
>>> transformer = sox.Transformer()  # create transformer 
>>> transformer.trim(0, 15)  # trim the audio between 0 and 15 seconds 
>>> transformer.build('test.mp3', 'out.mp3')  # create the output file 

注:この回答は、メンテナンスされなくなったpysoxパッケージについて言及するために使用されていました。ヒントをくれた@erikに感謝します。

于 2012-10-21T16:56:03.287 に答える