2023年8月21日月曜日

pydubとMP3は相性が悪い

 作成した映像用のBGMを作成するためpydubを利用してmp3音声データを加工しています。簡単に説明しますと、1種類のBGM音源を複数結合して長尺にした後、いくつかのMP3効果音を必要なタイミングでoverrayして合成し、出来上がったものを完成版として保存します。効果音の必要なタイミングがプログラム的に割り出せているので映像加工ソフト使うよりこのほうが手間が無いんですよね。

 実際やってみてわかったことですが、メモリ消費と処理時間の2点問題があることがわかりました。
 まずはメモリ。pydubによる音声データの加工はとてつもなくメモリを消費することがわかりました。数分のBGMを結合して1時間程度にした後、効果音を適当に重ねるのですが、メモリ使用量が自分のマシンの搭載メモリ16Gまで一瞬で上昇し、ガベージコレクション的に開放される動きを処理が完了するまで繰り返します。とても1時間程度のMP3データを処理しているとは思えない消費っぷりです。ただし、それ以上の弊害はないのでメモリがあるだけ消費する仕様なんだと納得することにしました。

 もう1点は処理速度。MP3限定ですが、読み込み、書き込みに想像以上に時間がかかります。測定したサンプルは以下の通りです。Windows 10に標準で入っていた呼び出し音(10秒程度でWAVファイルでは800KByte)の読み込みと保存です。MP3の場合、読み込み、書き出し共に200msec程要していますが、wavに変換するだけで極端に高速化されます。処理速度にお困りの場合はwavに変換してから利用すると良いと思います。

from pydub import AudioSegment
from datetime import datetime

class Timer(object):
    def __enter__(self):
        self.st = datetime.now()
    def __exit__(self, *exc):
        print("{}ms".format((datetime.now() - self.st).microseconds / 1000))

with Timer(): # 400 - 500ms
    sound = AudioSegment.from_file("ring03.mp3", "mp3")
    sound.export("output.wav", format="mp3")

with Timer(): #   0 - 10ms
    sound = AudioSegment.from_file("ring03.wav", "wav")
    sound.export("output.wav", format="wav")

0 件のコメント:

コメントを投稿