Python で音声データのリサンプリング(resampy.resample)

Python で音声データをリサンプリングするには resampy.resampleを使用します。

パラメータ

resampy.resample の主なパラメータは以下です。

resampy.resample(x, sr_orig, sr_new, axis=-1, filter='kaiser_best', parallel=False)
表:soundfile.writeのパラメータ
パラメータ名 データ型 概要
x np.ndarray 入力データ
sr_orig int 入力のサンプリングレート
sr_new int 出力のサンプリングレート
axis int リサンプルするデータの軸
filter str リサンプルで使用するフィルタ
parallel str 並列計算の有効/無効
表:resampy.resample の返り値
パラメータ名 データ型 概要
y np.ndarray リサンプリング後の出力データ

主な使用例

モノラルデータのリサンプリング

モノラルデータをリサンプリングするソースコードは以下です。Fs=48kHz の 3 秒のデータを処理した場合の print 文を記載しています。

import resampy
import soundfile as sf

fs_new = 16000

# WAVファイルを読み込む
x, fs = sf.read("input.wav")
print(x.shape)
#(144000, )

# リサンプリング
y = resampy.resample(x, sr_orig=fs, sr_new=fs_new)
print(y.shape)
#(48000, )

# WAVファイルを書き込む
sf.write("output.wav", y, fs_new)

resampy.resample(x, sr_orig=fs, sr_new=fs_new) のように入力データ入力データのサンプリングレート出力データのサンプリングレートを入力すれば、リサンプリングしたデータ y が出力されます。

ステレオデータのリサンプリング

ステレオデータをリサンプリングするソースコードは以下です。

import resampy
import soundfile as sf

fs_new = 16000

# WAVファイルを読み込む
x, fs = sf.read("input_st.wav", always_2d=True)
print(x.shape)
#(144000, 2)

# リサンプリング
y = resampy.resample(x, sr_orig=fs, sr_new=fs_new, axis=0)
print(y.shape)
#(48000, 2)

# WAVファイルを書き込む
sf.write("output_st.wav", y, fs_new)

resampy.resample(x, sr_orig=fs, sr_new=fs_new, axis=0) におけるaxis=0 でリサンプルするデータの軸を指定します。

ステレオデータだけでなく、多チャンネルのデータも上記のソースコードでリサンプリングできます。

リサンプリングフィルタ

resampy.resample では引数 filter でリサンプリングに使用するフィルタを以下の3つから選ぶことができます。

  • kaiser_best:デフォルトで使用されるフィルタ
  • kaiser_fast:kaiser best よりも品質は落ちるが計算速度が速いフィルタ
  • sinc_window:窓関数法で作成されるフィルタ

sinc_window については、窓関数やフィルタの大きさを引数で指定してカスタマイズできます。

フィルタの特性

選択できる3つのフィルタの振幅特性は下図のようになります。sinc_window のパラメータはデフォルト値にしています。

図:各フィルタの振幅特性
図:各フィルタの振幅特性

遷移域の急峻具合から、フィルタの振幅特性においては sinc_window > kaiser_best > kaiser_fast の順で特性が良さそうです。ただ、sinc_window はリプルが出てしまうという欠点があります(窓関数がデフォルトのハン窓の場合)。

処理速度

以下の入力WAVデータを各フィルタで16kHzにリサンプリングしたときの処理時間を3回測定して、その平均処理時間を測定しました。sinc_window のパラメータはデフォルト値です。

表:処理速度の測定で使用したWAVデータ
パラメータ
データ長 1時間(48k x 3600 x 3 Byte)
サンプリングレート 48 kHz
ビット深度 24 bit
チャンネル数 モノラル
データ中身 ホワイトノイズ

測定結果は以下のようになりました。

表:各フィルタの計算速度
フィルタ 計算時間
kaiser_fast 14.7 s
kaiser_best 32.7 s
sinc_window 37.5 s

処理速度においては kaiser_fast > kaiser_best > sinc_window の順で処理時間が速くなっています。

フィルタの特性と処理速度から、基本的には "kaiser_best" で良いと思いますが、高周波数の減衰を気にしない場合は "kaiser_fast" でも良いのかなと思います。

"sinc_window"についてはフィルタ特性でリプルがあるのが気になるため、使わないほうがよさそうに思います。カスタマイズすればよりよい特性になりそうですが、少しメンドクサそうです。

おわりに

本記事では、音声データをリサンプリングする関数 resampy.resample について紹介しました。音声データを扱う場合、リサンプリングする機会が多いと思いますので、Pythonで音声データを使う人は覚えておくとよい関数だと思います。

■参考文献
[1] Brian McFee.  “Introduction-resampy”.  Read the Docs.  2016. 
https://resampy.readthedocs.io/en/stable/,  (参照2025-08-15)