今回は音を対象とした非負値行列因子分解(NMF: Non-negative Matrix Factorization)の実利用をやっていきます。
誰でも手軽に音源分離デモができるようなモックを作成することを目標とします。
作ってみた結果
先に結果を...
簡単なグラフ描画プログラムを書いて描画してみました!
動画にしてデモを公開しております。
NMFとは?
以前書いた記事を見ていただければ良いかと思います。
#音をNMFでどう処理するの?
NMFの基本形は
V \approx WH
といった式で表すことができます。
音源分離をするにあたって、スペクトログラム行列Vにスパース性を仮定し、辞書行列Wと励起行列Hの積になるように分解します。辞書行列はVに含まれる音色のパワースペクトルを表現し、励起行列はWで表現している音色が時間軸に対してどれだけ含まれているかを表現します。
教師なしでも音源分離は可能ですが、今回は入力音に対して任意の音色を分離したいため、教師ありNMFを採用します。具体的には、辞書行列に任意の音色パワースペクトルを登録しておき、更新時は励起行列のみを更新するようにしました。
加えて、リアルタイムで音源分離を行うため、入力Vをスペクトログラム行列(周波数 x 時間)ではなく最新フレームのみのパワースペクトル行列(周波数 x 1)をVとします。
どんなものを作るか?
音源分離モックは以下の要件で作成しました。
- CUI上で動作
- リアルタイムで音源分離が可能
- 実行中に検出したい音源が変更・追加可能
- 音源分離結果をOSCで送信
実装自体は、上記リンク記事に記載しておいたNMF実装を音用に改造し、CUI上で動作できるようにしております。
ソースコード
今回実装は記事に載せておりませんが、Githubで公開しております。
詳しい環境設定やCUIの操作に関してはREADMEに記載しておりますので、ご参考になれば幸いです。
https://github.com/T-Sumida/RealTimeSoundSeprator
まとめ
リアルタイムで動作する音源分離モックを作成しました。
深層学習のようにめちゃくちゃ性能が良いわけではありませんが、学習プロセスなしで分離対象の音を追加できるのはメリットではないかと思ってます。
NMFも楽しいですが、仕事でやっているような機械学習系の話も今後書いていこうかと考えてます。