Skip to content

セクションと構成 ​

セクション解析は、曲をイントロ、A メロ(Verse)、サビ(Chorus)、ブリッジ、間奏(Instrumental)、アウトロなどの長い音楽的なまとまりへ分割します。これは構成の推定であり、ナビゲーションや可視化に便利ですが、制作者のアレンジメモそのものではありません。

曲の中を移動したり、サビの前後にループ点を置いたり、構成の可視化を作ったりと、曲の大きな形のおおよその地図が必要な場面で使えます。

初学者向けに言うと、セクション解析は「曲の地図」を作る処理です。BPM やコードのように短い単位を見るのではなく、イントロ、A メロ、サビ、間奏のような大きなまとまりを推定します。

自己類似度行列を読む ​

中心的な道具は自己類似度行列(SSM)です。特徴量列のあらゆる時点を、あらゆる他の時点と比較します。

「曲のどことどこが似ているか」を見る表だと考えると読みやすくなります。

SSM 上の見え方意味
明るいセルこの 2 時点は似た響き
対角線上のブロックその区間の内部が一貫していて、1 つのセクションらしい
対角線から外れた縞離れた 2 つの時点が似ていて、繰り返しのサビや A メロらしい
繰り返しからセクションの一覧へ
自己類似度行列時間 →対角線から外れた繰り返しノベルティ検出されたセクションイントロABACA時間 →
  • 似た響きのフレーム
  • ノベルティ
  • 境界
各 A セクションは対角線上で自分自身と、そして対角線から外れた位置で他の A セクションと似ています。この対角線外のブロックが繰り返しの手がかりです。ノベルティ曲線は行列が前後でどれだけ急に変わるかを測ったもので、そのピークの位置に境界が置かれます。

特に重要なのは次の 2 つです。

  • ノベルティは、SSM が急に変わることです。境界を見つける手がかりになります。
  • 繰り返し は、離れた場所に似た素材が現れることです。再登場するセクションをまとめる手がかりになります。

ノベルティだけでは分割しすぎ、繰り返しだけでは一度きりのパートを見落とすため、libsonare は両者を組み合わせます。

まず境界 ​

libsonare はフレーム単位の特徴量を作り、自己類似度行列を計算し、ノベルティのピークを探してセクション境界を検出します。既定の特徴量ミックスは MFCC とクロマなので、音色変化、ハーモニー変化、またはその両方から境界が出ます。

minSectionSec(既定 4 秒)は 2 つの役割を持ちます。1 つはノベルティのピーク同士の間隔(上限は 2 秒なので、既定では 2 秒のまま)、もう 1 つはその後のマージ処理の基準です。マージ処理はこの値より短い区間をすべて隣接区間へ畳み込むため、返ってくるセクション長の実質的な下限になります。例外は、マージの結果として曲全体が 1 区間になった場合だけで、そのときは長さによらずそのまま返ります。先頭と末尾の区間はピークではなくファイルの端で区切られ、ごく短い編集、ドロップ、ピックアップ小節は単独では返らず隣接区間へ吸収されます。

ノベルティのピークは、曲全体の最大値ではなく、前後 referenceWindow 秒(既定 60、0 で相対しきい値を無効化)以内の最大ノベルティに対する threshold 倍以上に達したときに残ります。そのため、支配的な変化があっても、離れた場所にあるより弱いセクション変化が隠れません。窓内の他のどのイベントも 30% に届かない単独の突出イベント(この比率は固定で、threshold では動きません)は、基準を取るときに除外されるので、短く大きな音がその周囲のセクション変化をマスクすることもありません。analyzeSections は既定の referenceWindow を使います。threshold、absoluteThreshold、referenceWindow は detectBoundaries だけのオプションです。

長尺入力では、自己類似度行列がネイティブの整数インデックス上限を超えそうな場合に、境界検出器が特徴量列を平均プーリングします。境界の time は元音声のタイムライン上の秒数を保ちます。一方、非常に長いファイルでは frame フィールドがプーリング後の解析グリッドを指すため、UI のマーカー配置には frame ではなく time を使ってください。

境界検出の段階だけを、後続のラベル付けなしで取り出すこともできます。detectBoundaries / detect_boundaries は転換点に加えて、それを拾い出した元のノベルティ曲線も返します。自前のしきい値を当てたい呼び出し側に必要なのはこの曲線です。detectBoundaries(request) を参照してください。

次にラベル ​

ラベル付けの前に、クロマが区別できない隣接区間はマージされます。1 つの連続した音楽の内側に立ったノベルティのピークは、境界としては残りません。

境界が決まると、実装はいくつかの手がかりを使って各区間を分類します。

手がかり何を見分けるか
正規化したエネルギー区間のフレーム RMS の中央値を最も大きい区間で正規化した値。短く大きな音で、その区間が最も大きくなることはありません
他区間とのクロマ類似度同じハーモニー素材が別の場所にも現れるか
ボーカルらしさの記述子リードボーカルやそれに近い素材を含んでいそうか

典型的な結果はヒューリスティックです。

パターンなりやすいラベル
反復する、高エネルギーでボーカルらしい区間サビ
反復する、エネルギー低めの区間A メロ
低エネルギーの先頭/末尾の区間イントロ/アウトロ
ボーカルらしさの低い、一度きりの内側の区間間奏
ボーカルらしさが残る、一度きりの内側の区間ブリッジ

ボーカルらしさの低さはブリッジの根拠ではなく、むしろブリッジを外して間奏へ倒す根拠になります。

均質な素材には構成を与えない

繰り返しが根拠になるのは、繰り返すペアと繰り返さないペアが混在するときだけです。ほぼすべてのペアが互いの繰り返しと判定される状態、つまり均質な素材の見え方では、繰り返しは情報を持たないものとして扱われ、A メロ/サビの交替の根拠にはしません。同じ 8 小節を並べただけの素材は、完全な A メロ/サビ構成ではなくラベルなしで返ります。

これらのラベルは意図的にヒューリスティックです。曲の正式な構成名を断定するものではなく、見通しを与えるための推定です。

Unknown が返る 2 つの経路 ​

Unknown は「該当なし」ではなく 1 つの答えです。返ってくる経路は 2 つで、どちらも confidence は 0 なので、位置を見ればどちらに当たったかがわかります。

見え方何が起きたかどうするか
0 秒から曲の終わりまでの 1 区間、confidence 0境界が 1 つも残らなかった。どのノベルティピークも境界のしきい値(threshold 0.3 と absoluteThreshold 0.005。公開しているのは detectBoundaries だけ)を超えなかったか、マージですべてが 1 区間に畳まれた。単独の区間は自分自身のエネルギーで正規化されるため低エネルギーとは読まれず、どの分岐も名前を付けない。曲は分割されなかったものとして扱う。それでも構成を探したいなら detectBoundaries を呼び、ノベルティ曲線をより低いしきい値で読むか、minSectionSec を短くする。
複数区間のうち先頭または末尾、confidence 0低エネルギーではなく、他のどこも反復していない端の区間。いきなり始まる冒頭や、他とは違う声部で歌われる最後のサビ。反復する区間と内側の区間はすべて肯定的な分岐が引き受けるので、どの分岐も扱わない形はこれだけ。端の区間として保持する。位置そのものが情報になる。UI にラベルが必要なら手で付ける。

一度きりでボーカルらしい内側の区間、つまりブリッジの形は、Bridge という名前のまま返ります。音楽的な機能のラベルを断定しない下限は 0.55 で、4 つの機能ラベルすべてを守っていますが、分岐に入ったものはどれもこの値を上回ります。A メロとサビは 0.9 以上(0.5 に、0.8 以上の反復類似度の半分を加えた値)、間奏は 0.74 以上、ブリッジの分岐も、固定値ではなく区間から計算されたスコアで下限を超えます。つまりこの下限は、現状どの区間も引っかからない安全策であって、Unknown への 3 本目の経路ではありません。PreChorus には検出分岐そのものがないため、この値で絞り込んでも必ず空になります。

Unknown を除外すると曲の実体のある区間が落ちる

どちらの経路も、分類器が名前を付けなかっただけの音楽の区間であって、余りではありません。分類できなかった区間だけを外したい場合は、ラベルだけでなく上の表のとおり位置で判定してください。

結果が推定にとどまる理由 ​

構成は部分的に主観的です。サビが正確に「どこで始まるか」は人によって意見が分かれ、ジャンルによって手がかりも大きく違います(テクノとバラードでは別物です)。そのためセクション出力は、ナビゲーション・ループ・可視化のための強いヒントとして扱い、明確に繰り返すセクションを持つ音楽で最もよく効くと考えてください。通作形式(セクションを繰り返さずに展開し続ける構成)やアンビエントでは弱くなります。境界が数秒ずれることは珍しくないので、自動結果は手直しの出発点として使うのが安全です。

libsonare がどう計算するか

BoundaryDetector は MFCC とクロマ特徴量を組み合わせ、L2 正規化し、必要に応じて長尺入力を平均プーリングし、コサイン類似度による自己類似度行列を作り、チェッカーボード型のノベルティ曲線から境界ピークを選びます。SectionAnalyzer は境界を区間へ変換し、RMS エネルギー、クロマ記述子、スペクトル平坦度、ボーカル帯域エネルギーを計算したうえで、Intro、Verse、Chorus、Bridge、Instrumental、Outro、Unknown のラベルと信頼度を割り当てます。分類の前には 2 つのガードが働きます。merge_indistinct_sections は平均クロマで区別できない隣接区間をまとめ、繰り返しの手がかりはほぼすべてのペアで成立してしまう場合に割り引かれます。分類の後、kMinLabelConfidence(0.55)を下回る Verse、Chorus、Bridge、Instrumental はスコアを保ったまま Unknown に降格されますが、分岐に入ったものはどれもこの値を上回るため、この降格は安全策であって実際に通る経路ではありません。無音のファイルは正規化するエネルギーがないため、単独の区間が低エネルギーと読まれて Intro になります。section_at(time) はどの区間にも入らない時刻に対して start と end がともに 0 の空の Unknown を返しますが、これは検出結果ではなく検索の空振りです。SectionType のうち分類器の分岐を持たないのは PreChorus だけで、この値の switch 分岐は到達しないコードです。

関連: メル・MFCC・音色、クロマ特徴量、MIR の全体像