Wizard Notes

音楽信号解析の技術録、作曲活動に関する雑記

Python resampyで音声ファイルや音楽ファイルをリサンプリング

オーディオファイルのサンプリング周波数変換処理(リサンプリング)は非常によく利用する処理です。

信号処理のプログラムを書いていると、リサンプリングはなるべく高速に処理して欲しくなります。特に大量のデータを扱っている時や、時間的に長いオーディオファイルを扱う時に重要になります。

また、アンチエイリアシングフィルタ(アップ/ダウンサンプリングでエイリアシングのために用いるローパスフィルタ)等によっては、音質に違いが出ます。

今回紹介する Python のライブラリ resampy は、オーディオ信号向けの効率的なリサンプリング処理ができます。

Introduction — resampy 0.2.2 documentation

GitHub - bmcfee/resampy: Efficient sample rate conversion in python

なお、リポジトリの所有者はLibROSAのプライマリメンテナである bmcfee (Brian McFee)氏であり、resampyはLibROSAのオーディオファイルの読み込み関数librosa.load()でも利用されています。

Librosa

使い方

y = resampy.resample(x, sr_orig, sr_mod)

sr_origに入力するNumpy配列xのサンプリング周波数、sr_modにサンプリング周波数変換後のサンプリング周波数を与えます。

入力信号がステレオ信号のような複数チャネルの信号の場合、入力となるNumpy配列の形状は(チャンネル, サンプル数)となります。

また、キーワード引数filternum_zeroを与えることで、アンチエイリアシングフィルタの形状などを変更することができます。

以下、ドキュメントのAdvanced filteringからの引用です。

# Or a shorter sinc-filter than the default (num_zeros=64)
y = resampy.resample(x, sr_orig, sr_new, filter='sinc_window', num_zeros=32)

# Or use the pre-built high-quality filter
y = resampy.resample(x, sr_orig, sr_new, filter='kaiser_best')

# Or use the pre-built fast filter
y = resampy.resample(x, sr_orig, sr_new, filter='kaiser_fast')

ベンチマーク

以下の5パターンについて、処理時間と誤差(アップサンプリング後にダウンサンプリング)を計測してみました。

  • resampy.resample(x, sr_orig, sr_new)
  • resampy.resample(x, sr_orig, sr_new, filter='sinc_window', window=scipy.signal.hann)
  • resampy.resample(x, sr_orig, sr_new, filter='sinc_window', num_zeros=32)
  • resampy.resample(x, sr_orig, sr_new, filter='kaiser_best')
  • resampy.resample(x, sr_orig, sr_new, filter='kaiser_fast')

f:id:Kurene:20210201232238p:plain

f:id:Kurene:20210201232255p:plain

ベンチマークソースコード

seabornを使って少し綺麗なプロットにしてみました。