oct2pyを使って独立低ランク行列分析の音源分離デモ(MATLAB)をPython上で動かした話

ブラインド音源分離手法の1つである独立低ランク行列分析(Independent Low-Rank Matrix Analysis; ILRMA)のデモスクリプトが、論文著者により公開されている。
github.com
上記スクリプトMATLAB/Octave用の言語で書かれているが、oct2pyにより(無理やり)Pythonで動かすスクリプトを書いてみた、というのが本記事の主旨である。

以下にPythonスクリプトを示す。オリジナルのMATLABスクリプトにおけるサンプリング周波数変更のためのresample関数をscipy.signal.resample_polyに変更したのが大きい。それ以外は行列のインデックスの調整が主であるが、MATLABにおけるtrueをoctave.logical(1)で置き換えたり、乱数のシードを固定するためにOctaveのseed関数を使うなどした。
gist.github.com

ピアノとドラム音からなる混合観測信号に対して音源分離を行った結果は以下のリンクから試聴できる。

いい感じに音源が分離できていることが分かる。

おまけ
  • ILRMAについて気になった読者はぜひオリジナルの論文にも目を通されたい:

D. Kitamura, N. Ono, H. Sawada, H. Kameoka, H. Saruwatari, "Determined blind source separation unifying independent vector analysis and nonnegative matrix factorization," IEEE/ACM Trans. ASLP, vol. 24, no. 9, pp. 1626-1641, September 2016.

  • 日本語論文は以下。

北村大地, 小野順貴, 澤田宏, 亀岡弘和, 猿渡洋, "独立低ランク行列分析に基づくブラインド音源分離," IEICE Technical Report, EA2017-56, vol. 117, no. 255, pp. 73–80, Toyama, October 2017

  • ILRMAの解説スライドは以下が参考になる。

www.slideshare.net

http://d-kitamura.net/pdf/misc/AlgorithmsForIndependentLowRankMatrixAnalysis.pdf

  • PythonライブラリのpyroomacousticsにはILRMAが実装されている:

Independent Low-Rank Matrix Analysis (ILRMA) — Pyroomacoustics 0.3.1 documentation