mcpField
S
Sheet Music OMR

Sheet Music OMR

ローカル
github.com/raulkiviメディア・デザイン12 日前に更新

Sheet Music OMR について

Sheet Music OMRは、印刷楽譜の写真やスキャン画像をMusicXMLに変換するMCPサーバーです。2種類の認識エンジンを選べ、AudiverisではSATB合唱譜の声部を分離できます。

主な機能

  1. 01写真やスキャン画像をMusicXMLに変換
  2. 02単ページと複数ページの楽譜に対応
  3. 03oemerとAudiverisを選択
  4. 04ファイルパスまたはインラインで出力
  5. 05依存関係とサーバー機能を確認

活用シーン

  1. 01印刷楽譜のスキャンをデジタル化
  2. 02複数ページの楽譜をMusicXMLに統合
  3. 03SATB楽譜を声部ごとに認識

MCP 対応

MCPサーバーとして、楽譜認識、機能一覧、ヘルスチェックのツールをクライアントに公開します。画像パスまたはBase64画像を受け取り、MusicXMLを返します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"raulkivi-omr": {
"command": "uvx",
"args": [
"omr-mcp"
],
"env": {
"OMR_AUDIVERIS_HOME": "<OMR_AUDIVERIS_HOME>"
}
}
}
}
起動コマンドuvx omr-mcp
設定が必要な環境変数
OMR_AUDIVERIS_HOMEDirectory Audiveris is downloaded to on first use (default ~/.cache/omr-mcp/audiveris)

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiomr-mcp0.2.2

ツール

6

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
imagestringはいファイルパスまたは base64 エンコードされた画像データ
engineenumいいえ使用する OMR バックエンド。'oemer'(デフォルト)は高速で、単段または二段の譜面に適しています。'audiveris' は、多段の合唱譜(SATB)を同時に演奏されるパートに正しく分離します。oemer はそれらを 1 つのパートにまとめるか、処理に失敗します。ただし、300 DPI 以上の元画像が必要で、初回使用時にかなり大きい(約 80 MB)エンジンをダウンロードします。oemer | audiveris
formatenumいいえ入力形式のヒント:'path' または 'base64'(省略時は自動検出)path | base64

詳細

omr-mcp

光学式楽譜認識(OMR)を使用して、楽譜画像をMusicXMLに変換するMCPサーバーです。

機能

印刷された楽譜の写真やスキャン画像を受け取り、MusicXMLドキュメントを返します。1ページの楽譜にも複数ページの楽譜にも対応しています。sheet-music-mcpパイプラインの後続処理に直接渡せます。

認識ツールでは、任意のengine引数で2つのOMRバックエンドを選択できます。

  • oemer(デフォルト)— 高速で、約100 MBのモデルチェックポイント以外の追加ダウンロードは不要です。1段または2段の楽譜に最適です。複数段の合唱譜(SATB)は1パートに統合されます(下記の「既知の制限事項」を参照)。
  • audiveris — 複数段のSATB楽譜を同時進行するパートに正しく分離します。300 DPI以上のソース画像と、初回使用時のより大きなダウンロード(約80 MB)が必要です。サブプロセスとして実行されます。

ツール

ツール説明
recognize_sheet1枚の画像(ファイルパスまたはbase64)をMusicXMLに変換します。大きな楽譜はmusicxml_pathとscore_summaryを返します(return:auto、path、inline)
recognize_sheet_to_file1枚の画像を変換し、MusicXMLをファイルに書き込みます。パスとscore_summaryを返します
recognize_sheets複数ページを処理し、1つのMusicXMLドキュメントに統合します(recognize_sheetと同じreturnモード)
list_capabilitiesサーバーのメタデータを返します:バックエンドのバージョン、入出力形式、利用可能なツール
list_supported_formats(非推奨 — list_capabilitiesを使用してください)対応する入出力形式を一覧表示します
health_checkすべての実行時依存関係が利用可能か確認し、人が読めるステータスの概要を返します。初回実行時に便利です

インストール

cd omr-mcp
uv sync

初回実行時に、oemerが約100 MBのモデルチェックポイントをダウンロードします。ダウンロードは一度だけ行われ、キャッシュされます。

クイックインストール: bash install.shを実行すると、すべてを1つのコマンドでセットアップし、そのまま貼り付けて使えるクライアント設定を表示します。SETUP.mdを参照してください。Claude Desktop、Cursor、Windsurf、Continue、Zed用の設定例はexamples/にあります。お困りの場合は、TROUBLESHOOTING.mdをご確認ください。

実行方法

uv run omr-mcp

環境変数は必要ありません。

Claude Desktopの設定

{
  "mcpServers": {
    "omr": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/omr-mcp", "run", "omr-mcp"]
    }
  }
}

使用例

// Recognize a single image file (default engine: oemer)
{"tool": "recognize_sheet", "arguments": {"image": "/path/to/scan.png", "format": "path"}}

// Recognize from base64-encoded image
{"tool": "recognize_sheet", "arguments": {"image": "<base64 data>", "format": "base64"}}

// Recognize a multi-staff SATB choir score with correct voice separation (300+ DPI source required)
{"tool": "recognize_sheet", "arguments": {"image": "/path/to/satb_scan.png", "engine": "audiveris"}}

// Process multiple pages into one score
{"tool": "recognize_sheets", "arguments": {"images": ["/path/page1.png", "/path/page2.png"]}}

// Always get the MusicXML text inline, however large (default "auto": a musicxml_path above 8 KB)
{"tool": "recognize_sheet", "arguments": {"image": "/path/to/scan.png", "return": "inline"}}

// Save result directly to file (output_path must lie inside SHEET_MUSIC_OUTPUT_ROOT)
{"tool": "recognize_sheet_to_file", "arguments": {"input_path": "/path/scan.png", "output_path": "score.musicxml"}}

大きな結果は{"musicxml_path": ..., "score_summary": {...}, "metadata": ...}の形式で返されます。ファイルは<SHEET_MUSIC_OUTPUT_ROOT>/scores/(デフォルト:サーバーの作業ディレクトリ)に保存されます。楽譜をコピーする代わりに、このパスをmusicxml_pathとして他のサーバーのツールに渡してください。

テスト

# Unit tests (fast, no model required)
VIRTUAL_ENV= .venv/bin/pytest tests/ -v

# Integration tests (~10 min one-time model-checkpoint download, then ~90-100s per page on CPU)
VIRTUAL_ENV= .venv/bin/pytest tests/ -v -m integration

テスト用サンプル

SATBアカペラのサンプルはtest_samples/pdmx_satb_samples/にあります。

pdmx_satb_samples/
├── mxl/    # MusicXML ground truth
├── pdf/    # PDF scores
└── png/    # PNG images (OMR input)

出典:PDMXデータセット — パブリックドメインの楽譜が25万件以上収録されています。

依存関係

  • oemer — デフォルトのディープラーニングOMRエンジン(UNet + SVM、ONNX Runtime)
  • onnxruntime>=1.30 — 1.19より後のリリースでは、oemerのunet_bigチェックポイントに含まれる負のConvTransposeパディングが拒否されます。各認識の前にonnx_compat.pyがこれらを同等のoutput_paddingに書き換えます(onnxが必要です)。これによりPython 3.11~3.14で使用できます(注意事項はdocs/HANDOVER.mdを参照)
  • opencv-python-headless==4.10.0.84 — バージョンを固定しています。5.xではcv2.HoughLinesP()の戻り値の形式が変更され、oemerの五線抽出でエラーが発生します(pyproject.tomlのコメント/docs/HANDOVER.mdの注意事項を参照)
  • Pillow — 画像の読み込みと検証
  • defusedxml — 安全なXML解析
  • mcp — MCPプロトコル
  • Audiveris — オプションの代替OMRエンジン(engine="audiveris")。Pythonの依存関係ではありません。初回使用時に自動ダウンロードされる、単体で動作するバイナリです(独自のJREを同梱)。展開にはdpkg-debが必要です(ほぼすべてのDebian/Ubuntuシステムに標準で含まれています)。root権限やシステムへのインストールは不要です。

既知の制限事項

  • oemer のデフォルト出力では、SATB の声部構造が失われます。 oemer は複数段の合唱譜を同時ではなく順番に読み取るため、4~5 声部の SATB 譜は、声部ごとに <part> が作られるのではなく、複数の譜表が統合された単一の <part> として出力され、音部記号が交互に切り替わります。これは無害なモデリング上の差異ではなく、実際のデータ損失です(生成された MusicXML の確認により検証済み)。また、これは oemer 自体のアーキテクチャに起因します(リズム調整コードでは、同時に扱える譜表トラックは最大 2 つとハードアサートされています。詳しくは docs/HANDOVER.md を参照してください)。複数段の合唱譜には engine="audiveris" を使用してください。実際のフィクスチャでの検証により、声部が同時に演奏される別々のパートとして正しく分離されることを確認済みです。ソース画像には 300 DPI 以上が必要です。

パフォーマンスに関する注意事項

  • 処理時間:モデルのチェックポイントをキャッシュした後の oemer は、CPU で 1 ページあたり約 90~100 秒です。テストでは、audiveris は JVM のサブプロセス起動オーバーヘッドがあるにもかかわらず、1 ページあたり約 7~15 秒でした。
  • どちらのエンジンも、実行ごとに出力が多少変わることがあります。XML が完全に一致することをアサートしないでください。
  • 生成された MusicXML は機能的には正しいものの、厳密なスキーマ検証には合格しない場合があります。

システム要件

  • Python 3.11+
  • システムライブラリは不要です(ONNX Runtime は pip 経由でバンドルされています)

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。