独立成分分析による音源分離を Python で実装した

複数の音源が交じり合った混合信号から元の音源を推測して再合成することを音源分離といい、各音源についての事前情報を持たない場合を特にブラインド音源分離という。

音声情報を用いた応用アプリケーションを考えてみれば、声でコンピュータを操作したり、鼻歌で楽曲を検索したり、演奏から楽譜を自動生成したり、演奏の自動伴奏をしたりと様々なものが存在する。これらは、音声信号から分析した音高・発音時刻・音素に含まれる振幅伝達特性などの時系列的な変化を特徴量として利用することで実現されている。

入力音声の特徴量抽出の精度を向上させるためにも、入力音声からは予めノイズとなる雑音や特定の音源からの信号を取り除きたい。そこで音源分離の技術が利用される。

音源分離にはいくつかの手法があるが、ここでは独立成分分析 (ICA; Independent Component Analysis) による手法を Python で実装して試した。

実装コードと実験結果のデモ

ICA がなぜ音源分離に有効か、また ICA はどのようなアルゴリズムで実行されるかは、研究者の方がアップロードしていたスライド「音響メディア信号処理における独立成分分析の発展と応用」がとても分かりやすい。

なお ICA の適用条件における注意点として、ICA への入力には分離したい音源数以上の混合信号が必要になる。つまり分離したい音源数以上のマイク本数で録音する必要がある。

Jupyter Notebook ええぞ

もともと Python には不慣れだったが、Jupyter Notebook という Web ベースのインタラクティブなコード実行環境と、NumPy をはじめとする科学技術計算用ライブラリを使うことで、意外となんとかなった。

特に Jupyter Notebook はインタラクティブにコードを実行できるだけでなく、グラフ画像出力によるデータ可視化や音声データ再生ウィジェットが配置できるので、結果確認からの微調整という試行錯誤のイテレーションが極めてスムーズに行える。さらにドキュメンテーション機能を見れば Markdown による文章構造表現や MathJax による数式表現がサポートされているし、最終的には単一の HTML ファイルとして出力できる (画像や音声は Base64 エンコードされて埋め込まれる) ので、この手の実装実験レポートを作る場合には最高に便利。パワポとエクセルよりいいですよ。