Pyroomacoustics はPython向けの音響アレイ信号処理のラピッドプロトタイピングプラットフォームです。
Pyroomacoustics の便利な機能の一つとして、僅かな行数のスクリプトで多面体の部屋の室内インパルス応答 (RIR) を生成することができます。
本記事では、Pyroomacoustics を使ったRIRの生成方法を紹介します。
インパルス応答の生成スクリプト
import numpy as np import soundfile as sf import matplotlib.pyplot as plt import pyroomacoustics as pra # パラメタ fs = 44100 # サンプリング周波数 absorption = 0.2 # 反射率 max_order = 10 # 次数 # 3次元の部屋形状生成 corners = np.array([[0,0], [0,3], [5,3], [5,1], [3,1], [3,0]]).T room = pra.Room.from_corners( corners, max_order=max_order, fs=fs, absorption=absorption ) room.extrude(2.) # 高さを設定 # 音源位置を設定 room.add_source([1., 1., 1.]) # マイク位置を設定 room.add_microphone([1., 0.7, 1.2]) # 部屋形状、音源・マイク位置プロット fig, ax = room.plot() ax.set_xlim([0, 5]) ax.set_ylim([0, 3]) ax.set_zlim([0, 2]) plt.show() # インパルス応答を計算 room.compute_rir() # インパルス応答の波形データを保存 ir_signal = room.rir[0][0] ir_signal /= np.max(np.abs(ir_signal)) # 可視化のため正規化 sf.write(f"ir{fs}.wav", ir_signal, fs) # IRプロット room.plot_rir() plt.show()
部屋が単純な直方体を作る場合、以下のようにxy座標を指定するだけでroom
オブジェクトを作ることもできます。
# 3次元の部屋形状生成 room = pra.ShoeBox( [5.0, 6], max_order=8, fs=fs, absorption=0.8 ) room.extrude(3.) # 高さを設定
インパルス応答の畳み込み
LibROSAの音声に対して、生成したインパルス応答を畳み込みます.
import scipy import librosa x, sr = librosa.load(librosa.ex('libri1', hq=True), sr=fs, mono=True) x_filtered = scipy.signal.oaconvolve(x, ir_signal, mode="full") sf.write(f"test_x.wav", x, fs) sf.write(f"test_x_filtered.wav", x_filtered, fs) print(x.shape, x_filtered.shape) plt.subplot(2,1,1) plt.plot(x) plt.xlim([0, 700000]) plt.ylim([-1.0, 1.0]) plt.grid() plt.title("x") plt.subplot(2,1,2) plt.plot(x_filtered) plt.xlim([0, 700000]) plt.ylim([-1.0, 1.0]) plt.grid() plt.title("x_filtered") plt.tight_layout() plt.show()
参考文献
www.hiromasa.info https://mybinder.org/v2/gh/LCAV/pyroomacoustics/master?filepath=notebooks%2Fpyroomacoustics_demo.ipynbmybinder.org pyroomacoustics.readthedocs.io github.com
関連
GPUを用いた高速な鏡像法でのRIR計算用ライブラリ gpuRIR
についてまとめています。