Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

ロバスト主成分分析(Robust PCA)によるメロディ・歌声抽出(Python実装)

概要

以前から気になっていた、 Robust PCAによる歌声抽出 *1 を実装し、実際の楽曲でボーカル抽出をやってみました。

Robust PCAについて

Robust PCAによる歌声抽出では、楽曲を表す行列\({\bf X}\)を低ランク行列\({\bf L}\)とスパース行列\({\bf S}\)の和で表現するモデルを考えます。(それぞれ時間周波数領域での振幅信号)

従って、\({\bf X}={\bf L}+{\bf S}\) という制約化で、それぞれ低ランク、スパースな\({\bf L}\)と\({\bf S}\)を求める最適化問題を解くことになります。 詳しくは参考文献をご参照ください。

楽曲信号は、伴奏は同じような音色・音高が繰り返し使われているような構成となっていますが、歌声はそれとは逆の特徴を持っています。そのため、楽曲信号に対してRPCAを適用することで、伴奏と歌声がそれぞれ低ランク行列、スパース行列として抽出されることが期待できます。

実装

github.com

実験結果

まとめ

RPCA単体でも、品質はそれほど高くないですが、ボーカル抽出ができることを確認しました。音高・音の長さに関する解析には十分に使えそうです。 最近だと、データセットさえあれば深層学習(U-Netなど)でかなり高品質なボーカル抽出ができるので、そちらもいつかチャレンジしてみたいと思います。 qiita.com