Python で音声データをリサンプリングするには resampy.resampleを使用します。
パラメータ
resampy.resample の主なパラメータは以下です。
パラメータ名 | データ型 | 概要 |
---|---|---|
x | np.ndarray | 入力データ |
sr_orig | int | 入力のサンプリングレート |
sr_new | int | 出力のサンプリングレート |
axis | int | リサンプルするデータの軸 |
filter | str | リサンプルで使用するフィルタ |
parallel | str | 並列計算の有効/無効 |
パラメータ名 | データ型 | 概要 |
---|---|---|
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 のパラメータはデフォルト値です。
パラメータ | 値 |
---|---|
データ長 | 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)