Audio Decomposition - 音楽を音符と楽器に分離するオープンソース
(matthew-bird.com)- Audio Decomposition は、音楽を楽譜に起こすために、オーディオを構成する音符と楽器に分けようとするオープンソースプログラム
- 楽器サンプルは University of Iowa Electronic Music Studios instrument database から取得し、各波形のフーリエ変換とエンベロープを保存して比較基準として使用する
- 音楽ファイルを0.1秒単位で解析して スペクトログラム を作成し、保存済みの楽器別フーリエ変換を組み合わせて、その区間における楽器別の大きさを推定する
- エンベロープ解析では attack・sustain・release 区間と静的/動的な減衰を分けたうえで、フィルタリングされた音符帯域から楽器別のコストを計算する
- 結果はオーディオの再生成ではなく、matplotlib の散布図 で楽譜のように表示する方式を採り、問題解決と疎なデータの表示を容易にしている
楽譜変換のためのオーディオ分解
- Audio Decomposition は、音楽を楽譜に変換するプログラムを作るという目標から始まった
- 個人的に音楽を楽譜に起こしたいと考えており、オープンソースで単純なオーディオソース分離アルゴリズムが不足していると感じたことが動機になった
- デモ動画は YouTube で公開されている
- GitHub リポジトリは mbird1258/Audio-Decomposition
- 楽器サンプルは University of Iowa Electronic Music Studios instrument database から取得している
- 各ファイルについて、波形全体の フーリエ変換 と エンベロープ を計算して保存する
0.1秒単位のフーリエ変換
- 楽器の音は主に フーリエ変換 とエンベロープで特徴づけられると考え、この2つの情報を使って、どの楽器がどの音を出しているかを推定する
- 音楽ファイルは0.1秒ごとにフーリエ変換を実行し、スペクトログラム の形で処理する
- 各0.1秒区間のフーリエ変換を再現するために、保存済みの楽器別フーリエ変換を足し合わせる
- 楽器別の大きさは、MSE コスト関数 の周波数別偏微分から得られる行列を解いて計算する
- 行列の各行は cello、piano など各楽器に対する偏微分に対応する
- 例は、5Hz のフーリエ変換値のような周波数別の値に対するコスト計算
エンベロープと音の区間分離
- エンベロープは波形の 上限線 であり、既存の関数がノイズや特定の波形でうまく動作しない場合があるため、別の方式を使用する
- 計算過程は、波形をチャンクに分けたうえで各チャンクの最大値を取る方式
- その後、エンベロープが元の波形より低い地点を探して新しい点を追加し、結果を整える
- エンベロープは attack、sustain、release に分ける
- attack: 音の立ち上がり
- sustain: 音が維持される区間
- release: 音が止まる区間
- 楽器サンプルでは、最初のゼロでない値を attack の開始点として使う
- attack と sustain の境界は、関数が初めて下に凹む、または減少する地点とする
- sustain と release の境界は、末尾から見て、関数が増加するか下に凹む最初の地点とする
- release の終端は、末尾から見て最初にゼロでない地点として見つける
減衰タイプと楽器マッチング
- 波形の主な形を区別するために、静的減衰 と 動的減衰 を考慮する
- piano のような一部の楽器は、おおむね指数減衰の形に従う静的減衰を持つ
- violin のような一部の楽器は、sustain 中にも音量が増加または減少することがある
- 楽器サンプルの中には、音が自然に消えるまで維持されたファイルもあれば、早めに release されたファイルもある
- 減衰が静的か動的かは、減衰係数が1より大きいか、減衰曲線から大きく外れすぎているかで区別する
- エンベロープが release を持つか、つまり AS か ASR かは、sustain と release の平均変化率を比較して判断する
- release の変化率がより低ければ、release がないものとみなす
- 音楽ファイルの処理では、各音符周波数に対して バンドパスフィルタ を適用する
- フィルタリングされた波形について各楽器を順に調べ、正規化された attack と release の相互相関を計算して、音の開始と終了を見つける
- その後、楽器波形とフィルタリングされたオーディオの MSE を計算し、その時点での楽器コストとして使用する
- 最終的な大きさは、フーリエ変換段階の大きさとエンベロープ段階の
1 / コストを掛け合わせて計算する
散布図ベースの結果表示
- 結果は matplotlib の scatter plot を使い、
-形の点で楽譜のように表す - 当初は計算された大きさからオーディオを再生成しようとしたが、問題が多く時間もかかり、デバッグも難しかった
- matplotlib の imshow も試したが、ほとんどの値が0である状況では非常に非効率だった
- 画面を移動したり拡大・縮小したりする際、画面に表示されているかどうかに関係なく、すべての点を再描画する必要があったため
- 結果的に、楽譜の再現をより良くするために使うことができ、特に正しいピッチやコードを見つけるのが難しい場合に役立つ
- 例として、YouTube 動画 をもとに Noteflight の楽譜 を再現するのに使用した
- 実行時間も長すぎるほどではない
1件のコメント
Hacker News の意見
タイトルが少し紛らわしい。open-source separation と書くとソース分離(source separation)のように読めるが、実際にはそれではなく ピッチ検出アルゴリズムで、検出したピッチがどの楽器から出たものかを分類する方式
かなり見事だが、本当に正確な結果が必要なら、出力を直す時間が手作業でやるより長くかかるかもしれないように見える
その年齢で作った成果としては驚き
音楽家が単一のオーディオファイルから、ミキシング前の元トラックに近いもの、つまりステムを復元しようとするときは、後者をよりよく聞く気がする
記事で直接言及されているのは見なかったが、興味のある人にとっては 自動採譜、つまりオーディオを MIDI に変換する分野は、ディープラーニングと音楽情報検索の中でかなり大きなサブ分野
マルチトラック音楽採譜でも成功したモデルが複数あり、Google の MT3 プロジェクトがある: https://research.google/pubs/mt3-multi-task-multitrack-music...
ピアノ採譜の場合は、非常に低品質なオーディオでも、今ではほぼ完璧に近い精度まで来ている: https://github.com/EleutherAI/aria-amt
ちなみに上記リポジトリの作者です
オーディオ-MIDI 採譜器はピッチと開始時刻はうまく当てるが、長さと強さはずっと不安定
もっと簡単に使えるように、彼らの Colab をランタイムとして移植したが、MIDI 出力はかなり奇妙だった
単純なステムを入れても、一部のトラックは MIDI 出力とオーディオがうまく合わず、タイミング問題があって使い物にならないレベルで、別のオーディオではそれなりに動くこともあった
オーディオ分離や ステム分離に興味があるなら RipX を見る価値がある: https://hitnmix.com/ripx-daw-pro/
分離したトラックを MIDI ファイルとしてエクスポートすることもできる。まだ多少問題はあるが、かなりうまく動く
ステム分離は今や音楽ソフトウェアの標準機能になりつつあり、ほぼすべての DAW が提供している
自分の作業には moises が使いやすかった: https://moises.ai/
曲全体の移調やタイムストレッチに対応し、ステム分離とトラックごとのミュート・音量調整のためのシンプルなインターフェイスがある。拍子とコードを自動検出する
関係者ではなく、曲を覚えて練習するためにほぼ毎日使っている満足したユーザー。元のベースパートを大きくし、残りは音量を 10% 未満に下げてベースをはっきり聴くのだが、オンライン楽譜が有料のものも含めてどれほど頻繁に間違っているかがよく分かる。パートを覚えた後はベースをミュートし、原曲に合わせてベーシストのように演奏する
0: https://www.stemroller.com/
Ableton Live - なし
Bitwig - なし
Cubase - なし
FL - あり
Logic - あり
Pro Tools - なし
Reason - なし
Reaper - なし
Studio One - あり
Polymath は MP3 から個別の楽器トラックを分離・抽出するのに効果的で、とてもよく動く
本当に素晴らしいが、単純なフーリエ変換テンプレートでは捉えられない実際の楽器物理がある。例えばトランペットは同じピッチでも、弱く吹くときと強く吹くときで倍音スペクトルが大きく変わり得る
トランペットは強い倍音を持つ豊かな倍音列を作るため、フーリエ変換では基本周波数の整数倍に目立つピークが現れる。フルートのような楽器はより純粋なトーンを出すが、金管楽器は一般により高い倍音が強いので、記事に出てくる行列方程式の偏微分もより複雑になるはず
このスクリプトは帯域通過フィルタリングとアタック・リリースエンベロープの相互相関で音のタイミングを特定する。金管楽器は演奏の強さによって倍音構成が大きく変わる非線形な挙動を示すことがあるため、pp と ff で明るさが変わる場合にこのアルゴリズムがどう扱うのかはよく分からない。精度を上げるなら、楽器ごとに強度依存フーリエテンプレートを追加することを検討する
楽器が典型的な音を出していなかったり、楽器間の分離が最大化されるように演奏・ミキシングされていないバンドでは、こうしたモデルはどれもうまく動かない。例えば、歪んだ倍音を持つエレキギターがボーカルと同じ音を弾き、ドラマーはシンバルで鋭いノイズだけを出し、ベーシストは楽器でキックドラムのような打撃音を真似る場合がある
こうした実験音楽ではソース分離の結果が完全に予測不能になり、音楽的なリバランスに使えることもあれば、使えないこともある
Joshua Bird の弟が作ったもののように見える。Joshua Bird も以前 HN に上がった印象的なプロジェクトをいくつか手がけていた: https://www.youtube.com/@joshuabird333
15年ほど前に Audiosurf をやっていた記憶がよみがえった。時間が経つのは早い
https://en.wikipedia.org/wiki/Audiosurf
自分の見間違いかもしれないが、YouTube のデモのどれも ソース分離を見せていないように思える
付け加えると、オーディオ研究におけるソース分離とは、オーディオを別々のクリップに分離することを指す
Ultrastar Deluxe の古くからのファンです。Singstar の オープンソースクローンで、人々が曲に合わせて歌いながら競うカラオケゲームです
歌っている音を認識して、その曲のボーカルのタイミング・マッピングファイルと比較し、メロディによりうまく合わせて歌うほど点数が高くなります。歌詞を正確に当てるかどうかは重要ではありません
ファン作成の曲マッピングライブラリはたくさんありますが、それでも常に不足していて、英語・スペイン語以外の言語のマッピング済み曲は非常に少ないです。すべて手作業でマッピングするのは時間がかかりますし、自分自身もほとんど音痴なのでさらに難しいです
ずっと前から、このプロセスをもっと簡単に自動化できるソフトウェアは何だろうと気になっていましたが、このツールは原曲からボーカルのタイミングと音程を取り出すのにとても良さそうです
いつか自分の母語で Singstar のプレイリストを作り、友人たちと歌のパーティーを開くのがバケットリストに入っています。似たようなツールのおすすめがあれば知りたいです
テキストファイルにはタイムスタンプとともにボーカル・ピッチが必要そうで、AI がその生成を自動化できるレベルに近づいているようです
さらに読んでみるために、今見つけたリンクを残しておきます: https://www.reddit.com/r/karaoke/comments/x61kzy/modern_equi...
私には、一部の動画には 音声がない ように見える