Skip to content

イントロダクション

libsonare とは?

libsonare は 音楽情報検索(MIR: Music Information Retrieval) のための音声解析ライブラリです。音声ファイルやストリームを入力すると、テンポ(BPM)、キー、コード進行、ビート位置、楽曲構造などの音楽的な情報を自動的に抽出できます。

C++17 で書かれており高速に動作するほか、WebAssembly にコンパイルできるため、サーバーを介さずブラウザ上で直接同じ解析を実行できます。

WebAssembly とは?

WebAssembly(WASM)はウェブブラウザ上でネイティブに近い速度で実行されるバイナリ命令形式です。C++ などの言語で書かれたコードをコンパイルし、サーバーやインストールなしにブラウザ上で実行できます。libsonare はこれを活用して、C++ レベルの音声解析パフォーマンスを Web アプリケーションに直接提供します。

音楽情報検索(MIR)とは?

音楽情報検索(MIR)は、音楽から意味のある情報を抽出する研究分野です。人間は曲を聴くだけでテンポを感じ取り、コードの変化を認識し、楽曲の構造を把握できます。MIR はこれと同じことをコンピュータで実現することを目指しています。

代表的な MIR タスク:

タスク回答する問い
テンポ推定この曲の速さは?(例:120 BPM)
キー検出この曲の調は?(例:ハ長調)
ビート追跡ビートの正確なタイミングは?
コード認識いつ、どのコードが鳴っている?
構造解析Aメロ、サビ、ブリッジはどこ?
ピッチ追跡歌われている・演奏されている音は?

libsonare はこれらすべての機能を単一のライブラリで提供します。

誰のためのライブラリ?

libsonare は音楽関連アプリケーションを開発するデベロッパー向けに設計されています。

  • Web アプリ開発者 — バックエンドなしで音声解析機能をアプリに追加できます。DJ ツールの BPM 検出、練習アプリのコード表示、自動楽曲構造ビューアなど、すべてブラウザ上の WebAssembly でクライアントサイド実行可能です。

  • 音楽ツール制作者 — DAW プラグイン、コード検出器、自動採譜ツール、音楽教育ソフトウェアを構築できます。libsonare が解析エンジンを提供するので、ユーザー体験の構築に集中できます。

DAW とは?

DAW(Digital Audio Workstation)は音声の録音・編集・制作を行うソフトウェアです。Ableton Live、Logic Pro、FL Studio、GarageBand などが代表例です。DAW プラグインはこれらのアプリケーションにエフェクト、楽器、解析ツールなどの機能を追加する拡張モジュールです。

  • 音声研究者 — Python で librosa を使用している方に、互換性のある API とアルゴリズムを提供しつつ、ネイティブ C++ 速度(librosa より数十倍高速)で動作し、ブラウザでも実行できます。CPU自動検出による並列解析により、マルチコア環境で最大限のパフォーマンスを発揮します。

  • ゲーム / インタラクティブメディア開発者 — ストリーミング API を使って、リズムゲーム、音楽ビジュアライザー、アダプティブオーディオシステム向けにリアルタイム音楽解析が可能です。

音声解析の仕組み

音声解析は一発でできるものではなく、各段階が前の段階の出力を利用する パイプライン です。この流れを理解すると、libsonare が内部で何をしているのか、なぜ特定の機能が他の機能に依存するのかが見えてきます。

音声波形

スペクトル解析(STFT)

特徴量抽出(クロマ、オンセット包絡線、メルスペクトログラム、...)

音楽解析(キー、コード、BPM、ビート、セクション、...)

ステージ 1: スペクトル解析

生の音声は時間に沿った振幅値の列、つまり波形です。音楽的な意味を抽出するには、まずこれを スペクトログラム に変換します。短時間フーリエ変換(STFT)を使い、音声を短いオーバーラップする窓に分割し、各窓の周波数成分を計算します。結果は「各時刻にどの周波数がどれだけ含まれているか」を示す 2 次元マップになります。

フーリエ変換とは?

フーリエ変換は信号をその構成周波数に分解する手法です。プリズムが白色光を虹色に分けるようなものです。音声は様々な周波数(正弦波)が異なる振幅で重ね合わさったもので、フーリエ変換によってどの周波数がどの程度含まれているかがわかります。短時間フーリエ変換(STFT)はこれを音声の重なり合う窓に繰り返し適用することで、周波数成分の時間変化を可視化します。

このスペクトログラムが、以降すべての解析の基盤です。

ステージ 2: 特徴量抽出

スペクトログラムから、libsonare は音声の特定の側面を捉えるための 特徴量 を計算します:

  • クロマ — すべての周波数を 12 のピッチクラス(C, C#, D, ..., B)に畳み込み、各時刻でどの音が目立っているかを示します。キー推定とコード解析の基盤です。
ピッチクラスとは?

ピッチクラスは同じ音名のすべてのオクターブをまとめたグループです。例えば、C2、C3、C4 などすべての「ド」はピッチクラス「C」に属します。西洋音楽には 12 のピッチクラスがあります:C, C#, D, D#, E, F, F#, G, G#, A, A#, B。クロマ特徴量はオクターブを無視して、これら 12 クラスのエネルギー分布として音声を表現します。

  • オンセット包絡線 — フレーム間のスペクトルエネルギーの変化量を測定し、新しい音や打撃音の開始点を強調します。ビート・リズム解析の入力になります。
オンセットとは?

オンセットとは音楽的イベントの始まり、つまり音が鳴り始める瞬間です。鍵盤を叩いた瞬間、ドラムを打った瞬間、新しい音が始まった瞬間がオンセットです。オンセット包絡線はこれらの瞬間にピークを持つ連続曲線で、そのピークを検出することで個々の音の発音タイミングを特定でき、テンポ推定やビート位置の特定に繋がります。

  • メルスペクトログラム — スペクトログラムをメル尺度に再マッピングします。メル尺度は人間のピッチ知覚に合わせたもので、200 Hz と 400 Hz の差と 2000 Hz と 4000 Hz の差を同じ「距離」として扱います。オーディオ ML で広く使用されます。
メル尺度とは?

メル尺度はピッチの知覚的な尺度です。人間は周波数を線形には知覚しません — 100 Hz から 200 Hz への変化は大きく感じますが、5000 Hz から 5100 Hz はほとんど同じに聞こえます。メル尺度は高い周波数を圧縮してこの知覚に合わせます。メルスペクトログラムはこの尺度を周波数軸に使用するため、人間の聴覚に関連するタスクにより適しています。

  • MFCC(メル周波数ケプストラム係数) — メルスペクトログラムから導出されるスペクトル形状のコンパクトな表現。音色や音楽テクスチャの分類に有用です。
音色(ティンバー)とは?

音色とは、同じ音の高さ・同じ音量でもピアノとギターの音が異なって聞こえる要因のことです。音の「色」や「質感」とも言え、倍音の相対的な強さによって決まります。MFCC はこのスペクトル形状をコンパクトに表現するため、異なる楽器、声、音の種類を区別するのに有用です。

  • CQT / VQT — 標準 FFT では周波数分解能が均一ですが、これらの変換は音楽的なピッチに対応した分解能を持ちます。
なぜ音楽のピッチには特別な周波数分解能が必要?

音楽の音は対数的に配置されています — 各オクターブで周波数が倍になります(A3 = 220 Hz、A4 = 440 Hz、A5 = 880 Hz)。標準 FFT は等間隔の周波数ビンを使うため、低音の区別が不十分で高音では無駄に分解能が高くなります。定Q変換(CQT)はビンを対数的に配置して音楽のピッチに合わせ、オクターブあたり均等な分解能を提供します。可変Q変換(VQT)はこれを拡張し、分解能を調整可能にしたものです。

これらの特徴量は単体でも有用です(例:メルスペクトログラムを機械学習モデルに入力)が、次のステージの高レベル解析への入力としても機能します。

ステージ 3: 音楽解析

多くのユーザーが求める高レベルの結果は、ステージ 2 の特徴量の 上に 構築されます:

解析構築元処理内容
キー検出クロマ → Krumhansl-Schmuckler アルゴリズムクロマプロファイルをキーテンプレートと比較し調を判定(例:「イ短調」)
コード認識クロマ → テンプレートマッチングクロマフレームを 108 種類のコード型テンプレートと照合し時系列コードを識別
BPM 検出オンセット包絡線 → テンポグラム + 自己相関オンセット強度の周期的パターンを見つけてテンポを推定
ビート追跡オンセット包絡線 → 動的計画法リズムの規則性を最適化して正確なビート位置を特定
セクション検出クロマ + スペクトル特徴量 → 自己類似性解析音楽的性格が変わる境界を検出し、イントロ・Aメロ・サビ等に分割
ピッチ追跡波形 → YIN / pYIN アルゴリズムモノフォニック音声の基本周波数(F0)を推定しメロディを抽出
テンポグラムとは?

テンポグラムは時間-テンポ表現で、各時刻における異なるテンポ候補の強さを示します。オンセット包絡線の周期的パターンを自己相関(信号が時間シフトした自分自身とどれだけ似ているかを測定)で分析して算出します。テンポグラムのピークが支配的なテンポを示します。

自己類似性解析とは?

自己類似性解析は楽曲の各部分を他のすべての部分と比較し、任意の 2 つの時点がどれだけ似ているかを示す行列を構築します。ポップスでは、サビ同士は似ている傾向がありますがAメロとは異なります。この行列のブロック状パターンを見つけることで、libsonare は音楽がある構造から別の構造に移行するセクション境界を特定できます。

基本周波数(F0)とは?

基本周波数(F0)は周期的な音の最も低い周波数で、知覚されるピッチを決定します。歌手が A4 の音を歌うとき、F0 は 440 Hz ですが、多くの高次倍音(880 Hz、1320 Hz、...)も同時に存在します。YIN や pYIN などのピッチ追跡アルゴリズムはこの F0 を時間軸に沿って推定し、音声からメロディラインを抽出します。

この階層的な設計により、libsonare は結果だけでなく各段階を公開しています。低レベルの特徴量を独自の解析に使ったり、ML パイプラインに組み込むことが可能です。

オーディオエフェクト

libsonare はスペクトル表現を操作する音声処理機能も提供します:

  • HPSS(調波打撃音分離) — スペクトログラム上のメディアンフィルタリングにより、音声を調波成分(メロディ)と打撃成分(リズム)に分離。解析精度向上の前処理としてよく使用されます。
調波成分と打撃成分とは?

スペクトログラム上で、調波的な音(ボーカル、弦楽器、持続音)は水平線として現れます — 時間にわたって安定した周波数を維持するためです。打撃的な音(ドラム、クリック、過渡音)は垂直線として現れます — 多くの周波数を含みますが瞬間的にしか存在しません。HPSS はこの違いをメディアンフィルタで利用します:水平方向のメディアンフィルタが調波部分を、垂直方向のメディアンフィルタが打撃部分を抽出します。

  • タイムストレッチ — STFT の位相を操作してピッチを変えずにテンポを変更。
  • ピッチシフト — テンポを変えずにピッチを変更。

リアルタイムストリーミング

StreamAnalyzer は同じパイプラインを音声 チャンク単位 で低レイテンシ実行し、リアルタイム可視化やライブ解析に適したフレーム単位の特徴量を出力します。Web Audio API の AudioWorklet と統合してブラウザ内リアルタイム処理が可能です。

プラットフォーム対応

プラットフォームインターフェースユースケース
ブラウザJavaScript/TypeScript(WebAssembly)Web アプリ、クライアントサイド解析
Node.jsJavaScript/TypeScript(WebAssembly)サーバーサイド処理
Linux / macOSC++ネイティブアプリ、CLI ツール
Pythonpip install libsonareスクリプト、研究、CLI
その他(C API 経由)C他言語との FFI 連携

WebAssembly ビルドは外部依存なしで約 508 KB(gzip 圧縮時約 196 KB)です。

librosa との関係

librosa は MIR コミュニティにおけるデファクトスタンダードの Python ライブラリです。libsonare は Python が使えない環境やパフォーマンスが重要な場面向けの 互換代替ライブラリ として設計されています:

サンプルレート、FFT サイズ、ホップ長とは?

音声解析の基本パラメータです。サンプルレート は音声が 1 秒あたり何回の振幅測定値を持つかを示します(例:CD 品質は 44,100 Hz)。FFT サイズ(n_fft)は各解析窓のサンプル数で、大きい窓ほど周波数分解能が高くなりますが時間分解能は低下します。ホップ長 は窓を何サンプルずつ移動させるかで、小さいホップほど時間的な詳細が得られますが計算量が増えます。libsonare はサンプルレート 22,050 Hz、FFT サイズ 2,048、ホップ長 512 をデフォルトとし、librosa と一致しています。

  • デフォルトパラメータ(サンプルレート、FFT サイズ、ホップ長など)が librosa と完全一致
  • コアアルゴリズム(STFT、メルスペクトログラム、MFCC、クロマ)が数値的に互換性のある結果を出力
  • 関数名と API パターンを意図的に類似させ、移行を容易に

さらに libsonare は librosa の範囲を超えた コード認識セクション検出音色解析リアルタイムストリーミング も提供します。これらは Python エコシステムでは通常別々のツールとして提供される機能です。

詳細な比較と移行ガイドは librosa 互換性 を参照してください。

次のステップ